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 -iname
qui est insensible à la casse version de -name
sorte qu'il fonctionne sur .JPG
tout aussi bien que .jpg
.
Cela permet find
d’obtenir la liste de fichiers au lieu de parcourir le shell avec le *.jpg
caractè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, find
gé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 **/*jpg
syntaxe récursive de l'échantillonnage dans zsh.
EDIT: J'ai pensé ajouter une autre fonctionnalité utile à find
laquelle 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 touch
cré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' find
expression 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é find
chaque fois que cela est possible ... il a une expressivité polyvalente tout en restant concis.