Я действительно погружаюсь в скрипты 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;
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я предоставлю.
Используя 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.