我真的很不擅长编写 bash 脚本,所以我希望得到你们的帮助。我需要一个脚本,它将循环遍历文件夹 /home/work 内的所有文件夹、子文件夹、子子文件夹等,如果存在文件 Makefile,那么它应该执行命令 make install
文件夹结构是随机的,例如 /home/work
- Dir 1
- - Dir 1.1
- - Dir 1.2
- - - Makefile
- Dir 2
- - Makefile
- Dir 3
- - Dir 3.1
- - Dir 3.2
- - - Dir 3.2.1
- - - Makefile
- - MakeFile
这是我目前所拥有的
for f in /home/work/*;
do
[ -d $f ] && cd "$f" && echo Entering into $f && make install
done;
如果您需要任何其他信息,请告诉我,我会提供。
答案1
使用find
:
find /home/work -type f -name Makefile -execdir make install \;
find
递归搜索名为 ( )/home/work
的文件( ),并在找到该文件的目录中运行( )。-type f
Makefile
-name Makefile
make install
-execdir make install \;
或者,如果您使用 bash,请启用**
(递归):
shopt -s extglob
然后做:
for f in /home/work/**/;
do
[[ -f $f/Makefile ]] && echo Entering into "$f" && make -C "$f" install
done
如果在通配符后面加上斜杠,bash 将只选择目录,因此您可以省去该检查。并且make
有一个在启动前更改目录的选项:-C
。因此,我们cd
也可以避免:
-C dir, --directory=dir
Change to directory dir before reading the makefiles or doing
anything else. If multiple -C options are specified, each is
interpreted relative to the previous one: -C / -C etc is
equivalent to -C /etc. This is typically used with recursive
invocations of make.