Thông thường để xóa các tệp có khoảng trắng trong tên tệp của chúng, bạn sẽ phải chạy:
$ rm "file name"
nhưng nếu tôi muốn xóa nhiều tệp, vd:
$ find . -name "*.txt" | xargs rm
Điều này sẽ không xóa các tập tin có không gian trong đó.
Thông thường để xóa các tệp có khoảng trắng trong tên tệp của chúng, bạn sẽ phải chạy:
$ rm "file name"
nhưng nếu tôi muốn xóa nhiều tệp, vd:
$ find . -name "*.txt" | xargs rm
Điều này sẽ không xóa các tập tin có không gian trong đó.
Câu trả lời:
Bạn có thể nói findvà xargssử dụng cả hai đầu cuối null
find . -name "*.txt" -print0 | xargs -0 rm
hoặc (đơn giản hơn) sử dụng -deletehành động tích hợp sẵn củafind
find . -name "*.txt" -delete
hoặc (cảm ơn @kos)
find . -name "*.txt" -exec rm {} +
một trong hai nên tôn trọng ARG_MAXgiới hạn của hệ thống mà không cần xargs.
ARG_MAXtôi cũng sẽ đề cập rằng đó find . -name "*.txt" -exec rm {} \;sẽ là một "cú đánh an toàn"
-print0phải là tùy chọn cuối cùng (hoặc ít nhất là sau -name "*.txt") nếu không điều này sẽ đánh vào các tệp không còn giới hạn ở*.txt ...
Ngẫu nhiên, nếu bạn đã sử dụng một cái gì đó ngoài tìm kiếm, bạn có thể sử dụng tr để thay thế các dòng mới bằng byte rỗng.
Ví dụ. lớp lót sau sẽ xóa 10 tệp sửa đổi cuối cùng trong một thư mục, ngay cả khi chúng có khoảng trắng trong tên của chúng.
ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm
Lệnh xargs sử dụng các tab, dấu cách và các dòng mới làm dấu phân cách theo mặc định. Bạn có thể yêu cầu nó chỉ sử dụng các ký tự dòng mới ('\ n') với tùy chọn -d:
find . -name "*.txt" | xargs -d '\n' rm
-0thay vì -d(cho xargs) cho các hệ thống BSD. Ubuntu sử dụng cái gì? Câu trả lời được chấp nhận ở đây sử dụng -0. Cái gì đúng?
find -name "*\ *.txt" | xargs rmlàm việc cho hai tập tin từ?