
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:
- Existe uma maneira melhor e mais robusta de criar miniaturas de imagens localizadas em vários subdiretórios?
- 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