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ó-delete
hà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