4

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

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

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

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

7 ответов7

6

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

# executes `mvn clean install` in any directory where pom.xml was found
find . -name pom.xml -execdir mvn clean install \;
2

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

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

есть также:

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

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

1

Если вам нужно применить свойства 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
0

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

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

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

0

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

Как насчет:

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 {}` \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .