tìm - thực hiện rm vs -delete


260

Tôi đang cố gắng để hiểu sự khác biệt giữa hai lệnh này:

sudo find / -name .DS_Store -delete

sudo find / -name ".DS_Store"  -exec rm {} \;

Tôi nhận thấy rằng execphương pháp được ưa thích. Tại sao? Cái nào an toàn hơn / nhanh hơn / tốt hơn? Tôi đã sử dụng cả trên Macbook của mình và mọi thứ dường như hoạt động tốt.

Câu trả lời:


245

-delete sẽ hoạt động tốt hơn vì nó không phải sinh ra một quy trình bên ngoài cho mỗi tệp phù hợp.

Có thể là bạn có thể thấy -exec rm {} \;thường được đề xuất vì -deletekhông tồn tại trong tất cả các phiên bản của find. Tôi không thể kiểm tra ngay bây giờ nhưng tôi khá chắc chắn rằng tôi đã sử dụng findmà không có nó.

Cả hai phương pháp nên "an toàn".

EDIT mỗi bình luận từ @doitmyway: đảm bảo bạn khớp với tên và sau đó xóa, không phải cách khác (xóa, sau đó khớp). Nếu không, mọi tập tin sẽ bị xóa, cho dù nó phù hợp hay không . Tức là KHÔNG làm điều này : find / -delete -name .DS_Store.

Một phương pháp phổ biến để tránh chi phí sinh sản của một quy trình bên ngoài cho mỗi tệp phù hợp là:

find / -name .DS_Store -print0 | xargs -0 rm

(nhưng lưu ý rằng cũng có một vấn đề về tính di động: không phải tất cả các phiên bản tìm kiếm đều có -print0!)


2
Tôi hiểu rồi. Tôi cũng đã đọc rằng sử dụng công -deletetắc trước khi -namexóa cây tập tin được chỉ định, vì vậy tôi đoán tôi phải cẩn thận.
Hành tây

8
Gần đây, findbạn có thể sử dụng -exec rm {} +để xóa tất cả các tệp phù hợp bằng một rmlệnh duy nhất .
jimmij

3
.DS_Storehoàn toàn không chứa bất kỳ ký tự đặc biệt nào, vì vậy các trích dẫn là không cần thiết và không thay đổi gì trong trường hợp này.
Celada

1
Về cơ bản chỉ có khoảng trắng (khoảng trắng, tab, có thể là các khoảng trắng khác) là điều duy nhất khiến một chuỗi không trích dẫn được hiểu là hai đối số dòng lệnh riêng biệt, nhưng đó không phải là tất cả những gì bạn phải xin lỗi khi quyết định có trích dẫn hay không. Bạn phải lo lắng về tất cả các siêu ký tự shell như ;hoặc |hoặc >hoặc <`` và nhiều cái khác có ý nghĩa đặc biệt với shell trừ khi được trích dẫn.
Celada

1
@MarcoMarsala xử xargslý vấn đề danh sách đối số kích thước giới hạn một cách minh bạch bằng cách chia nó thành nhiều lệnh của lệnh.
Celada

27

Giả sử .DS_Stoređại diện cho các tệp và không phải thư mục, cách di động nhanh nhất vẫn là:

sudo find / -name .DS_Store -exec rm {} +

Rủi ro duy nhất là sudokhông có sẵn nhưng ngày nay nó khá thấp.

Các -deletetùy chọn sử dụng để yêu cầu GNU tìm và vẫn là phi tiêu chuẩn trong nhiều khác findtriển khai, như vậy là không luôn luôn có sẵn.

Việc chấm dứt lệnh +thay vì \;tối ưu hóa execmệnh đề bằng cách không chạy rmlệnh cho mỗi và mọi thứ .DS_Storehiện diện trên hệ thống tệp.


16

Đối với một máy như macbook của bạn, bạn sẽ không tìm thấy nhiều sự khác biệt về hiệu suất giữa hai lệnh. Tuy nhiên, nếu bạn nhìn vào phiên bản -exec, bạn có thể thấy một sự khác biệt tinh tế:

sudo find / -iname ".file-to-delete"  -exec rm {} \;

Điều này có nghĩa là bạn sẽ tìm thấy tất cả các tệp có tên ".file-to-xóa". Tuy nhiên, tìm kiếm này có thể trả về một số dương tính giả không mong muốn. Khi làm một cái gì đó với sudo bạn nên cẩn thận hơn một chút. Ưu điểm của việc sử dụng -exec rm {} là bạn có thể truyền các đối số cho rm như thế này:

sudo find / -iname "*~"  -exec rm -i {} \;

Trong ví dụ này tôi muốn xóa các tệp sao lưu mà emacs tạo ra. Tuy nhiên, dấu ngã đó có thể nằm trong một số tệp tối nghĩa mà tôi không biết và có thể quan trọng. Thêm vào đó tôi muốn xác nhận xóa. Vì vậy, tôi đặt tùy chọn '-i' trên lệnh rm. Điều này sẽ cho tôi một tương tác xóa.

Ngoài ra, bạn có thể tinh chỉnh việc sử dụng rm để xóa các thư mục cũng như các tệp:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

Tóm lại, -exec cung cấp cho bạn thêm một chút quyền kiểm soát đối với lệnh thực tế loại bỏ mục tìm thấy. Ưu điểm là bạn sử dụng một công cụ để tìm các tệp, một công cụ khác để loại bỏ chúng. Ngoài ra, không phải mọi phiên bản của tiện ích tìm kiếm đều có tùy chọn -delete. Vì vậy, tốt hơn để sử dụng mỗi công cụ cho công việc thích hợp của nó. Đây là triết lý unix - một công cụ, một công việc, sử dụng chúng cùng nhau để làm những gì bạn cần làm.


3
Xem thêm -ok rm {} \;tại chỗ -exec rm {} \;để xác nhận tương tác.
Kusalananda
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.