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 -name
vì vậy nó sẽ làm việc trên .JPG
chỉ 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 *.jpg
ký 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, find
sẽ 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ư **/*jpg
cú 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 find
mà 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 touch
tệ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 timestamp
vào find
biể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 find
bấ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.