Làm cách nào để xóa nhiều (200 000) tệp?


17

Tôi phải xóa 200 000 tệp (tất cả chúng) khỏi một thư mục và tôi không muốn xóa chính thư mục đó.

sử dụng rm, tôi gặp lỗi "Danh sách đối số quá dài". Tôi đã cố gắng làm một cái gì đó với xargs, nhưng tôi không phải là Shell Guy, vì vậy nó không hoạt động:

find -name * | xargs rm -f

5
Tại sao không xóa thư mục và tạo lại nó sau khi xóa?
garconcn

Câu trả lời:


35
$ find /path/to/folder -type f -delete

15
Có lẽ đáng để đề cập rằng GNU find (được sử dụng bởi hầu hết các bản phân phối Linux) có thể tự xóa các tệp bằng cách sử dụng -delete. Điều này cũng tránh các vấn đề với các tệp chứa dấu ngoặc kép hoặc ký tự dòng mới (mặc dù bạn có thể sử dụng các tùy chọn -print0của GNU find và GNU xarg -0để khắc phục điều đó).
DerfK

3
@DerfK, nhận xét tốt đẹp! Ngoài ra, rất nhiều ppl có xu hướng chơi với xargstrong khi đó find-exec command {} +cú pháp.
poige

5

Bạn đang làm mọi thứ đúng. Đó là '*' cung cấp cho bạn một vấn đề (trình bao đang mở rộng nó thành danh sách các tệp thay vì find). Cú pháp đúng có thể là:

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f

(Cái sau kém hiệu quả hơn một chút vì nó sẽ chuyển tên dài hơn sang xargs, nhưng bạn sẽ khó nhận ra :-))

Ngoài ra, bạn có thể thoát '*' của mình như thế này (tuy nhiên trong trường hợp đó, nó cũng sẽ cố gắng xóa "." Và ".."; đó không phải là vấn đề lớn - bạn sẽ chỉ nhận được một cảnh báo nhỏ :-)):

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f

Nếu tên tệp của bạn chứa khoảng trắng thì hãy sử dụng:

find . -type f -print0 | xargs -0 rm -f

1
Điều này không hoạt động nếu bạn có một tên tệp chứa một khoảng trắng.
user9517 hỗ trợ GoFundMonica

@lain: Vâng, tôi chỉ đang trong quá trình chỉnh sửa câu trả lời của mình để bao gồm mẹo cho khoảng trắng :-)
dtoubelis

3

Lệnh sau sẽ xóa tất cả các tệp khỏi thư mục hiện tại :

find . -type f -exec rm {} \;

2
-name '*'không có nghĩa là "tất cả các tập tin". Các tập tin được nói với:-type f
poige


1

Kudos để quantas trả lời, đây là một số bổ sung.

Nếu bạn muốn xóa các tập tin với một mẫu tên cụ thể, bạn có thể viết nó như thế này. Cũng được thêm -print để bạn có thể thấy những gì đang xảy ra khi các tệp đang bị xóa.

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete

Ví dụ, điều này xóa tất cả các jpeg trong mydirectory.

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.