gì bạn đã viết gửi một danh sách các newline tách ra tên tập tin (và đường dẫn) đến rm
, nhưng rm không biết phải làm gì với đầu vào đó. Nó chỉ mong đợi các tham số dòng lệnh.
xargs
có đầu vào, thường ngăn cách bởi dòng mới, và đặt chúng trên dòng lệnh, vì vậy thêm xargs làm những gì bạn đã làm việc:
find . -name .svn | xargs rm -fr
xargs
đủ thông minh rằng nó sẽ chỉ vượt qua nhiều đối số rm
vì nó có thể chấp nhận. Do đó, nếu bạn có một triệu tệp, nó có thể chạy rm
1.000.000/65.000 lần (nếu vỏ của bạn có thể chấp nhận 65,002 đối số trên dòng lệnh {65k tệp + 1 cho rm + 1 cho -fr}).
Là người đã adeptly chỉ ra, sau đây cũng làm việc:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Hai -exec
hình thức đầu tiên cả hai gọi rm
cho mỗi thư mục bị xóa, vì vậy nếu bạn đã có 1.000.000 thư mục, rm
sẽ được gọi 1.000.000 lần .Điều này chắc chắn là ít hơn lý tưởng. triển khai bản mới hơn của rm
cho phép bạn kết thúc lệnh với một +
chỉ ra rằng rm
sẽ chấp nhận như nhiều tranh cãi càng tốt:
find . -name .svn -exec rm -rf {} +
Phát hiện cuối cùng/xargs phiên bản sử dụng print0, mà làm cho tìm tạo ra sử dụng \0
như một terminator hơn là một dòng mới. Vì các hệ thống POSIX cho phép bất kỳ ký tự nào nhưng \0
trong tên tệp, đây thực sự là cách an toàn nhất để đảm bảo rằng các đối số được chuyển chính xác đến rm
hoặc ứng dụng đang được thực hiện.
Ngoài ra, có -execdir
sẽ thực thi rm
từ thư mục mà tệp được tìm thấy, thay vì tại thư mục cơ sở và -depth
sẽ bắt đầu với độ sâu đầu tiên.
Nguồn
2009-08-18 15:39:26
lệnh của bạn nên có tác dụng nếu bạn sử dụng 'xargs rm -rf' –
Bạn cũng có thể muốn thay đổi các lệnh xóa "rm -rfi "chỉ để đảm bảo bạn là người tích cực bạn muốn xóa các thư mục. – bedwyr
Không sử dụng xargs mặc dù .. bạn sẽ gặp rắc rối với các thư mục có dấu cách trong đó, vv Sử dụng tìm như được mô tả bên dưới. –