Câu trả lời:
find . -name "*.exe" -exec rm -f '{}' +
Cái này có find định dạng lệnh và đối số, và nó cẩn thận tránh xáo trộn tên (bằng cách chuyển từng tên làm đối số riêng rm ). '+' Có nghĩa là "thực hiện càng nhiều càng tốt trong một lần thực hiện rm ".
-delete Không bao gồm. Nó ở trong GNU find; câu hỏi dành cho Linux; vì vậy nó có thể sử dụng -delete. Tuy nhiên, tất cả thế giới không phải là Linux và có thể sử dụng một câu trả lời di động.
Bạn có thể dẫn đầu ra từ find vào xargs, chỉ định rằng chỉ các dòng mới nên được coi là dấu phân cách giữa các tên tệp:
find -name '*.exe' | xargs -d \\n rm
Cách dễ dàng hơn để làm điều này là sử dụng ký tự null làm dấu phân cách:
find -name '*.exe' -print0 | xargs -0 /bin/rm
Xem find Trang chủ của một ví dụ thực hiện điều này.
Một tùy chọn khác là sử dụng lệnh bạn đã sử dụng, nhưng để đặt dấu phân cách đối số nội bộ của bash thành chỉ dòng mới:
IFS=$'\n'; rm $(find . -name "*.exe");
Đây $'...' cấu trúc trích dẫn được sử dụng để tạo ra một ký tự dòng mới. Cách tiếp cận này sẽ ít khả năng phục hồi hơn trong trường hợp danh sách tên tệp dài hơn so với sử dụng xargs.
-print0 và -0 lựa chọn; tên kia không hoạt động chính xác nếu tên chứa dòng mới (và đó là ký tự hợp lệ trong tên tệp Unix). Tương tự với hack IFS. Lưu ý rằng đây là các phần mở rộng dành riêng cho GNU (mặc dù rất nhạy cảm) theo tiêu chuẩn.
-d bản thân tôi chỉ vì nó ít gõ hơn và trong tên tập tin thực tế (ít nhất là đối với tôi) không bao giờ có dòng mới. Ngoài ra còn có lợi thế là bạn có thể lọc đầu ra của find thông qua các chương trình khác (grep, tail, v.v.) trước khi gửi nó đến xargs.
Thủ công thoát khỏi các nhân vật có thể giúp bạn.
find . -name "*.exe" | sed -s 's/\ /\\ /' | xargs rm -f
xargs chia tên ở chỗ trống. Bạn có thể sử dụng find . -name "*.exe" -print0 | xargs -0 rm -f, nơi -print0 kết thúc tên tệp bằng ASCII NUL và -0 có nghĩa là xargs đọc tên kết thúc bằng ASCII NUL. Lưu ý rằng đây là các phần mở rộng dành riêng cho GNU (mặc dù rất nhạy cảm) theo tiêu chuẩn.
find(1)có-deletehành động (có thể chỉ là GNU find only) sẽ lưu tất cả các quy trình con và các tùy chọn dòng lệnh rườm rà.find . -name '*.exe' -delete