Câu hỏi Làm thế nào tôi có thể đệ quy xóa tất cả các tập tin của một phần mở rộng cụ thể trong thư mục hiện hành?


Làm cách nào để xóa an toàn tất cả các tệp có tiện ích mở rộng cụ thể (ví dụ: .bak) từ thư mục hiện tại và tất cả các thư mục con bằng một dòng lệnh? Đơn giản, tôi sợ sử dụng rm kể từ khi tôi sử dụng nó sai một lần và bây giờ tôi cần lời khuyên.


421
2017-11-15 13:03


gốc




Các câu trả lời:


Bạn thậm chí không cần phải sử dụng rm trong trường hợp này nếu bạn sợ. Sử dụng find:

find . -name "*.bak" -type f -delete

Nhưng sử dụng nó với biện pháp phòng ngừa. Chạy đầu tiên:

find . -name "*.bak" -type f

để xem chính xác những tệp nào bạn sẽ xóa.

Cũng thế, đảm bảo rằng -delete là đối số cuối cùng trong lệnh của bạn. Nếu bạn đặt nó trước -name *.bak argument, nó sẽ xóa mọi thứ.

Xem man find và man rm để biết thêm thông tin và xem thêm câu hỏi liên quan này về SE:


660
2017-11-15 13:08



Điều này khác với rm *.bak? - sayantankhan
@ Bolt64 của bạn rm *.bak sẽ không hoạt động đối với các thư mục con. - Radu Rădeanu
Với cài đặt mặc định rm *.bak sẽ chỉ xóa tất cả các tệp kết thúc bằng .bak trong thư mục hiện tại. ĐỂ cũng làm những việc trong các thư mục con, bạn cần phải sử dụng các bóng tối, sử dụng tùy chọn -r hoặc sử dụng ví dụ tìm kiếm. - Hennes
@Hennes Hãy cẩn thận với rm -r *.bak! Nó cũng loại bỏ các thư mục kết thúc bằng .bak với tất cả nội dung của họ. - Radu Rădeanu
Bảo đảm cái đó -delete là đối số cuối cùng trong lệnh của bạn. Nếu bạn đặt nó trước -name *.bak tranh luận, nó sẽ xóa mọi thứ. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Chào mừng bạn đến với askubuntu! Trong khi đây là một câu trả lời hoàn toàn hợp lệ, tôi không nghĩ rằng có lợi thế trong việc sử dụng nó thay vì -delete lá cờ của find. Bạn có thể tìm thêm thông tin trong Hướng dẫn sử dụng GNU để xóa các tập tin với tìm. - Glutanimate
bạn có lẽ đúng, nó chỉ là một giải pháp thay thế, có lẽ nguyên liệu nhiều hơn;) - lokers
Đây không chỉ là một sự thay thế mà là một ví dụ về cách các lệnh khác có thể được kết hợp cùng với đường ống '|'. +1 - Boris Pavlović
Các giải pháp thay thế này hoạt động trên các môi trường khác thiếu delete (như Cygwin) - ciriarte
Tôi nghĩ đây là câu trả lời hay nhất ở đây. - Léo Léopold Hertz 준영


Đầu tiên chạy lệnh shopt -s globstar. Bạn có thể chạy nó trên dòng lệnh và nó sẽ chỉ có hiệu lực trong cửa sổ trình bao đó. Bạn có thể đặt nó vào .bashrc, và sau đó tất cả các shell mới được bắt đầu sẽ chọn nó. Hiệu ứng của lệnh đó là tạo ra **/ khớp các tệp trong thư mục hiện tại và các thư mục con của nó đệ quy (theo mặc định, **/ có nghĩa giống như */: chỉ trong các thư mục con trực tiếp). Sau đó:

rm **/*.bak

(hoặc là gvfs-trash **/*.bak hoặc những gì có bạn).


28
2017-11-15 18:59





