Để theo dõi câu trả lời của mouviciel, bạn cũng có thể làm điều này như một vòng lặp for, thay vì sử dụng xargs. Tôi thường thấy xargs cồng kềnh, đặc biệt nếu tôi cần làm một cái gì đó phức tạp hơn trong mỗi lần lặp.
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm $f; done
Như một số người đã bình luận, điều này sẽ thất bại nếu có không gian trong tên tệp. Bạn có thể giải quyết vấn đề này bằng cách tạm thời đặt IFS (bộ tách trường nội bộ) thành ký tự dòng mới. Điều này cũng thất bại nếu có các ký tự đại diện \[?*
trong tên tệp. Bạn có thể giải quyết vấn đề đó bằng cách tạm thời vô hiệu hóa mở rộng ký tự đại diện (globalbing).
IFS=$'\n'; set -f
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm "$f"; done
unset IFS; set +f
Nếu bạn có dòng mới trong tên tệp của mình, thì nó cũng không hoạt động. Bạn tốt hơn với một giải pháp dựa trên xargs:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -print0 | xargs -0 rm
(Các dấu ngoặc thoát được yêu cầu ở đây để -print0
áp dụng cho cả hai or
mệnh đề.)
GNU và * BSD find cũng có một -delete
hành động, trông như thế này:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -delete
rm
là một phần của mã OP, nhưng nó không thực sự liên quan đến câu hỏi được hỏi. Tôi nghĩ sẽ an toàn hơn nếu câu trả lời được thực hiện bằng cách sử dụng một lệnh vô hại như thế nàoecho
.