Từ man find
:
lệnh -exec;
Thực thi lệnh; đúng nếu trạng thái 0 được trả về. Tất cả các đối số sau đây cần tìm được coi là đối số của lệnh cho đến khi một đối số bao gồm ';' gặp phải Chuỗi '{}' được thay thế bằng tên tệp hiện tại đang được xử lý ở mọi nơi nó xuất hiện trong các đối số cho lệnh, không chỉ trong các đối số chỉ có một mình, như trong một số phiên bản tìm kiếm. Cả hai công trình này có thể cần phải được thoát ra (với '\') hoặc được trích dẫn để bảo vệ chúng khỏi sự mở rộng của vỏ. Xem phần EXAMPLES sec để biết ví dụ về việc sử dụng tùy chọn '-exec'. Lệnh được chỉ định được chạy một lần cho mỗi tệp phù hợp.
Lệnh được thực thi trong thư mục bắt đầu. Có những vấn đề bảo mật không thể tránh khỏi xung quanh việc sử dụng tùy chọn -exec;
lệnh -exec {} +
Biến thể này của tùy chọn -exec chạy lệnh được chỉ định trên các tệp đã chọn, nhưng dòng lệnh được xây dựng bằng cách nối thêm từng tên tệp đã chọn ở cuối ; tổng số lệnh gọi của lệnh sẽ ít hơn nhiều so với số lượng tệp được khớp. Dòng lệnh được xây dựng theo cách tương tự như xargs xây dựng các dòng lệnh của nó. Chỉ một trường hợp '{}' được cho phép trong lệnh. Lệnh được thực thi trong thư mục bắt đầu.
Vì vậy, theo cách tôi hiểu, \;
thực thi một lệnh riêng cho mỗi tệp được tìm thấy find
, trong khi \+
nối thêm các tệp và thực thi một lệnh duy nhất trên tất cả chúng. Đây \
là một nhân vật thoát, vì vậy nó:
ls testdir1; ls testdir2
đấu với
ls testdir1 testdir2
Làm như trên trong vỏ của tôi nhân đôi đầu ra trong câu hỏi của bạn.
ví dụ về thời điểm bạn muốn sử dụng \+
Giả sử hai tệp 1.tmp
và 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
Với \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Trong khi đó, nếu bạn sử dụng \+
(để nối kết quả của find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
Vì vậy, trong trường hợp này, đó là sự khác biệt giữa diff 1.tmp; diff 2.tmp
vàdiff 1.tmp 2.tmp
Có những trường hợp \;
phù hợp và \+
sẽ cần thiết. Sử dụng \+
với rm
là một ví dụ như vậy, trong đó nếu bạn loại bỏ một số lượng lớn hiệu suất tệp (tốc độ) sẽ vượt trội hơn \;
.