Tại sao tôi kết thúc với 4 lời mời thay vì 3 khi sử dụng find -execdir {} + (cộng) này?


8

Tôi đọc ở đây mà bạn có thể đếm số lượng các lời gọi của commandtrong -exec command {} +của đường ống | wc -lđể kết thúc của nó.

Mặc dù tôi hiểu điều đó -execdirlà khác nhau, nhưng ở mỗi thư mục con phù hợp findphát hiện ra, nó sẽ chạy một lệnh gọi commandtừ thư mục con chứa trong đó, nếu tôi có nhiều hơn một tệp khớp với thư mục con, thì không nên Tôi kết thúc với số lượng các yêu cầu bằng với số lượng thư mục con phù hợp, và không phải là số lượng các lệnh được khớp với số lượng tệp phù hợp trong các thư mục con đó?

Tôi sẽ kết thúc với cái sau khi tôi chạy như sau:

$ find . -name "bob*" -execdir echo {} + | wc -l

Trang người đàn ông cho các execdir command {} +trạng thái trước đây nên là trường hợp:

Như với -exechành động, +hình thức -execdirsẽ xây dựng một dòng lệnh để xử lý nhiều hơn một tệp phù hợp, nhưng bất kỳ lệnh gọi nào commandsẽ chỉ liệt kê các tệp tồn tại trong cùng thư mục con.


I E

Tôi nhận được:

./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3

Khi tôi mong đợi điều này, dựa trên trang người đàn ông:

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3

Nói chung, bạn không thể đếm các lệnh truyền lệnh. Nếu lệnh là echovà các đối số được tạo bởi {} +và bạn không có dòng mới trong tên tệp của mình (hầu hết mọi người không) THÌ số lượng dòng là số lần gọi và nó hoạt động. Nếu lệnh được nói head -n 999000 /dev/urandomnó đi sai lầm khủng khiếp.
dave_thndry_085

Câu trả lời:


11

Đây là một vấn đề hiệu suất của find. Trong findutilsphiên bản 4.3.4, một cách giải quyết phải hạn chế số lượng đối số -execdir ... {} +sẽ sử dụng là 1. Trong phiên bản 4.5.9, giới hạn đã bị xóa.

Xem một ví dụ:

$ mkdir -p dir{1..3}
$ touch dir{1..3}/file1 dir2/file{1..3}
$ find
.
./dir1
./dir1/file1
./dir2
./dir2/file1
./dir2/file2
./dir2/file3
./dir3
./dir3/file1

Với -execdir {} +, lệnh nên được thực hiện 3 lần. Lệnh thứ hai nên có 3 đối số.

Với find4.4.2:

$ find-4.4.2 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 in /path/to/dir2
Executing ./file2 in /path/to/dir2
Executing ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3

Với find4.6.0:

$ find-4.6.0 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 ./file2 ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.