Execute o comando recursivamente por meio de subdiretórios

4

Estou tentando converter várias imagens em miniaturas que podem estar em vários subdiretórios e salvar uma cópia da imagem como uma miniatura dentro do subdiretório, mas não consigo descobrir a sintaxe. Qualquer conselho seria bem vindo.

convert test/*/*.jpg -50x50 test/*/*_thumb.jpg
    
por Rilcon42 29.03.2017 / 15:25

2 respostas

4

Você deve usar a localização para encontrar todos os arquivos necessários.

find test -iname *.jpg -exec convert {} -resize 50x50 {}_thumb \;

Em seguida, você deve renomear os arquivos com o nome * .jpg_thumb para * _thumb.jpg usando:

find -name *.jpg_thumb -exec rename -e 's/^(.*)(.jpg)(_thumb)$//' '{}' \;

Observe que -50x50 não é um parâmetro legal para conversão. Você deve usar o parâmetro -resize com o valor 50x50 , como no exemplo acima.

    
por Kamil 29.03.2017 / 15:39
2

Um loop de shell também deve fazer:

for file in test/*/*.jpg ; do
    new=${file%.jpg}_thumb.jpg 
    convert "$file" -resize 50x50 "$new"
done

Ou com globstar do Bash, o que é melhor se os arquivos puderem estar em níveis de diretório arbitrários:

shopt -s globstar
for file in test/**/*.jpg ; do ...

${file%.jpg} aceita o valor da variável file e remove a string .jpg do final. (consulte BashGuide sobre expansões de parâmetros )

    
por ilkkachu 29.03.2017 / 15:49

Tags