Cách xóa thư mục có tên nhất định


138

Trong Linux, làm cách nào để xóa các thư mục có tên nhất định được lồng sâu trong cấu trúc phân cấp thư mục?

Các đường dẫn sau nằm dưới một thư mục và tôi muốn xóa tất cả các thư mục có tên a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

Tôi nên sử dụng lệnh Linux nào từ thư mục mẹ?


Có lẽ thiếu điểm nhưng có lẽ nó hỗ trợ ai đó: Tôi có 410 thư mục trong một thư mục chính - mỗi thư mục có 410 thư mục phụ. Tất cả các thư mục con đầu tiên được đặt tên là 'bản cuối cùng' và chứa các tệp pdf đã chỉnh sửa và danh sách nội dung Word. Tất cả các thư mục con thứ hai có tên tif_pdf_various_names chứa các tệp đã lưu ban đầu được quét (một số lên đến 200 trang), pdf chưa được chỉnh sửa của chúng và danh sách nội dung .docx dự thảo - do đó là một bộ sưu tập công việc tại nhà. Tôi cần tạo một bộ sưu tập gồm 410 thư mục chỉ chứa tài liệu được chỉnh sửa cuối cùng - với số lượng gần 4TB. Phương pháp dễ nhất được tìm thấy là sử dụng (trong Micr
Jurie

Câu trả lời:


155

Nếu thư mục đích trống, sử dụng find, chỉ lọc với các thư mục, lọc theo tên, thực thi rmdir:

find . -type d -name a -exec rmdir {} \;

Nếu bạn muốn xóa đệ quy nội dung của nó, thay thế -exec rmdir {} \;bằng -deletehoặc -prune -exec rm -rf {} \;. Các câu trả lời khác bao gồm chi tiết về các phiên bản này, tín dụng chúng quá.


9
Bạn có thể vui lòng giải thích những gì {} \;không?
winklerrr

6
{}có thể được đọc là "cho mỗi tệp / thư mục phù hợp" - tức là nó thay thế cho mỗi tệp / thư mục "tìm thấy". \;là một kết thúc cho -execmệnh đề.
wmorrison365

2
Điều này mang lại cho tôi lỗi "không thể xóa" khi thư mục không trống
bịt mắt

1
Xem xét thêm -prunecờ vào câu trả lời theo đề xuất @David Grayson. Nếu không có điều này, findvẫn sẽ cố gắng truy cập vào thư mục hiện bị thiếu và cuối cùng sẽ thoát với mã lỗi, ví dụ như có thể không xây dựng Docker.
Czyzby

159

Sử dụng find cho tên "a" và thực hiện rm để xóa những cái được đặt tên theo mong muốn của bạn, như sau:

find . -name a -exec rm -rf {} \;

Kiểm tra nó đầu tiên bằng cách sử dụng ls để liệt kê:

find . -name a -exec ls {} \;

Để đảm bảo điều này chỉ xóa các thư mục và không phải các tệp đơn giản, hãy sử dụng "-type d" arg (như được đề xuất trong các nhận xét):

find . -name a -type d -exec rm -rf {} \;

"{}" Là thay thế cho mỗi tệp "a" được tìm thấy - lệnh exec được thực thi đối với từng thay thế.


4
Bạn có thể muốn thêm một "-type d" trong đó chỉ cần nhập một tệp khớp với cùng tên.
Mark Loeser

3
Cũng lưu ý rằng điều này sẽ bắt được một cái gì đó giống như 1/2/a/3/4, có thể không có ý định, vì vậy +1 cho đề xuất thử nghiệm trước ...
twalberg

9
reco echo {}để kiểm tra nó trước, thay vìls {}
Charney Kaye

2
Ở đây đi của tôi node_modules/.
saruftw

6
Tôi đã sử dụng find . -name a -type d -exec rm -rf {} \;và nó hoạt động, mặc dù nó được in ra find: ‘./subdir/subdir/a’: No such file or directorycho mỗi thư mục bị xóa.
pacoverflow

59

Điều này cũng hoạt động - nó sẽ xóa tất cả các thư mục được gọi là "a" và nội dung của chúng:

rm -rf `find -type d -name a`

@Buffalo, sao rồi? Defo này hoạt động nhưng những người khác cũng vậy. Sẽ ngạc nhiên khi tìm thấy một env nơi điều này hoạt động nhưng những người khác không đưa ra tất cả các câu trả lời về cơ bản find/rm.
wmorrison365

4
@ wmorrison365 vì nếu bạn làm như vậy find . -name a -exec rm -rf {} \;, find sẽ bị sập khi nó cố gắng vào thư mục đó để tìm thêm các mục, cho bạn một lỗi như thế nào find: '1/2/3/a': No such file or directory.
Alex Grönholm

@Alex Grönholm chắc chắn, nhưng tất cả các thư mục có tên 'a' vẫn bị xóa. Như bạn nêu, sau đó không thể tìm trong thư mục 'a' đã bị xóa nhưng điều đó không thành vấn đề. Muốn giữ nội dung 'a' để xử lý tiếp theo trước khi xóa là trường hợp sử dụng khác với những gì OP yêu cầu.
wmorrison365

6
@ wmorrison365 Có, các thư mục đã bị xóa nhưng tôi không nghĩ nên giới thiệu một giải pháp khi lệnh bị lỗi (trả về mã thoát không khác).
Alex Grönholm

1
Điều này đã cho tôi một lỗi illegal option --t. Tôi cũng phải vượt qua thư mục để tìm kiếm trong ( stackoverflow.com/questions/25840713/ trên ) : rm -rf `find . -type d -name a`.
Steve Harrison

25

Để xóa tất cả các thư mục có tên foo, hãy chạy:

find -type d -name foo -a -prune -exec rm -rf {} \;

Các câu trả lời khác đang thiếu một điều quan trọng: -prunetùy chọn. Không có -prune, GNU find sẽ xóa thư mục có tên phù hợp và sau đó cố gắng lặp lại vào đó để tìm thêm thư mục phù hợp. Các -prunetùy chọn cho nó để không recurse vào một thư mục đó xuất hiện các điều kiện.


21

Tôi đã kết thúc ở đây để tìm cách xóa node_modulescác thư mục của tôi trước khi thực hiện sao lưu công việc của tôi trong quá trình sử dụng rsync. Một yêu cầu chính là node_modulesthư mục có thể được lồng nhau, vì vậy bạn cần -prunetùy chọn.

Đầu tiên tôi chạy cái này để xác minh trực quan các thư mục sẽ bị xóa:

find -type d -name node_modules -prune

Sau đó, tôi chạy nó để xóa tất cả:

find -type d -name node_modules -prune -exec rm -rf {} \;

Nhờ có nhụy hoa


Ahh đã hoạt động tốt, để làm điều này một cái gì đó bạn có thể sử dụng một cách dễ dàng, bạn có thể lưu nó dưới dạng một bản tóm tắt nhỏ: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Nên làm thủ thuật. CẢNH BÁO, nếu bạn vô tình bơm một .hoặc /vào xargs rm -Rftoàn bộ máy tính của bạn sẽ bị xóa mà không có tùy chọn để lấy lại, yêu cầu cài đặt lại hệ điều hành.


2
Oh, rủi ro nhỏ xíu đó. Đo la tât cả hả? Haha. Siêu cảm ơn vì lời cảnh báo. Tôi chắc chắn sẽ làm cho lỗi đánh máy đó.
TinkerTenorSoftwareGuy

9

Tôi đã có hơn 100 tập tin như

log-12
log-123
log-34
....

câu trả lời trên không làm việc cho tôi

nhưng lệnh sau đã giúp tôi.

find . -name "log-*" -exec rm  -rf {} \;

tôi đã cung cấp -typenhư. vậy nó sẽ xoá tất cả các file và thư mục mà bắt đầu vớilog-

rm -rf xóa các thư mục đệ quy ngay cả khi nó có tệp.

nếu bạn muốn thư mục một mình

find -type d -name "log-*" -exec rm  -rf {} \;

tập tin một mình

find -type f -name "log-*" -exec rm  -rf {} \;

8

Kết hợp nhiều câu trả lời, đây là một lệnh hoạt động trên cả Linux và MacOS

rm -rf $(find . -type d -name __pycache__)

Chỉ có một người làm việc cho tôi mà không ném lỗi
Kloar

7

Một số khác:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
Câu trả lời này chỉ hoạt động cho các thư mục trống. -deletekhông loại bỏ các thư mục không trống.
maninak

Cảm ơn bạn đã thêm phiên bản OSX
schu34

6

Lệnh này hoạt động với tôi. Nó làm công việc của nó một cách đệ quy

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - thư mục hiện tại

"node_modules" - tên thư mục


-2

tìm đường dẫn / đến / các / thư mục -maxdepth 1 -name "my_ *" -type d -delete

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.