
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:
- ¿Existe una forma mejor y más sólida de crear miniaturas a partir de imágenes ubicadas en varios subdirectorios?
- ¿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