Como executar um script bash em vários diretórios?

3

Eu tenho um script conv.sh que faz um loop sobre arquivos MP3 no diretório atual e os converte em OGG. Eu também tenho vários diretórios {F1, F2, ..., F20} em /path/to/Files/ . Como devo executar conv.sh em todos esses diretórios?

    
por supermario 30.01.2013 / 23:03

3 respostas

2

Tente isso

curdir=$(pwd)
for folder in /path/to/Files/*; do 
  [ -d "$folder" ] && cd "$folder" && ./conv.sh
done
cd $curdir

Ou, supondo que você esteja em /path/to/Files/ , isso também funciona

for f in *; do [ -d "$f" ] && cd "$f" && ./conv.sh; done; cd ..

Você pode usar F{1..20} em vez de * para obter mais precisão.

    
por 30.01.2013 / 23:09
2

Tente fazer isso:

./conv.sh /path/to/Files/F[0-9]*/*.mp3

Este comando trata apenas mp3 em pastas começando com F e um número usando globs

    
por 30.01.2013 / 23:06
1

Você pode usar o xargs ou o GNU paralelo:

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  xargs -L conv.sh

ou:

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  parallel conv.sh

Editar - manipular o espaço de maneira sensata

Como observado por Ole, nenhum dos métodos acima tratam o espaço adequadamente, ou seja, dir name seria considerado como dois argumentos separados, o mesmo problema ocorre se o nome do diretório contiver novas linhas.

A melhor maneira de lidar com esses problemas é usar null como delimitador, por exemplo, com o GNU find:

find /path/to/Files -mindepth 1 -maxdepth 1 -type d -regex '.*/F[0-9]*' -print0 |
  parallel -0 conv.sh
    
por 31.01.2013 / 02:17