Repetir todas as pastas recursivamente finalizar executar comando quando o Makefile presente

1

Eu realmente sou péssimo em scripts de bash, então estou esperando por sua ajuda pessoal. Eu preciso de um script que faça um loop por todas as pastas, subpastas, sub-pastas, etc. dentro da pasta / home / work e se houver arquivo Makefile, execute o comando make install

A estrutura de pastas é aleatória, por exemplo, / 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

Isso é o que eu tenho até agora

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

Se você precisar de alguma informação adicional, por favor me avise e eu fornecerei.

    
por Davor Bramor Pečnik 31.05.2016 / 11:38

1 resposta

3

Usando find :

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

find recursivamente pesquisa /home/work para arquivos ( -type f ) denominados Makefile ( -name Makefile ) e executa make install no diretório em que o arquivo foi encontrado ( -execdir make install \; ).

Como alternativa, se você estiver usando o bash, ative o ** (que é recursivo):

shopt -s extglob

Então faça:

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

Com uma barra final após o caractere curinga, o bash selecionará apenas os diretórios, para que você possa eliminar essa verificação. E make tem uma opção para alterar os diretórios antes de iniciar: -C . Então, podemos evitar o cd também:

-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.
    
por muru 31.05.2016 / 11:43