Câu trả lời:
Trong trường hợp bạn không thể xóa thư mục, bạn luôn có thể sử dụng find.
find . -maxdepth 1 -type f -exec rm -f {} \;
Điều đó sẽ xóa tất cả các tệp trong thư mục hiện tại và chỉ thư mục hiện tại (không phải thư mục con).
find dir/to/delete -delete
(Không sinh ra một rm
quy trình cho mỗi tệp để xóa).
find dir/to/delete -type f -delete
tìm thấy . -maxdepth 1 -type f -exec rm -f {} \;
nó chỉ đơn giản là mất quá nhiều thời gian (một lần thực hiện rm trên mỗi tệp).
cái này hiệu quả hơn nhiều:
tìm thấy . -maxdepth 1 -type f -print0 | xargs -r0 rm -f
vì nó cần càng nhiều tên tệp làm đối số cho rm càng nhiều càng tốt, sau đó chạy rm với tải tên tệp tiếp theo ... có thể xảy ra rằng rm chỉ được gọi 2 hoặc 3 lần.
ionice
ngay trước đó rm
là một ý tưởng tốt nếu máy tính được người khác sử dụng cùng một lúc.
Cả hai điều này sẽ làm tròn vấn đề. Có một phân tích về hiệu suất tương ứng của từng kỹ thuật ở đây .
find . -name WHATEVER -exec rm -rf {} \;
hoặc là
ls WHATEVER | xargs rm -rf
Vấn đề bắt nguồn từ việc bash mở rộng "*" với mục everysingle trong thư mục. Thay vào đó, cả hai giải pháp này đều hoạt động thông qua từng tệp.
find . -print0 | xargs -0 rm
).
ls *
" và " *
" mở rộng ra danh sách đối số mà trình bao của bạn phàn nàn về việc quá dài. Làm " ls .
" thay vì (hoặc đi lên một cấp độ thư mục và làm " ls [dirname]
").
Tôi đã có thể làm điều này bằng cách sao lưu một cấp độ:
cd ..
Và chạy:
rm directory name -rf
Và sau đó tạo lại thư mục.
Tất cả những phát hiện này đều rất hay nhưng tôi hiếm khi nhớ chính xác danh pháp cần thiết khi tôi đang vội: thay vì tôi sử dụng ls. Như ai đó đề cập, ls. sẽ hoạt động nhưng tôi thích ls -1 như trong:
ls -1 | xargs -n 100 rm -rf
Con số -n xxx khá an toàn để chơi xung quanh khi vượt quá mức tối đa sẽ được tự động sửa (nếu vượt quá kích thước tối đa; xem -s) hoặc nếu vượt quá args-max cho một ứng dụng, nó thường sẽ được thay thế hiển nhiên
Cần lưu ý grep rất tiện để chèn vào giữa chuỗi này khi bạn chỉ muốn xóa một tập hợp con các tệp trong một thư mục lớn và không vì lý do gì muốn sử dụng find.
Câu trả lời này giả định rằng bạn đang sử dụng các tiện ích cốt lõi của Gnu cho ls, xargs & v.v.
Đây là phiên bản để xóa số lượng lớn tệp khi hệ thống cần duy trì phản hồi.
Nó hoạt động bằng cách phát hành công việc theo từng đợt nhỏ (100 tệp theo mặc định) và chờ một chút để các công việc khác hoàn thành.
Đã làm việc tuyệt vời để xóa hơn nửa triệu tệp từ thư mục duy nhất trên ext3. Nó in phần trăm được thực hiện như một phần thưởng nhỏ
noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
n=$((n+100));
sync;
echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
sleep 5;
done
Giải quyết các lỗi "đối số quá dài" hoặc "không thể phân bổ bộ nhớ"
Điều này đã lừa được hơn 220.000 tệp trong thư mục phiên ....
Ưu điểm: ngay lập tức bắt đầu xóa tệp
đường dẫn cd / đến / thư mục
ls -f | xargs rm -f -v
BẤM cho ảnh chụp màn hình của các tệp đang bị xóa - (đã xóa tất cả các tệp trong ~ 15 phút)
-f (sau ls) không được sắp đặt trước
-v (sau rm) hiển thị mỗi tệp bị xóa
-f (sau rm) buộc không có dấu nhắc trên các tệp được bảo vệ chống ghi
Mẹo: Trước tiên, đổi tên thư mục (phiên cũ thành session_old) để giữ các tệp được tạo tự động bổ sung không bị thêm trong khi bạn đang cố xóa các tệp. Bạn có thể làm lại thư mục gốc theo cách thủ công nếu nó không tự động như trong trường hợp của tôi