![UNIX 查找包含特定文件(pom.xml)的目录,然后在该目录中执行命令](https://linux22.com/image/1233157/UNIX%20%E6%9F%A5%E6%89%BE%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%EF%BC%88pom.xml%EF%BC%89%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%8C%E7%84%B6%E5%90%8E%E5%9C%A8%E8%AF%A5%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
我想从根目录中找到包含特定文件名 (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 {}` \;