Dưới đây là cách kết hợp những gợi ý tốt nhất ở trên thành một dòng lệnh đơn giản, hiệu quả, mạnh mẽ:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Nó hoạt động tốt với tên tệp bắt đầu bằng một -hoặc chứa khoảng trắng. Lưu ý việc sử dụng -inameđó là case-insensitive phiên bản -namevì vậy nó sẽ làm việc trên .JPGchỉ cũng như .jpg.
Điều này sử dụng findđể có được danh sách tệp thay vì shell toàn cầu bằng *.jpgký tự đại diện có thể dẫn đến lỗi list Danh sách đối số quá dài ' trên một số hệ thống. Mặc dù như @enzotib chỉ ra trong một nhận xét, hành vi sử dụng Globing trong một vòng lặp for khác với các đối số của lệnh .
Ngoài ra, findsẽ xử lý các thư mục con, trong khi shell shellbing sẽ không trừ khi bạn có các tính năng dành riêng cho shell như **/*jpgcú pháp tạo khối đệ quy trong zsh.
EDIT: Tôi nghĩ rằng tôi sẽ thêm một tính năng hữu ích khác findmà tôi nghĩ đến sau khi đọc một bình luận của @IlmariKaronen về việc chạy lại lệnh và chỉ chuyển đổi các tệp đã thay đổi kể từ lần chạy đầu tiên.
Ở lượt đi đầu tiên, bạn có thể tạo touchtệp dấu thời gian sau khi quá trình chuyển đổi kết thúc.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Sau đó thêm -newer timestampvào findbiểu thức để hoạt động trên tập hợp con của các tệp có thời gian được sửa đổi lần cuối mới hơn tệp dấu thời gian. Tiếp tục cập nhật tệp dấu thời gian sau mỗi lần chạy.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Đây là một cách dễ dàng để tránh phải dùng đến Makefile (trừ khi bạn đã sử dụng nó) và đó là một lý do chính đáng khác tại sao nó đáng để sử dụng findbất cứ khi nào có thể ... nó có tính biểu cảm linh hoạt trong khi vẫn ngắn gọn.