Ось спосіб, який поєднує найкраще з вищезазначених пропозицій у простий, ефективний, надійний командний рядок:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Він добре працює з іменами, які починаються з -пробілів або містять їх. Зауважте, використання -inameяких є нечутливою до регістру версією, -nameтому вона буде працювати .JPGтак само добре .jpg.
Це використовується findдля отримання списку файлів замість обшивки оболонки з *.jpgпідстановкою, що може призвести до помилки "Аргумент занадто довгий" у деяких системах. Хоча як в коментарі вказує @enzotib, поведінка використання глобулінгу в циклі for for відрізняється від аргументів команди .
Крім того, findбуде оброблено підкаталоги, тоді як глобальна оболонка не буде, якщо у вас не буде специфічних для оболонки функцій, таких як **/*jpgрекурсивний синтаксис глобалізації в zsh.
EDIT: Я думав, що я додам ще одну корисну особливість, про 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коли це можливо ... він має універсальну виразність, залишаючись лаконічним.