Shell Script, iterando sobre uma pasta

2

Eu tenho conhecimento básico de script de shell.

Eu tenho fotos na pasta original em muitas pastas diferentes como esta

folder
  + folder1
    + original
  + folder2
    + original
  + folder3
    + original
  + folder4
    + original

Usando mogrify , estou tentando criar miniaturas em uma pasta thumb seguindo uma estrutura para isso.

folder
  + folder1
    + original
    + thumb
  + folder2
    + original
    + thumb
  + folder3
    + original
    + thumb
  + folder4
    + original
    + thumb

Estou um pouco perdido em como escrever o script de shell que pode ser iterado por ele. Eu estou ok dando mogrify suas configurações, mas eu não entendo como dizer ao script para ir iterar cada pasta para executar o comando mogrify.

    
por Martin 05.07.2012 / 23:43

2 respostas

4

Em vez de usar um loop for, em que você terá problemas se houver espaços em qualquer um dos caminhos de arquivo, poderá usar find para procurar recursivamente em um diretório e executar uma ação em todos os arquivos cujo nome corresponda a um padrão. Se todos os arquivos precisarem ser afetados, apenas deixe de fora a opção -name ou personalize-a para ajustá-la.

find /path/to/directory -type f -name "*.png" -exec mogrify {} +

Para fazer melhor uso das opções do mogrify, você pode usar xargs.

find /path/to/directory -type f -name "*.png" | xargs mogrify -path /path/to/thumbnails
    
por 06.07.2012 / 01:47
1

Tenho certeza de que você verá uma grande variação nas respostas que receberá. Existem mais algumas maneiras de fazer isso. A seguinte abordagem simplesmente usa ls para listar diretórios no diretório atual . Em seguida, ele muda para esse diretório para obter uma lista de arquivos png (modificar para se adequar). Para cada um dos arquivos png, mogrify é chamado.

Basicamente, você precisará

  1. Copie isso para um editor de texto.
  2. Modifique a linha que contém o comando mogrify para se adequar.
  3. Para simplificar, salve-o como um arquivo de texto simples no diretório em que você deseja executá-lo.
  4. Defina o bit de execução para o arquivo com chmod +x /path/to/scriptname
  5. Execute-o no diretório com ./scriptname

Script abaixo:

DIRS="$(find . -mindepth 1 -maxdepth 2 -type d)"

for d in $DIRS
do
    cd $d
    FILES="$(find . -name '*.png')"
    for f in $FILES
    do
    mogrify -path ./thumbnails/ $f
    done
    cd ..
done
    
por 06.07.2012 / 00:46