Lệnh để loại bỏ tất cả các tập tin nhưng không phải thư mục là gì?


23

Hãy nói rằng tôi có một cây thư mục như thế này:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Nếu tôi sử dụng rm -r FOLDER/*, mọi thứ trong FOLDER sẽ bị xóa kể cả các thư mục con. Làm cách nào tôi có thể xóa tất cả các tệp trong FOLDER và trong các thư mục con của nó mà không xóa các thư mục thực tế?

Câu trả lời:


37

Những gì bạn đang cố gắng làm là xóa đệ quy. Cho rằng bạn cần một công cụ đệ quy, chẳng hạn như find.

find FOLDER -type f -delete

13

Với bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Ở đây lặp lại các tên tệp được mở rộng trên toàn cầu và chỉ xóa các tệp.

Ở trên là chạy khô, nếu hài lòng với những thay đổi được thực hiện, hãy xóa echođể loại bỏ thực tế:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Cuối cùng, bỏ đặt globstar:

shopt -u globstar

Với zsh, tận dụng vòng loại toàn cầu:

echo -- FOLDER/**/*(.)

(.) là vòng loại toàn cầu, giới hạn mở rộng toàn cầu chỉ là các tệp thông thường.

Ở trên sẽ chỉ in tên tệp, để loại bỏ thực tế:

rm -- FOLDER/**/*(.)

2
+1 cho zsh globalbing. Nhiều người nên biết về những điều tuyệt vời mà zsh có thể làm.
marcelm

11

Nếu phiên bản findkhông hỗ trợ của -deletebạn, bạn có thể sử dụng cách sau để xóa mọi tệp trong thư mục hiện tại và bên dưới.

find . ! -type d -exec rm '{}' \;

-exec rm {} +sẽ nhanh hơn, đặc biệt nếu có nhiều tệp.
muru

find . ! -type d -exec rm {} +loại bỏ các liên kết sym là tốt.
Công lý cho Monica

1
@muru: Nếu một triển khai cụ thể findkhông hỗ trợ -deletethì có lẽ nó cũng không hỗ trợ -exec ... {} +. Cách được đề xuất để đối phó với điều đó là find ... -print0 | xargs -r0 rm(nếu người ta mong đợi nhiều trận đấu tiềm năng).
David Foerster

5
@DavidFoerster không thực sự. -exec ... {} +là POSIX, nhưng -deletekhông phải. (Nhân tiện cũng -print0vậy.)
muru

@muru: Đủ công bằng. Tôi đã gặp ít nhất hai findtriển khai không phải POSIX hỗ trợ -print0nhưng không -exec ... {} +(tôi không nhớ về điều đó -delete). Một cái là trên OS X, cái kia là Solaris (vài năm trước trên một hệ thống được cập nhật rất bảo thủ). Bạn cũng có thể thay thế -print0bằng -printf '%p\0'. Dù sao, đây là Hỏi Ubuntu chứ không phải Unix & Linux và Ubuntu sử dụng GNU find mãi mãi.
David Foerster
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.