Вот способ, который объединяет лучшие из приведенных выше предложений в простую, эффективную и надежную командную строку:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Он отлично работает с именами файлов, которые начинаются с -
или содержат пробелы. Обратите внимание, использование -iname
которого является регистронезависимой версией, -name
поэтому она будет работать .JPG
так же хорошо, как и .jpg
.
Он используется find
для получения списка файлов вместо оболочки с использованием *.jpg
подстановочного знака, что может привести к ошибке «Список аргументов слишком длинный» в некоторых системах. Хотя, как указывает @enzotib в комментарии, поведение использования globbing в цикле for отличается от поведения аргументов команды .
Кроме того, он find
будет обрабатывать подкаталоги, в то время как глобальное копирование оболочки не будет происходить, если только у вас не появятся специфические для оболочки функции, такие как **/*jpg
синтаксис рекурсивного глобирования в zsh.
РЕДАКТИРОВАТЬ: Я подумал, что добавлю еще одну полезную функцию, о find
которой я подумал после прочтения комментария @IlmariKaronen о повторном запуске команды и преобразовании только тех файлов, которые изменились с первого запуска.
На первом проходе вы можете touch
получить файл метки времени после того, как преобразование будет завершено.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Затем добавьте -newer timestamp
к find
выражению для работы с подмножеством файлов, время последнего изменения которых новее, чем у файла отметки времени. Продолжайте обновлять файл меток времени после каждого запуска.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Это простой способ избежать необходимости прибегать к Makefile (если вы его еще не используете), и это еще одна веская причина, по которой его стоит использовать, find
когда это возможно ... он обладает универсальной выразительностью при сохранении краткости.