Voici un moyen de combiner le meilleur des suggestions ci-dessus en une ligne de commande simple, efficace et robuste:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Cela fonctionne très bien avec les noms de fichiers qui commencent par un -ou contiennent des espaces. Notez l'utilisation -inamequi est insensible à la casse version de -namesorte qu'il fonctionne sur .JPGtout aussi bien que .jpg.
Cela permet findd’obtenir la liste de fichiers au lieu de parcourir le shell avec le *.jpgcaractère générique, ce qui peut entraîner une erreur «Liste d’arguments trop longue» sur certains systèmes. Bien que @enzotib pointe dans un commentaire, l'utilisation de la suppression dans une boucle for diffère de celle utilisée pour les arguments d'une commande .
De plus, findgérera les sous-répertoires, alors que l'éclatement du shell ne le sera pas, à moins que vous n'ayez des fonctionnalités spécifiques à celui-ci, comme la **/*jpgsyntaxe récursive de l'échantillonnage dans zsh.
EDIT: J'ai pensé ajouter une autre fonctionnalité utile à findlaquelle j'avais pensé après avoir lu un commentaire de @IlmariKaronen à propos de la réexécution de la commande et de la conversion uniquement des fichiers modifiés depuis la première exécution.
Au premier passage, vous pouvez touchcréer un fichier d’horodatage une fois la conversion terminée.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Ajoutez ensuite -newer timestampà l' findexpression pour agir sur le sous-ensemble de fichiers dont l'heure de dernière modification est plus récente que le fichier d'horodatage. Continuez à mettre à jour le fichier d'horodatage après chaque exécution.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
C'est un moyen facile d'éviter de devoir recourir à un Makefile (sauf si vous en utilisez déjà un) et c'est une autre bonne raison pour laquelle il vaut la peine d'être utilisé findchaque fois que cela est possible ... il a une expressivité polyvalente tout en restant concis.