Đường ống find -name đến xargs dẫn đến tên tệp với khoảng trắng không được truyền vào lệnh


26

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 đó.


Hoàn thành đoán ở đây: không find -name "*\ *.txt" | xargs rmlàm việc cho hai tập tin từ?
The Wanderer

Câu trả lời:


49

Bạn có thể nói findxargssử 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.


1
Không thể nâng cao gấp đôi khó khăn :) vì bạn đã đề cập ARG_MAXtôi cũng sẽ đề cập rằng đó find . -name "*.txt" -exec rm {} \;sẽ là một "cú đánh an toàn"
kos

3
Do đó, nói rằng chủ: luôn luôn nhớ xargs -0.
Joshua

1
Điểm cực kỳ quan trọng: -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 ...
Kev

1

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


Đúng, điều này hoạt động.
Peter Mortensen

0

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

Nguồn trả lời trên SO .


Câu trả lời đó đề cập -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?
Peter Mortensen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.