Cú pháp find -exec đúng là gì


10

Tôi muốn xóa các tệp lớn hơn 2MB trong một thư mục cụ thể. Thế là tôi chạy:

find . -size +2M

Và tôi có một danh sách gồm hai tập tin

./a/b/c/file1

./a/f/g/file2

Thế là tôi chạy:

find . -size +2M -exec rm ;

và tôi nhận được thông báo lỗi Find: missing argument to -exec

Tôi kiểm tra cú pháp trong trang man và nó nói -exec command ;

Vì vậy, thay vì tôi cố gắng

find . -size +2M -exec rm {} +

Và nó hoạt động. Tôi hiểu rằng {} làm cho nó thực thi lệnh như thế rm file1 file2thay vì rm file1; rm file2;.

Vậy tại sao cái đầu tiên không hoạt động?

CÂU TRẢ LỜI:

Tôi đoán rằng tôi chỉ cần RTFM một vài lần để cuối cùng hiểu những gì nó nói. Mặc dù ví dụ đầu tiên không hiển thị {}, tất cả các trường hợp niềng răng được yêu cầu. Và sau đó thêm \; hoặc + tùy thuộc vào phương pháp mong muốn. Đừng chỉ đọc tiêu đề. Đọc mô tả là tốt. Hiểu rồi.

Câu trả lời:


16

Bạn có thể sử dụng bất kỳ hình thức nào:

find . -size +2M -exec rm {} +

find . -size +2M -exec rm {} \;

Dấu chấm phẩy nên được thoát!


10
-exec rm {} \;

bạn có thể sử dụng .. người đàn ông tìm

-exec command ;
              Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the  command  until
              an  argument  consisting of `;' is encountered.  The string `{}' is replaced by the current file name being processed everywhere
              it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.  Both of  these
              constructions  might  need  to  be escaped (with a `\') or quoted to protect them from expansion by the shell.  See the EXAMPLES
              section for examples of the use of the -exec option.  The specified command is run once for each matched file.  The  command  is
              executed  in  the  starting directory.   There are unavoidable security problems surrounding use of the -exec action; you should
              use the -execdir option instead.

       -exec command {} +
              This variant of the -exec action runs the specified command on the selected files, but the command line is  built  by  appending
              each  selected file name at the end; the total number of invocations of the command will be much less than the number of matched
              files.  The command line is built in much the same way that xargs builds its command  lines.   Only  one  instance  of  `{}'  is
              allowed within the command.  The command is executed in the starting directory.

1
À, được rồi Tôi đoán rằng tôi chỉ cần RTFM một vài lần để cuối cùng hiểu những gì nó nói. Mặc dù ví dụ đầu tiên không hiển thị {}, tất cả các trường hợp niềng răng đều được yêu cầu. Và sau đó thêm \; hoặc + tùy thuộc vào phương pháp mong muốn. Hiểu rồi.
Safado

2

Vì mục đích hiệu quả, bạn thường sử dụng xargs tốt hơn:

$ find /path/to/files -size +2M -print0 | xargs -0 rm

1
Không hẳn vậy. Như mục Hướng dẫn trên wiki của Greg nói: + (thay vì;) ở cuối hành động -exec cho biết tìm sử dụng một tính năng giống như xargs nội bộ, khiến lệnh rm chỉ được gọi một lần cho mỗi khối tệp, thay vì một lần cho mỗi tập tin.
thích nghi

À, thú vị. Tôi đã sử dụng find + xargs trong nhiều năm và tôi chưa bao giờ biết về toán tử +. Cảm ơn đã chỉ ra rằng!
EEAA

Tôi hoàn toàn có thể giới thiệu wiki của Greg; người đàn ông này biết nhiều về bash và bộ công cụ GNU hơn tôi có thể hy vọng học được; thật an toàn khi nói rằng tôi đã học được nhiều hơn về việc sử dụng bash kể từ khi tôi bắt đầu đọc nó hơn tất cả những năm trước đó.
thích nghi

2
Greg là ai và tôi có thể tìm wiki của anh ấy ở đâu?
Safado

@Safado Tôi nghĩ đây là cái này: mywiki.wooledge.org
Enrico Stahn

0

Tôi hoàn toàn không sử dụng -exec cho việc này. tìm cũng có thể loại bỏ các tập tin chính nó:

find . -size +2M -delete

(đây có lẽ là một GNUism, không biết nếu bạn tìm thấy điều này trong tìm kiếm không phải là gnu)


Có lý do đằng sau điều này hay chỉ đơn giản là sở thích cá nhân?
Safado

chỉ tìm các cuộc gọi hủy liên kết (2) và không phải tắt các tiến trình mới để thực hiện xóa. Nó sẽ hiệu quả hơn nhiều. Nó cũng dễ đọc hơn nhiều.
hầm

0

Như tài liệu, -exec yêu cầu {} làm trình giữ chỗ cho đầu ra của tìm kiếm.

Hướng dẫn dứt khoát cho việc sử dụng các công cụ bash và GNU có ở đây

Như bạn có thể thấy, nó hiển thị rõ ràng lệnh thứ hai mà bạn đã sử dụng làm ví dụ.

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.