Làm cách nào tôi có thể xóa đệ quy tất cả các tệp của một tiện ích mở rộng cụ thể trong thư mục hiện tại?


531

Làm cách nào để xóa an toàn tất cả các tệp có phần mở rộng cụ thể (ví dụ .bak) khỏi 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 rmvì tôi đã sử dụng sai một lần và bây giờ tôi cần lời khuyên.

Câu trả lời:


839

Bạn thậm chí không cần sử dụng rmtrong 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 sự đề phòng. Chạy trước:

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

để xem chính xác những tập tin bạn sẽ loại bỏ.

Ngoài ra, hãy chắc chắn rằng đó -deletelà đố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 findman rmđể biết thêm thông tin và cũng xem câu hỏi liên quan này trên SE:


Điều này khác với rm *.baknhư thế nào?
sayantankhan

10
@ Bolt64 Bạn rm *.baksẽ không làm việc cho các thư mục con.
Radu Rădeanu

Với cài đặt mặc định rm *.baksẽ 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. TO cũng thực hiện mọi thứ trong các thư mục con mà bạn cần để sử dụng các khối, sử dụng tùy chọn -r hoặc sử dụng ví dụ find.
Hennes

9
@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 .bakbằng tất cả nội dung của chúng.
Radu Rădeanu

37
Hãy chắc chắn rằng đó -deletelà đối số cuối cùng trong lệnh của bạn. Nếu bạn đặt nó trước -name *.bakđối số, nó sẽ xóa mọi thứ.
Michael

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

1
Chào mừng bạn đến với Askubfox! Mặc dù đây là một câu trả lời hoàn toàn hợp lệ nhưng tôi không nghĩ có bất kỳ lợi thế nào trong việc sử dụng nó thay vì -deletecờ của find. Thông tin thêm có thể được tìm thấy trong mục hướng dẫn sử dụng GNU để xóa các tệp có find .
Glutimate

2
bạn có thể đúng, nó chỉ là một giải pháp thay thế, có lẽ còn thô sơ hơn;)
vay

11
Đây không chỉ là một giải pháp 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ć

13
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

2
Tôi nghĩ rằng đây là câu trả lời tốt nhất ở đây.
Léo Léopold Hertz

33

Đầ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ổ shell đó. Bạn có thể đặt nó vào trong .bashrc, và sau đó tất cả các vỏ mới bắt đầu sẽ nhặt nó lên. Tác dụng của lệnh đó là tạo **/các tệp trùng khớp trong thư mục hiện tại và các thư mục con của nó theo cách đệ quy (theo mặc định, **/có nghĩa tương tự như */: chỉ trong các thư mục con ngay lập tức). Sau đó:

rm **/*.bak

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


21

Xóa các tập tin là đối với tôi không phải là một cái gì đó bạn nên sử dụng rmcho. Đâ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-clinày thực hiện tương tự như gvfs-trashkhông có sự phụ thuộc vào gvfs.

Vì thế:

sudo apt-get install trash-cli

Bạn không cần tạo bí danh cho việc này, vì trash-cligói cung cấp một lệnh trash, thực hiện những gì chúng ta muốn.

Vì Eliah Kagan nói rõ trong các bình luận rộng rãi, bạn cũng có thể thực hiện đệ 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ả .bakcác tệp và liên kết tượng trưng ở bất cứ đâu trong thư mục hiện tại hoặc thư mục con của nó hoặc bên dưới.

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

Để xóa chúng, thêm một -execbằng trashlệnh:

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

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

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

4
"Đừ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 việc sử dụng thứ gì đó sẽ cho phép bạn hoàn tác mọi thứ sẽ khôn ngoan hơn.
Oli

2
Các gói trash-clilàm điều tương tự như gvfs-trashkhông có sự phụ thuộc vào gvfs.
Flimm

Tôi đã chỉnh sửa nó trong câu trả lời, lần sau hãy tự mình chỉnh sửa.
don.joey

@ don.joey Câu trả lời này có vẻ như find . -name "*.bak" -type fhiển thị những gì trash *.bakxóa. Đó thực sự là những gì bạn có ý nghĩa? Bạn có thể di chuyển các thư mục vào thùng rác bằng trashhoặc gvfs-trash, nhưng trash *.baksẽ chỉ di chuyển các tệp và thư mục có tên kết thúc .bakvà nằm ngay trong thư mục hiện tại. Shell mở rộng *.bak, do đó trash *.baksẽ không ảnh hưởng đến .bakcác tệp trong thư mục con không được đặt tên .bak.
Eliah Kagan

1
@ don.joey Có ls *.bak(mà tôi nghĩ bạn muốn nói) liệt kê những gì trash *.bakrác. find . -name '*.bak' -xtype f -exec trash {} +rác tất cả .bakcác tập tin bất cứ nơi nào dưới .. Nó không thể sử dụng bí danh, vì vậy hãy cài đặt trash-clihoặc viết gvfs-trashthay thế. Đây là một ví dụ. -xtype fchọn tập tin và liên kết tượng trưng đến tập tin, nhưng không chọn thư mục. Để xóa .bak các thư mục quá, sử dụng find . -name '*.bak' -execdir trash {} +, tránh cannot trash non existentlỗi cho .bakcác tệp trong .bakthư 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

5

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" khỏi 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.


1

Câu trả lời nhanh:

  • Xóa tất cả các tệp có tên hoặc hậu tố được xem xét đệ quy:

    find . -name '*.pyc' -type f -delete

  • Xóa tất cả các thư mục với tên được xem xét đệ quy:

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    Một số ít được kiểm soát chặt chẽ, nhưng trong một dòng duy nhất:

    find ~ -path '*/__pycache__*' -delete
    

[ LƯU Ý ]:

dlà tùy chọn thư mục và flà tùy chọn tập tin.


0

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

git clean -fdx

Điều này xóa các tệp và tệp không bị theo dõi trong .gitignore.

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.