Những gì bạn đã viết sẽ gửi một danh sách các tên tệp (và đường dẫn) được phân tách dòng mới tới 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
lấy đầu vào, thường được phân tách bằng các dòng mới và đặt chúng vào dòng lệnh, vì vậy việc thêm xargs làm cho những gì bạn đã làm:
find . -name .svn | xargs rm -fr
xargs
đủ thông minh để nó chỉ vượt qua càng nhiều đối số rm
mà 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 trình bao 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}).
Như mọi người đã chỉ ra một cách lão luyện, những điều sau đây cũng có tác dụng:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Cả hai -exec
hình thức đầu tiên đều 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. Việc triển khai mới hơn rm
cho phép bạn kết thúc lệnh với một +
dấu hiệu rm
sẽ chấp nhận càng nhiều đối số càng tốt:
find . -name .svn -exec rm -rf {} +
Phiên bản find / xargs cuối cùng sử dụng print0, giúp tìm đầu ra tạo ra sử dụng \0
như một bộ kết thúc thay vì 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 truyền chính xác rm
hoặc ứng dụng được thực thi.
Ngoài ra, có một tệp -execdir
sẽ thực thi rm
từ thư mục chứa tệp, thay vì ở thư mục cơ sở và tệp -depth
sẽ bắt đầu sâu trước.