Cú pháp là:
find ... -exec cmd {} +
find
sẽ tìm thấy một số tệp dựa trên các tiêu chí trong ...
và chạy cmd
với danh sách các đường dẫn tệp đó dưới dạng đối số, càng nhiều càng tốt mà không vượt quá giới hạn về kích thước của các đối số cho lệnh.
Nếu cần nó có thể chia danh sách các tập tin và gọi cmd
nhiều lần. Ví dụ, nó có thể kết thúc cuộc gọi:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Một hạn chế với điều đó là {}
phải là cuối cùng. Ví dụ, bạn không thể viết:
find ... -exec cmd {} other args +
như bạn có thể với ';'
thay vì '+'
.
Bạn có thể viết:
find ... -exec echo foo {} +
nhưng không:
find ... -exec echo {} foo +
Vì vậy, nếu bạn cần thêm một số đối số bổ sung vào cmd
sau danh sách các tệp, bạn phải dùng đến cách gọi shell. (Những lý do khác khiến bạn cần gọi shell sẽ là bất cứ lúc nào bạn cần sử dụng tính năng shell như chuyển hướng, đường ống, một số mở rộng chuỗi ....)
Trong sh -c 'inline-script' x a b c
, đối với inline-script
, $0
là x
, $1
là a
, $2
là b
... "$@"
danh sách của 3 đối số đó: a, b và c. Vì vậy, trong:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Đối với tập lệnh nội tuyến , $0
(ví dụ được sử dụng khi hiển thị thông báo lỗi) được đặt thành find-sh
và "$@"
là danh sách các tệp (phần find
mở rộng {}
thành).
Bằng cách sử dụng exec
nội dung đặc biệt của vỏ:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Chúng tôi nói với shell không được rẽ nhánh một tiến trình bổ sung để chạy cmd
, mà thay vào đó để chạy nó trong cùng một tiến trình (thay thế tiến trình shell đang chạy bằng lệnh đó). Một số vỏ như bash
, zsh
và một số hiện thực của ksh
làm điều đó mặc nhiên cho lệnh cuối cùng trong một kịch bản.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?