Aquí hay una manera que combina las mejores sugerencias anteriores en una línea de comando simple, eficiente y robusta:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Funciona bien con nombres de archivo que comienzan con -o contienen espacios. Tenga en cuenta el uso de -inamecuál es la versión sin distinción entre mayúsculas y minúsculas , -namepor lo que funcionará .JPGtan bien como .jpg.
Esto se usa findpara obtener la lista de archivos en lugar de la aplicación de shell con el *.jpgcomodín, lo que puede dar como resultado un error de "Lista de argumentos demasiado larga" en algunos sistemas. Aunque como @enzotib señala en un comentario, el comportamiento de usar globbing en un bucle for es diferente al de los argumentos de un comando .
Además, findmanejará subdirectorios, mientras que el bloqueo de shell no lo hará a menos que tenga características específicas de shell como la **/*jpgsintaxis de bloqueo recurrente en zsh.
EDITAR: pensé que agregaría otra característica útil findque pensé después de leer un comentario de @IlmariKaronen sobre volver a ejecutar el comando y solo convertir archivos que han cambiado desde la primera ejecución.
En la primera pasada, puede touchcrear un archivo de marca de tiempo después de que finalice la conversión.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Luego agregue -newer timestampa la findexpresión para operar en el subconjunto de archivos cuya hora de última modificación es más nueva que el archivo de marca de tiempo. Continúe actualizando el archivo de marca de tiempo después de cada ejecución.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Esta es una manera fácil de evitar tener que recurrir a un Makefile (a menos que ya esté usando uno) y es otra buena razón por la que vale la pena usarlo findsiempre que sea posible ... tiene una expresividad versátil a la vez que es conciso.