¿Cómo puedo cambiar el tamaño de las imágenes en varios subdirectorios de forma más eficaz?

¿Cómo puedo cambiar el tamaño de las imágenes en varios subdirectorios de forma más eficaz?

Tengo las imágenes originales en una estructura de directorios similar a esta:

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

Quería convertir todas las imágenes originales en miniaturas para poder mostrarlas en un sitio web. Después de investigar un poco/experimentar, se me ocurrió el siguiente comando de Linux:

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

Encuentra de forma recursiva todas las imágenes jpg en mis subdirectorios, les elimina el tipo de archivo (.jpg) para poder cambiarles el nombre más tarde, luego las convierte en una miniatura y les cambia el nombre con '-small' añadido antes del tipo de archivo.

Funcionó para mis propósitos, pero es un poco complicado y no es muy robusto. Por ejemplo, no estoy seguro de cómo insertaría 'pequeño-' al principio del nombre del archivo (por lo tanto, ./Alabama/small-1.jpg).

Preguntas:

  1. ¿Existe una forma mejor y más sólida de crear miniaturas a partir de imágenes ubicadas en varios subdirectorios?
  2. ¿Puedo hacer que el comando existente sea más robusto (por ejemplo, pero usando sed para cambiar el nombre de la miniatura generada antes de guardarla, básicamente modificar la parte Y-small.jpg)?

Respuesta1

Si siempre hay solo un nivel de directorios debajo de su posición, puede intentar realizar un bucle de esta manera:

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

información relacionada