查找文件所在的所有目录,以便该文件包含搜索字符串

时间:2012-02-13 03:15:35

标签: ant

我有一个目录树需要按如下方式处理:

  • 我有一个需要复制到少数几个子目录的文件
  • 感兴趣的子目录是一个包含我可以在其中正则表达式匹配已知搜索字符串的文件的目录

理想情况下,我想:

  • 对目录中的所有文件执行正则表达式匹配
  • 如果正则表达式匹配,请将文件复制到该目录

麻烦的是我对ANT很陌生,而且我很难找到自己的方式。我在基于正则表达式搜索的每个目录操作的文档中找不到任何任务。我发现的最接近的是正则表达式替换任务(< replaceregexp> ),可以跨文件搜索和替换模式。

这甚至可能吗?我真的很感激开始使用的样本。我为请求代码道歉 - 我根本不知道如何开始组合任务来实现这一目标。

或者,我可以选择对每个目录的所有复制操作进行硬编码,但这意味着在项目增长时手动保持所有内容同步。理想情况下,我想根据我描述的正则表达式搜索/复制方法自动化它。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的要求有点不合标准,所以我使用自定义Groovy task解决了这个问题。

这是一个有效的例子:

<project name="find-files" default="copy-files">

    <!--
    ======================
    Groovy task dependency
    ======================
    -->
    <path id="build.path">
        <pathelement location="jars/groovy-all-1.8.6.jar"/>
    </path>
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>


    <!--
    =========================
    Search for matching files
    =========================
    -->
    <target name="search-files">
        <fileset id="filesContainingSearchString" dir="src">
            <include name="**/*.txt"/>
            <containsregexp expression="[4-6]\.[0-9]"/>
        </fileset>
    </target>

    <!--
    ===================================
    Copy file into each directory found
    ===================================
    -->
    <target name="copy-files" depends="search-files">
        <groovy>
        project.references.filesContainingSearchString.each { file ->
            def dir = new File(file.toString()).parent

            ant.copy(file:"fileToBeCopied.txt", toDir:dir)
        }
        </groovy>
    </target>

</project>

备注:

答案 1 :(得分:0)

将复制任务与文件集和正则表达式选择器一起使用:

 <copy todir="your/target/dir">
  <fileset dir="rootdir/of/your/directorytree" includes="**/*.txt">
   <containsregexp expression="[4-6]\.[0-9]"/>
  </fileset>
 </copy>

这个例子是taken from the ant manual并略微适应 意味着选择扩展名为.txt的所有文件,除了rootdir / of / your / directorytree以外的任何一个与正则表达式匹配的文件(有一个4,5或6后跟一个句点和一个0到9之间的数字)并将它们复制到你的/ target / DIR。
只需根据您的需求进行调整。