Найти все каталоги, в которых существует файл, такой, что файл содержит строку поиска
У меня есть дерево каталогов, которое мне нужно обработать следующим образом:
- У меня есть определенный файл, который необходимо скопировать в несколько подкаталогов
- Подкаталог представляет интерес тот, который содержит файл, в котором я могу регулярное выражение сопоставить известную строку поиска
В идеале я хотел бы:
- Выполните сопоставление регулярных выражений для всех файлов в каталоге
- Если регулярное выражение совпадает, скопируйте файл в этот каталог
Проблема в том, что я совсем новичок в 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>
Заметки:
- Groovy jar можно скачать с Maven Central
Используйте задачу копирования с набором файлов и селектором регулярных выражений:
<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/ реж.
Просто адаптируйте его под свои нужды.