Xóa các tập tin là dành cho tôi không phải cái gì bạn nên sử dụng rm cho. Đây là một thay thế:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Như Flimm nói trong các ý kiến:

Gói trash-cli làm điều tương tự như gvfs-trash mà không phụ thuộc vào gvfs.

Vì thế:

sudo apt-get install trash-cli

Bạn không cần phải tạo bí danh cho điều này, bởi vì trash-cli gói cung cấp một lệnh trash, những gì chúng tôi muốn.

Như Eliah Kagan đã làm rõ trong các bình luận rộng rãi, bạn cũng có thể làm cho đệ quy này bằng cách sử dụng find. Trong trường hợp đó bạn không thể sử dụng bí danh, vì vậy các lệnh bên dưới giả sử bạn đã cài đặt trash-cli. Tôi tóm tắt ý kiến ​​của Eliah:

Lệnh này tìm và hiển thị tất cả .bak các tệp và liên kết tượng trưng ở bất kỳ đâu trong thư mục hiện tại hoặc các thư mục con của nó hoặc bên dưới.

find . -name '*.bak' -xtype f

Để xóa chúng, hãy thêm -exec với trash chỉ huy:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f chọn tệp và liên kết tượng trưng đến tệp, chứ không phải thư mục. Để xóa thư mục .bak, hãy xóa phần đó và sử dụng -execdir, tránh cannot trash non-existent lỗi cho .bak tệp bên trong .bak thư mục:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"Không sử dụng rm để xóa mọi thứ "là một tuyên bố gây tranh cãi nhưng tôi phải đồng ý rằng thường khôn ngoan hơn khi sử dụng thứ gì đó sẽ cho phép bạn hoàn tác mọi thứ. - Oli♦
Gói trash-cli làm điều tương tự như gvfs-trash không phụ thuộc vào gvfs. - Flimm
Tôi đã chỉnh sửa nó trong câu trả lời, lần sau cảm thấy tự do để tự chỉnh sửa. - don.joey
@ don.joey Câu trả lời này dường như nói find . -name "*.bak" -type f hiển thị những gì trash *.bak xóa. Đó thực sự là những gì bạn có ý nghĩa? Bạn có thể di chuyển thư mục vào thùng rác bằng trash hoặc là gvfs-trash, nhưng trash *.bak sẽ chỉ di chuyển các tệp và thư mục có tên kết thúc bằng .bak và nằm ngay trong thư mục hiện tại. Vỏ mở rộng *.bak, vì thế trash *.bak sẽ không ảnh hưởng .bak các tệp trong thư mục con không phải là tên của chúng .bak. - Eliah Kagan
@ don.joey Có ls *.bak (mà tôi nghĩ bạn có ý nghĩa) liệt kê những gì trash *.bak trashes. find . -name '*.bak' -xtype f -exec trash {} + trashes tất cả .bak tệp ở bất kỳ đâu dưới .. Nó không thể sử dụng bí danh, vì vậy hãy cài đặt trash-cli Hay viết gvfs-trash thay thế. Đây là một ví dụ.  -xtype f chọn tệp và liên kết tượng trưng đến tệp, chứ không phải thư mục. Xóa .bak  thư mục quá, sử dụng find . -name '*.bak' -execdir trash {} +, tránh cannot trash non existent lỗi cho .bak tệp bên trong .bak thư mục. Xin vui lòng sử dụng bất kỳ điều này trong câu trả lời của bạn. - Eliah Kagan


Nếu bạn muốn xóa tất cả các tệp thuộc một loại nhất định, nhưng chỉ có 1 thư mục "sâu" từ thư mục hiện tại:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 vì thư mục hiện tại "."được tính là thư mục đầu tiên.


3
2017-11-26 17:21





Nếu bạn đang ở trong một repo git, bạn có thể sử dụng:

git clean -fdx

Thao tác này sẽ xóa các tệp và tệp không được theo dõi trong .gitignore.


0
2017-08-09 07:38