要在文件集中搜索多个“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,我需要出现的次数。回声消息“Found ...”仅给出了第一个结果,更糟糕的是,它为所有文件重复该数字。
试图在resourcecount块中添加一个echo,但是失败了。
如何修改以获取所有searchStrings的列表?
答案 0 :(得分: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
<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>
hello
world
test
虚拟数据文件:
$ cat src/test1.xul
hello world test
$ cat src/test2.xul
hello world
$ cat src/test3.xul
hello
要使用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>
注意:
可以轻松增强解决方案,将搜索结果写入文件:
<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非常强大。