bash," make clean"在所有子目录中

时间:2015-11-11 12:01:06

标签: bash

如何在当前路径和子目录中找到每个Makefile文件,并在每次出现时运行make clean命令。

我到现在为止(不起作用)是这样的:

find . -type f -name 'Makefile' 2>/dev/null | sed 's@/Makefile@@' | xargs -I% cd % && make clean && cd -

另一种选择是将find-execdir一起使用,但这会让我遇到$PATH的问题:The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find .... 但我不想更改$PATH变量。

使用我使用的工具回答会有所帮助,这样我才能理解我做错了什么, 但任何可行的答案都是可以接受的。

3 个答案:

答案 0 :(得分:2)

如果您想使用find的执行功能,您仍然可以执行此操作:

 find "${PWD}" -name Makefile -exec sh -c 'cd "${0%Makefile}" && make clean' {} \;

答案 1 :(得分:2)

当然,find是一个选择..我的方法更像是:

find . -name Makefile -exec bash -c 'make -C "${1%/*}" clean' -- {} \;

但是既然你正在使用bash,如果你在bash 4中,你也可以使用globstar。

shopt -s globstar
for f in **/Makefile; do make -C "${f%/*}" clean; done

答案 2 :(得分:1)

我会使用以下方法:

%

请注意find "$(pwd)" -name Makefile | while read -r line; do cd "$(dirname "$line")" && make clean; done ,它将完整路径作为find $(pwd)的输出。