Como posso redimensionar imagens em vários subdiretórios de forma mais eficaz?

Como posso redimensionar imagens em vários subdiretórios de forma mais eficaz?

Eu tenho as imagens originais em uma estrutura de diretórios parecida com esta:

./Alabama/1.jpg
./Alabama/2.jpg
./Alabama/3.jpg
./Alaska/1.jpg
...the rest of the states...

Eu queria converter todas as imagens originais em miniaturas para poder exibi-las em um site. Depois de pesquisar/experimentar um pouco, descobri o seguinte comando do Linux:

find . -type f -iname '*.jpg' | sed -e 's/\.jpg$//' | xargs -I Y convert Y.jpg -thumbnail x100\> Y-small.jpg

Ele encontra recursivamente todas as imagens jpg em meus subdiretórios, remove o tipo de arquivo (.jpg) delas para que eu possa renomeá-las mais tarde, depois as transforma em uma miniatura e as renomeia com '-small' anexado antes do tipo de arquivo.

Funcionou para meus propósitos, mas é um pouco complicado e não é muito robusto. Por exemplo, não tenho certeza de como inseriria 'small-' no início do nome do arquivo (então ./Alabama/small-1.jpg).

Questões:

  1. Existe uma maneira melhor e mais robusta de criar miniaturas de imagens localizadas em vários subdiretórios?
  2. Posso tornar o comando existente mais robusto (por exemplo, mas usando sed para renomear a miniatura gerada antes de ser salva - basicamente modificar a parte Y-small.jpg).

Responder1

Se houver sempre apenas um nível de diretórios abaixo da sua posição, você pode tentar fazer um loop desta forma:

for dir in *; do
  [ ! -d "$dir" ] && continue; # skip non-directory entries, i.e. additional files
  cd "$dir"
  for file in *.jpg; do
    convert -thumbnail x100 "$file" "small-${file}" # creates e.g. small-1.jpg
  done
done

informação relacionada