Найти все каталоги, в которых существует файл, такой, что файл содержит строку поиска

У меня есть дерево каталогов, которое мне нужно обработать следующим образом:

  • У меня есть определенный файл, который необходимо скопировать в несколько подкаталогов
  • Подкаталог представляет интерес тот, который содержит файл, в котором я могу регулярное выражение сопоставить известную строку поиска

В идеале я хотел бы:

  • Выполните сопоставление регулярных выражений для всех файлов в каталоге
  • Если регулярное выражение совпадает, скопируйте файл в этот каталог

Проблема в том, что я совсем новичок в ANT, и мне трудно найти дорогу. Я не могу найти какие-либо задачи в документации по операциям с каталогами на основе поиска по регулярным выражениям. Самая близкая вещь, которую я нашел, это задача замены регулярных выражений (), которая может искать и заменять шаблоны в файлах.

Это вообще возможно? Я действительно ценю образец, с которого можно начать. Я прошу прощения за запрос кода - я просто не знаю, как начать составлять задачи вместе, чтобы достичь этого.

В качестве альтернативы, у меня есть опция жесткого кодирования всех операций копирования для каждого каталога, но это будет означать, что все данные будут синхронизированы вручную по мере роста моего проекта. В идеале я хотел бы автоматизировать его на основе описанного мной подхода поиска / копирования регулярных выражений.

Спасибо!

2 ответа

Решение

Ваше требование немного нестандартно, поэтому я решил его с помощью пользовательской задачи Groovy.

Вот рабочий пример:

<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>

Заметки:

Используйте задачу копирования с набором файлов и селектором регулярных выражений:

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

Этот пример взят из руководства муравья и немного адаптирован.
Означает выбрать все файлы с расширением.txt в любом месте, кроме rootdir / of / your / directorytree, которые соответствуют регулярному выражению (имеют 4,5 или 6, за которым следует точка и число от 0 до 9), и скопировать их в вашу /target/ реж.
Просто адаптируйте его под свои нужды.

Другие вопросы по тегам