`find -delete` Đã xóa mọi thứ


8

Tôi không quá quen thuộc findvà đã vô tình xóa một tấn tệp. Tôi đã tự hỏi nếu có ai có kinh nghiệm hơn có thể giải thích tôi đã sai ở đâu.


Tôi muốn dọn sạch tất cả các tệp .DS_Storevà Trình ._.DS_Storetìm kiếm trên MacBook của tôi đã bị chặn trên toàn bộ phần chia sẻ samba Raspbian của tôi.

  • Tôi có một ổ cứng được gắn vào pi mâm xôi của tôi, với một số liên kết tượng trưng trong thư mục nhà của tôi đến điểm gắn kết, do đó -L.
  • Một số thư mục được sở hữu bởi người dùng hệ thống (ví dụ apache) do đó sudo.

Tôi đã chạy như sau để đảm bảo rằng findđang nhắm mục tiêu đúng tệp:

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -name \*DS_Store\*
./.DS_Store
./Downloads/USBHDD1/._.DS_Store
./Downloads/USBHDD1/.DS_Store
./Downloads/USBHDD1/backups/ALAC/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/USBHDD1/backups/ALAC/.DS_Store
./Downloads/USBHDD1/backups/._.DS_Store
./Downloads/USBHDD1/backups/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/._.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/FLAC/.DS_Store
./Downloads/USBHDD1/backups/Storage/._.DS_Store
./Downloads/USBHDD1/backups/Storage/.DS_Store
./Downloads/OriginalMusic/._.DS_Store
./Downloads/OriginalMusic/.DS_Store
./Downloads/OriginalMusic/FLAC/.DS_Store
./Downloads/ALAC/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/ALAC/.DS_Store

Tất cả có vẻ tốt!

Sau đó tôi đã thêm -deletecờ findđể xóa các tệp tìm thấy:

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -delete -name \*DS_Store\*
find: cannot delete `./Documents': Not a directory
find: cannot delete `./Pictures': Not a directory
find: cannot delete `./Music': Not a directory

Khi tôi nhận ra nó đang cố xóa các liên kết tượng trưng của mình vì một số lý do, tôi đã đấm Ctrl+Cvà lưu khoảng một nửa dữ liệu.

Tài liệu, hình ảnh và âm nhạc là bánh mì nướng. Có lẽ nó đang hoạt động trên thư mục Tải xuống khổng lồ của tôi mà tôi đã đặt gần như mọi thứ vào.


Tại sao findxóa tất cả các tập tin? Tôi đã đặt -deletesai vị trí?

Câu trả lời:


14

Câu trả lời của bạn là trong findmanpage.

Tùy chọn xóa được xử lý trước bộ lọc tên của bạn.

       -delete
          Delete files; true if removal succeeded.  If the removal failed,
          an  error message is issued.  If -delete fails, find's exit sta‐
          tus will be nonzero (when it eventually exits).  Use of  -delete
          automatically turns on the -depth option.

          Warnings:  Don't  forget that the find command line is evaluated
          as an expression, so putting -delete first will make find try to
          delete everything below the starting points you specified.  When
          testing a find command line that you later intend  to  use  with
          -delete,  you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete  implies  -depth,  you  cannot
          usefully use -prune and -delete together.

Bạn có thể đã di chuyển tùy chọn xóa như là lệnh cuối cùng của lệnh

Ngoài ra, bạn có thể đã sử dụng một cái gì đó như

find /path -name "*pattern*" | xargs rm -f

hoặc là

find /path -name "*pattern*" -exec rm -f {} \;

1
+1 ngoại trừ xargs, execkhông giải quyết vấn đề gì cả (cùng một cạm bẫy, nếu bạn thêm -print0 hoặc -exec ở đầu thay vì kết thúc).
frostschutz

1
Ah, tôi đọc sai mantrang. Tôi nghĩ rằng nó đang nói rằng -deletecần phải theo con đường ("điểm bắt đầu"), chứ không phải mô hình.
Hydraxan14

4
@ Hydraxan14 vấn đề là mọi thứ được xử lý từ trái sang phải nên lệnh của bạn làfind things which are less than 256 directory levels down and delete them and whose name contains DS_Store
icarus

@icarus Diễn giải lệnh như thế giúp tôi hiểu nó tốt hơn rất nhiều. Cảm ơn! Tôi đã quen với các lệnh * nix khác mà không quan tâm cờ đi đâu.
Hydraxan14

1
@ Hydraxan14 Nhiều lệnh quan tâm đến thứ tự các cờ dòng lệnh. So sánh, ví dụ, ls -1 -lvới ls -l -1.
Kusalananda

1

Nguyên tắc cơ bản của dòng lệnh của findlà nếu điều kiện và điều kiện và sau đó hành động. Lưu ý rằng hành động đến sau cùng - nó hoàn toàn khác với định dạng gọi một lệnh là đối tượng hành động của đối tượng là Trực tiếp.

Ví dụ: find . -name \*DS_Store\* -deletecó nghĩa là nếu tên trùng khớp *DS_Store*thì xóa xóa. Nếu bạn đảo ngược điều kiện và hành động, -deletehành động không có điều kiện đằng sau nó, vì vậy nó được áp dụng vô điều kiện.

Lý do tại sao find . -delete -name \*DS_Store\*không phải là một lỗi cú pháp là hành động cũng là điều kiện. Các -deletehành động là một điều kiện đúng nếu nó thành công, và là false nếu nó không thành công (ví dụ như do thiếu các điều khoản). Ví dụ, find . -name somethingorother -delete -printin tên của các tệp được xóa thành công.

Lý do tại sao find -name \*DS_Store\*không phải là một lỗi cú pháp là nếu không có hành động, thì có một -printhành động ngầm . Nó được thiết kế theo cách này vì in ấn là một lựa chọn hành động rất phổ biến.

(Lưu ý rằng trong khi câu trả lời của tôi không chứa một lời nói dối hoàn toàn, nó không đơn giản hóa một số điều. Có những tính năng của findcác giải thích trong câu trả lời của tôi không bao gồm, đặc biệt là !-ologic nhà khai thác.)

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.