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ố rmmà nó có thể chấp nhận. Do đó, nếu bạn có một triệu tệp, nó có thể chạy rm1.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 -exechình thức đầu tiên đều gọi rmcho mỗi thư mục bị xóa, vì vậy nếu bạn có 1.000.000 thư mục, rmsẽ đượ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 rmcho phép bạn kết thúc lệnh với một +dấu hiệu rmsẽ 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 \0như 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 \0trong 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 rmhoặc ứng dụng được thực thi.
Ngoài ra, có một tệp -execdirsẽ thực thi rmtừ thư mục chứa tệp, thay vì ở thư mục cơ sở và tệp -depthsẽ bắt đầu sâu trước.