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

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

пока у меня есть

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

Это дает нужную мне директорию... теперь мне нужно перейти в каждую и выполнить мою команду

7 ответов

Найти имеет -exec и -execdir. Для сборки Maven, вы бы сделали

# 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 ...'

Если вам нужно применить свойства 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 в другом месте, и он не меняет рабочий каталог, из которого выполняется команда svn. Для других целей используйте

find -name -execdir

Есть также:

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

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

Для поиска уникальных папок, содержащих данный тип файла, вы можете использовать:

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

Это перечислит все уникальные каталоги, включая файлы PNG.

Вы могли бы использовать 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.

Как насчет:

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 {}` \;
Другие вопросы по тегам