循环遍历所有文件夹,当 Makefile 存在时结束执行 make 命令

循环遍历所有文件夹,当 Makefile 存在时结束执行 make 命令

我真的很不擅长编写 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 fMakefile-name Makefilemake 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.

相关内容