UNIX 查找包含特定文件(pom.xml)的目录,然后在该目录中执行命令

UNIX 查找包含特定文件(pom.xml)的目录,然后在该目录中执行命令

我想从根目录中找到包含特定文件名 (pom.xml) 的所有目录,然后 cd 到该目录并执行命令。我可以在脚本中执行此操作,但我希望使用单行命令执行此操作。

到目前为止

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

这给出了我需要的目录...现在我需要进入每个目录并执行我的命令

答案1

find 有 -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

如果您对目录名中嵌入的换行符感到疑惑(说真的,人们怎么了?),您可以在 printf 中使用“\0”,然后使用它xargs来运行命令:

find . -name pom.xml -printf '%h\0' | xargs -0 -L 1 sh -c 'dir="$0"; cd "$dir"; command ...'

答案3

还有:

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

但是,我认为您应该查看可用的 Maven 选项来执行此操作。虽然它在 Maven 3.x 中不再存在,但 Maven 2.x 具有-r执行此操作的选项。更好的方法是创建一个pom.xml包含所需文件作为模块的聚合,然后您可以使用-rf-pl有选择地选择要构建的文件。

答案4

怎么样:

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

相关内容