Цикл по всем папкам рекурсивно завершает выполнение команды make, когда присутствует Makefile

Я действительно погружаюсь в скрипты 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
задан 31 May 2016 в 22:38

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 \;).

, С другой стороны, при использовании удара включите ** (который является рекурсивным):

shopt -s extglob

Затем сделайте:

for f in /home/work/**/;
do
     [[ -f $f/Makefile ]] && echo Entering into "$f" && make -C "$f" install
done

С запаздывающей наклонной чертой после подстановочного знака, удар только выберет каталоги, таким образом, можно будет устранить ту проверку. И 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.
3
ответ дан 31 May 2016 в 22:38

Другие вопросы по тегам:

Похожие вопросы: