
Necesito convertir un montón de .rgb
archivos en .png
s (cada archivo debe conservar su nombre original).
Quiero saber cómo convertir el primer archivo y luego envolver el comando en un bucle 'for'.
Esto es lo que tengo hasta ahora:
find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png
Pero esto no funciona.
¿Cómo puedo hacer que el convert
comando reconozca el segundo argumento zzzzz.png
?
Respuesta1
Si desea convertir todos los archivos en el árbol de directorios, ejecutaría:
find . -name '*.rgb' | parallel convert {} {.}.png
Esto se ejecutará en paralelo:
convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png
Aquí uso GNU Parallel para hacer uso de todas tus CPU. Dependiendo de tu sistema puedes instalarlo como un paquete, de lo contrario está aquígnu.org/software/parallel. En Debian es:
apt-get install parallel
Editar:
Aquí hay una solución sin GNU Parallel
:
find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;
y una solución no tan buena usando while..read
:
find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done
Respuesta2
Para convertir (en mi caso cambiar el tamaño) todas las imágenes en un solo directorio que uso
ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}
Tenga en cuenta que el marcador de posición de llaves para el nombre de archivo se puede utilizar dos veces. También puedes usarlo para agregar un prefijo al nombre del archivo de destino.
Para búsqueda recursiva:
find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}
Respuesta3
Encontré la respuesta:
for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it
#in $filename.
'find . -name "*.rgb" | sort | sed -n
\$i\p | xargs -I {} convert {}
\$filename.png'
done