Từ man xargs
xargs đọc các mục từ đầu vào tiêu chuẩn, được phân cách bằng khoảng trắng (có thể được bảo vệ bằng dấu ngoặc kép hoặc dấu ngoặc đơn hoặc dấu gạch chéo ngược) hoặc dòng mới và thực thi lệnh (mặc định là / bin / echo) một hoặc nhiều lần với bất kỳ đối số ban đầu nào được theo sau bởi các mục được đọc từ đầu vào tiêu chuẩn. Các dòng trống trên đầu vào tiêu chuẩn được bỏ qua.
Chúng tôi có thể (chủ yếu) sửa lỗi lệnh ban đầu của bạn bằng cách thay đổi dấu phân cách xargs thành một dòng mới:
ls | egrep '. ' | xargs -d '\n' rm
(đừng làm điều này ... đọc tiếp)
Nhưng nếu tên tệp chứa một dòng mới thì sao?
touch "filename with blanks
and newline"
Vì tên tệp Unix có thể chứa khoảng trắng và dòng mới , hành vi mặc định này thường có vấn đề; tên tệp chứa khoảng trống và / hoặc dòng mới được xargs xử lý không chính xác. Trong những tình huống này, tốt hơn là sử dụng tùy chọn -0 , để ngăn chặn các vấn đề như vậy.
ls
thực sự là một công cụ để con người tiêu thụ trực tiếp , thay vào đó chúng ta cần sử dụng find
lệnh có thể phân tách tên tệp bằng ký tự null ( -print0
). Chúng ta cũng cần yêu cầu grep sử dụng các ký tự null để phân tách đầu vào ( -z
) và đầu ra ( -Z
). Cuối cùng, chúng tôi nói với xargs cũng sử dụng các ký tự null ( -0
)
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
echo
đầu tiên, để bảo vệ khỏi lỗi chính tả. Thêmecho
ở phía trước và nó sẽ in ra tất cả các tệp mà nó sẽ xóa.