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 -iname
cuál es la versión sin distinción entre mayúsculas y minúsculas , -name
por lo que funcionará .JPG
tan bien como .jpg
.
Esto se usa find
para obtener la lista de archivos en lugar de la aplicación de shell con el *.jpg
comodí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, find
manejará subdirectorios, mientras que el bloqueo de shell no lo hará a menos que tenga características específicas de shell como la **/*jpg
sintaxis de bloqueo recurrente en zsh.
EDITAR: pensé que agregaría otra característica útil find
que 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 touch
crear 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 timestamp
a la find
expresió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 find
siempre que sea posible ... tiene una expresividad versátil a la vez que es conciso.