0

要在文件集中搜索多个“searchStrings”,下面的 ANT 似乎可以完成这项工作。

  <taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
      <pathelement location="/usr/share/java/ant-contrib.jar"/>
    </classpath>
  </taskdef>

  <loadfile property="list"  srcFile="searchStrings.txt"/>
  <echo>.:${list}:.</echo>

  <target name="main">
    <for list="${list}" param="search4"  delimiter="${line.separator}">

      <sequential>

        <fileset id="existing" dir="../src">
          <patternset id="files">
            <include name="**/*.xul"/>
          </patternset>
        </fileset>

        <resourcecount property="count">
          <fileset id="matches" dir="../src">
            <patternset refid="files" />
            <contains text="@{search4};" />
          </fileset>
        </resourcecount>

        <echo message="Found '@{search4}' in files : '${count}'"/>
      </sequential>

    </for>
  </target>

但是对于每个单独的 searchString 我需要出现的次数。回显消息“找到...”只给出第一个结果,更糟糕的是,它对所有文件重复该数字。

尝试在 resourcecount 块内添加回声,但失败了。

如何修改它以获取所有 searchStrings 的列表?

4

1 回答 1

1

ANT 不是脚本语言,我建议嵌入groovy 之类的东西

例子

此示例计算搜索词的出现次数,存储在“searchStrings.txt”文件中,包含存储在“src”目录下的文件。

├── build.xml
├── searchStrings.txt
└── src
    ├── test1.xul
    ├── test2.xul
    └── test3.xul

运行如下

$ ant

search:
   [groovy] Found hello in files : 3
   [groovy] Found world in files : 2
   [groovy] Found test in files : 1

构建.xml

<project name="demo" default="search">

   <target name="bootstrap" description="Used to install the ivy task jar">
      <mkdir dir="${user.home}/.ant/lib"/>
      <get dest="${user.home}/.ant/lib/groovy-all.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.9/groovy-all-2.1.9.jar"/>
   </target>

   <target name="search">
      <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>

      <fileset id="existing" dir="src" includes="**/*.xul"/>

      <groovy>
         new File("searchStrings.txt").eachLine { term ->
            def files = project.references.existing.findAll{
               new File(it.toString()).text.contains(term)
            } 
            println "Found ${term} in files : ${files.size}"
         }
      </groovy>
   </target>

</project>

搜索字符串.txt

hello
world
test

src/test*.xul

虚拟数据文件:

$ cat src/test1.xul
hello world test

$ cat src/test2.xul
hello world

$ cat src/test3.xul
hello

更新 1

为了让这个在 Eclipse 中工作,改变 taskdef 以包含下载的“groovy-all.jar”的路径。

  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
     <classpath>
        <fileset dir="${user.home}/.ant/lib" includes="*.jar"/>
     </classpath>
  </taskdef>

笔记:

  • 此解决方案不需要“ant-contrib”。使用嵌入式 groovy,您将拥有更大的灵活性。

更新 2:

该解决方案可以轻松增强以将搜索结果写入文件:

<groovy>
  new File("searchResults.txt").withWriter { writer ->
    new File("searchStrings.txt").eachLine { term ->
      def files = project.references.existing.findAll{
        new File(it.toString()).text.contains(term)
      }
      writer.println "Found ${term} in files : ${files.size}"
    }
  }
</groovy>

Groovy 很强大。

于 2013-11-04T00:50:02.847 回答