Como executar um comando em todas as subpastas

4

Se você tiver uma série de subpastas (como de a to z ) e quiser executar um comando em cada uma delas (como dsmmigrate * & ), como você faz isso? A abordagem manual seria,

cd a 
dsmmigrate * &
cd ../b

Isso parece muito complicado, então acredito que deve haver uma abordagem mais fácil.

    
por SuperKing 08.07.2016 / 05:40

2 respostas

5

Sim, alterar o diretório de trabalho é complicado e não exatamente o que você gostaria de fazer, pois pode levar a situações extremamente estranhas em scripts mais complexos, a menos que você seja cuidadoso.

O método usual para alterar o diretório de trabalho de um comando simples é colocar o cd e a invocação do comando em um sub-shell. O diretório de trabalho será alterado para o sub-shell, mas a mudança não será transferida para o restante do script, pois o sub-shell está sendo executado em seu próprio ambiente.

Exemplo: Executando mycommand dentro de todos os diretórios no diretório de trabalho atual:

for d in *; do
  if [ -d "$d" ]; then         # or:  if test -d "$d"; then
    ( cd "$d" && mycommand )
  fi
done

ou no seu caso, com diretórios conhecidos a e b :

for d in a b; do
  ( cd "$d" && dsmmigrate * & )
done

Não conheço a ferramenta dsmmigrate , por isso não posso dizer se a execução desta maneira é correta ou não.

EDITAR: Acontece que o dsmmigrate tool tem um sinalizador -Recursive :

$ dsmmigrate -Recursive /path
    
por 08.07.2016 / 10:22
3

Você pode fazer o seguinte, quando seu diretório atual for parent_directory :

for d in [a-z]
do
    ( cd $d && your-command-here )
done

O ( e o ) criam um subshell, portanto, o diretório atual não é alterado no script principal.

    
por 08.07.2016 / 06:05