Я хочу, от корневого каталога, найти всех директоров, которые содержат определенное имя файла (pom.xml), затем CD к тому dir и выполняют команду. Я могу сделать это в сценарии, но я надеялся сделать это с однострочной командой.
до сих пор я имею
find . -type f -name 'pom.xml' |sed 's#\(.*\)/.*#\1#'
Это дает директорам, в которых я нуждаюсь... теперь, я нуждаюсь к CD в каждого и выполняю свою команду
найдите имеет - должностное лицо и-execdir. Для сборки знатока Вы сделали бы
# executes `mvn clean install` in any directory where pom.xml was found
find . -name pom.xml -execdir mvn clean install \;
Это найдет каталоги:
find . -name pom.xml -printf '%h\n'
затем Вы могли прочитать каталоги и выполнить Вашу команду:
find . -name pom.xml -printf '%h\n' | while read dir; do ( cd "$dir"; command ... ) done
Если Вы параноики о встроенных новых строках в именах каталогов (и серьезно, что случилось с людьми?) можно использовать "\0" в printf и затем использовать xargs
выполнять команду:
find . -name pom.xml -printf '%h\0' | xargs -0 -L 1 sh -c 'dir="$0"; cd "$dir"; command ...'
существует также:
find . -type f -exec mvn -f {} clean install \;
Однако я думаю, что необходимо смотреть на доступные опции Maven сделать это. В то время как это больше не присутствует в Знатоке 3.x, Знаток 2.x имеет -r
опция, которая делает точно это. Лучший путь состоит в том, чтобы создать агрегацию pom.xml
это содержит желаемые файлы как модули, и можно затем использовать -rf
и -pl
выборочно выбрать, чтобы создать.
Вы могли использовать xargs
:
xargs -- construct argument list(s) and execute utility
РЕЗЮМЕ
xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]]
ОПИСАНИЕ
The xargs utility reads space, tab, newline and end-of-file delimited strings from the standard input and executes utility with the strings as arguments. Any arguments specified on the command line are given to utility upon each invocation, followed by some number of the arguments read from the standard input of xargs. The utility is repeatedly executed until stan- dard input is exhausted.
Если то, что Вы хотите, должно применить svnignore свойства на основе файла, из которого Вы не знаете полного пути, который Вы могли использовать:
#!/bin/sh
find -name pom.xml -execdir pwd \; | while read project_dir
do
svn propset svn:ignore -F support-tools/svn/svnignore.cfg $project_dir
done
Я использую этого в своих текущих проектах, поскольку у каждого разработчика есть svn контроль на различном местоположении, и он не изменяет рабочий dir, от которого можно выполнить команду svn. Для другого использования целей
find -name -execdir
Как насчет:
find / -type f -name 'pom.xml' -print | while read FILE; do cd `dirname ${FILE}` && /run/my/script; done
Если можно изменить сценарий так, чтобы он взял каталог в качестве аргумента затем, следующее должно работать:
find / -type f -name 'pom.xml' -exec /run/my/script `dirname {}` \;