¿Cómo utilizar 'convertir' y 'xargs' juntos?

¿Cómo utilizar 'convertir' y 'xargs' juntos?

Necesito convertir un montón de .rgbarchivos en .pngs (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 convertcomando 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

información relacionada