Làm cách nào tôi có thể xóa tất cả các tệp khỏi một thư mục khi nó báo cáo danh sách Đối số của Java quá dài


Câu trả lời:


11

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).


gần như hoàn hảo (xem bài viết của tôi quá)
asdmin

2
Trên linux, bạn có thể làm điều đó nhanh hơn bằng cách sử dụng "+" thay vì "\;". Điều đó sẽ khiến nó xóa nhiều tệp hơn mỗi "rm" trong một lần.
Thomas

5
Thậm chí nhanh hơn: find dir/to/delete -delete(Không sinh ra một rmquy trình cho mỗi tệp để xóa).
Morten Siebuhr

Morten: Anh ấy không bao giờ đề cập đến việc muốn xóa chính thư mục, eh nói onky các tập tin. find dir/to/delete -type f -delete
richo

21
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.


5
Vui mừng khi thấy ai đó biết cách tìm kiếm hoạt động ... Cũng xem xét với gnu mới tìm hành động -delete hoặc lệnh -exec {} + hoạt động như xargs. Xem phần Hành động của 'man find'.
Kyle Brandt

Tôi không biết về -dec cmd {} +. Điều đó có vẻ khá hữu ích. Hơi chung chung hơn so với -delete :)
David Pashley

-delete có thể tốt, nhưng cá nhân tôi thích các lệnh có thể được sử dụng trên nhiều loại máy. Solaris hệ thống tôi làm việc với lớn tuổi, vì vậy -delete sẽ không làm việc trên chúng
asdmin

2
Thêm ionicengay trước đó rmlà 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.
Hubert Kario

6

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.


2
Giải pháp tìm kiếm chậm hơn với nhiều tệp vì nó gọi lệnh rm cho mỗi tệp. Giải pháp xargs nhanh hơn nhưng nó chỉ hoạt động khi tên tệp không chứa khoảng trắng (nếu không bạn cần GNU tìm và find . -print0 | xargs -0 rm).
cướp

"tìm. -name WHATEVER -print0 | xargs -0 rm -rf" sẽ hiệu quả hơn. find sẽ fork một rm cho mỗi tệp, trong đó xargs sẽ giảm nó xuống mức tối thiểu. Bạn cần -print0 và -0 để đối phó với các tệp có khoảng trắng. Có lẽ bạn cũng muốn sử dụng -depth trên find, vì vậy nó sẽ tìm kiếm sâu trước.
David Pashley

Lệnh ls sẽ không hoạt động, vì nó cũng trả về "danh sách đối số quá dài"
Brent

2
Bạn đang thực hiện " 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]").
James Sneeringer

thứ hai dòng lệnh (ls WHATEVER | xargs rm -rf) sẽ không làm việc vì lý do tương tự như câu hỏi đã không làm việc: Bất cứ điều gì được substituded bởi vỏ đến một chiều dài vượt quá
asdmin

3

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.


1
nó chỉ hoạt động nếu bạn không phải có thư mục vĩnh viễn và tất cả các tệp và thư mục sẽ bị xóa đệ quy. hầu hết các trường hợp trong cuộc sống của tôi, cách này sẽ không hiệu quả.
asdmin

2

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.


Điều này có hoạt động với một thư mục quá lớn để "ls" hoạt động không? (lỗi tương tự - danh sách tranh luận quá dài)
Brent

Có Brent: chỉ cần chắc chắn không sử dụng filespec khi gọi ls. Chỉ sử dụng -1 (dấu gạch ngang) như hình trên. Và như đã giải thích ở trên, hãy sử dụng grep sau ls nếu bạn cần ghép danh sách tệp. Nếu bạn gặp phải lỗi "quá dài" sau khi chắc chắn rằng bạn không sử dụng bất kỳ ký tự đại diện nào có ls, thì có lẽ xargs đang phàn nàn. Sử dụng 'xargs -n 5' thay vì 'xargs -n 100' và bạn chắc chắn nên an toàn, nếu chậm hơn một chút.
rixtertech

1

Bạn có thể sử dụng -exec +tùy chọn để tìm cái nào sẽ chạy rm càng ít lần càng tốt, có thể nhanh hơn.

find . -type f -exec rm '{}' +

0

Đâ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

0

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


Có gì mới trong câu trả lời của bạn bị thiếu từ những câu trước?
dùng2233709
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.