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 find
và xargs
sử 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 -delete
hà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_MAX
giới hạn của hệ thống mà không cần xargs
.
ARG_MAX
tôi cũng sẽ đề cập rằng đó find . -name "*.txt" -exec rm {} \;
sẽ là một "cú đánh an toàn"
-print0
phả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
-0
thay 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 rm
làm việc cho hai tập tin từ?