web-dev-qa-db-fra.com

La boucle passe tous les dossiers de manière récursive et exécute la commande make make lorsque le fichier Makefile est présent.

J'adore vraiment les scripts Bash, alors j'espère que vous les aiderez. J'ai besoin d'un script qui va parcourir tous les dossiers, sous-dossiers, sous-dossiers, etc. à l'intérieur du dossier/home/work et s'il y a un fichier Makefile présent, il devrait exécuter la commande make install

La structure des dossiers est aléatoire, par exemple/maison/travail

 - 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

C'est ce que j'ai jusqu'ici

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

Si vous avez besoin d'informations supplémentaires, merci de me le faire savoir et je vous fournirai.

1

Utiliser find:

_find /home/work -type f -name Makefile -execdir make install \;
_

find recherche récursivement _/home/work_ pour les fichiers (_-type f_) nommé Makefile (_-name Makefile_) et exécute _make install_ dans le répertoire où le fichier a été trouvé ( _-execdir make install \;_).

Si vous utilisez bash, vous pouvez également activer _**_ (qui est récursif):

_shopt -s extglob
_

Alors fais:

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

Avec une barre oblique après le caractère générique, bash ne sélectionnera que les répertoires afin que vous puissiez éliminer cette vérification. Et make a une option pour changer de répertoire avant de commencer: -C . Ainsi, nous pouvons également éviter la 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
muru