Exec cho phép chúng ta vượt qua tất cả các đối số cùng một lúc {} +
hoặc vượt qua từng đối số một{} \;
Bây giờ hãy nói rằng tôi muốn đổi tên tất cả jpeg , không có vấn đề gì khi làm điều này:
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec mv '{}' '{}'.new \;
Nhưng nếu tôi cần chuyển hướng đầu ra, '{}'
không thể truy cập sau khi chuyển hướng.
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec cjpeg -quality 80 '{}' > optimized_'{}' \;
Điều này sẽ không làm việc. Tôi phải sử dụng một vòng lặp for, lưu trữ đầu ra của find thành một biến trước khi sử dụng nó. Hãy thừa nhận nó, nó cồng kềnh.
for f in `find . \( -name '*.jpg' -o -name '*.jpeg' \)`; do cjpeg -quality 80 $f > optimized_$f; done;
Vậy có cách nào tốt hơn không?
{}
xuất hiện trong một chuỗi dài hơn vì các chuỗi như vậy thường không được mở rộng.
find
, một lần và áp dụng cho find
chính lệnh đó. Không {}
có ý nghĩa đặc biệt trong bối cảnh đó. Chuyển hướng không phải là một đối số find
và chắc chắn nó không phải là một phần của -exec
mệnh đề.
>
thiếu trong mẫu mã thứ ba?