UNIX находит директоров, которые содержат конкретный файл (pom.xml), затем выполняют команду в том dir

Я хочу, от корневого каталога, найти всех директоров, которые содержат определенное имя файла (pom.xml), затем CD к тому dir и выполняют команду. Я могу сделать это в сценарии, но я надеялся сделать это с однострочной командой.

до сих пор я имею

find . -type f -name 'pom.xml' |sed 's#\(.*\)/.*#\1#'

Это дает директорам, в которых я нуждаюсь... теперь, я нуждаюсь к CD в каждого и выполняю свою команду

4
задан 09.03.2010, 16:34

6 ответов

найдите имеет - должностное лицо и-execdir. Для сборки знатока Вы сделали бы

# executes `mvn clean install` in any directory where pom.xml was found
find . -name pom.xml -execdir mvn clean install \;
6
ответ дан 07.12.2019, 19:25

Это найдет каталоги:

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 ...'
2
ответ дан 07.12.2019, 19:25

существует также:

find . -type f -exec mvn -f {} clean install \;

Однако я думаю, что необходимо смотреть на доступные опции Maven сделать это. В то время как это больше не присутствует в Знатоке 3.x, Знаток 2.x имеет -r опция, которая делает точно это. Лучший путь состоит в том, чтобы создать агрегацию pom.xml это содержит желаемые файлы как модули, и можно затем использовать -rf и -pl выборочно выбрать, чтобы создать.

1
ответ дан 07.12.2019, 19:25

Вы могли использовать 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.
0
ответ дан 07.12.2019, 19:25

Если то, что Вы хотите, должно применить 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
1
ответ дан 07.12.2019, 19:25

Как насчет:

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 {}` \;
0
ответ дан 07.12.2019, 19:25

Теги

Похожие вопросы