Làm cách nào tôi có thể xử lý khoảng trắng trong tên tệp khi sử dụng xargs khi tìm kết quả?


28

Một trong những thực tiễn phổ biến của tôi là thực hiện các greps trên tất cả các tệp thuộc một loại nhất định, ví dụ: tìm tất cả các tệp HTML có từ "rumpus" trong đó. Để làm điều đó, tôi sử dụng

find /path/to -name "*.html" | xargs grep -l "rumpus"

Đôi khi, findsẽ trả về một tệp có khoảng trắng trong tên của nó, chẳng hạn như my new file.html. Tuy nhiên, khi xargschuyển nó sang grep, tôi nhận được các lỗi sau:

grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory

Tôi có thể thấy những gì đang diễn ra ở đây: đường ống hoặc xargsđang xử lý khoảng trắng dưới dạng dấu phân cách giữa các tệp. Tuy nhiên, đối với cuộc sống của tôi, tôi không thể tìm ra cách ngăn chặn hành vi này. Nó có thể được thực hiện với find+ xargs? Hay tôi phải sử dụng một lệnh hoàn toàn khác?

Câu trả lời:


29

Sử dụng

find ... -print0 | xargs -0 ...

ví dụ

find /path/to -name "*.html"  -print0 | xargs -0  grep -l "rumpus"

từ trang tìm người

-print0
          True; print the full file name on the standard  output,  followed
          by  a  null  character  (instead  of  the  newline character that
          ‘-print’ uses).  This allows file names that contain newlines  or
          other  types  of  white space to be correctly interpreted by pro-
          grams that process the find output.  This option  corresponds  to
          the ‘-0’ option of xargs.

15

Bạn không cần sử dụng xargs , vì find có thể tự thực thi các lệnh. Khi làm điều này, bạn không phải lo lắng về các ký tự phiên dịch shell trong tên.

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

từ trang tìm người

Lệnh -exec {} +
Biến thể của hành động -exec này chạy lệnh được chỉ định trên các tệp đã chọn, nhưng dòng lệnh được xây dựng bằng cách nối thêm mỗi tên tệp đã chọn ở cuối; tổng số lệnh gọi của lệnh sẽ ít hơn nhiều so với số lượng tệp được khớp. Dòng lệnh được xây dựng theo cách tương tự như xargs xây dựng các dòng lệnh của nó. Chỉ một trường hợp của `{} 'được cho phép trong lệnh. Lệnh được thực thi trong thư mục bắt đầu.


Tôi sẽ nâng cao điều này nhưng tôi không còn lại cho ngày hôm nay - tôi sẽ làm nó vào ngày mai.
user9517 hỗ trợ GoFundMonica

1
@ Tôi - bạn đi đây (tôi đồng ý, nhân tiện).
Eduardo Ivanec

Chỉ cần sử dụng find bạn vẫn bỏ lỡ các tính năng của xargs, cộng với bạn phải đối phó với các quy tắc trích dẫn ngớ ngẩn. Xem đối số -P thành xargs nếu bạn có nhiều lõi / CPU.
Slartibartfast

8

Nếu các phiên bản find và xarg trên hệ thống của bạn không hỗ trợ -print0-0chuyển đổi (ví dụ: AIX find và xargs), bạn có thể sử dụng điều này:

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

Ở đây sed sẽ chăm sóc thoát khỏi không gian cho xargs.


Điều này giúp tôi vì tôi có một danh sách dài các tên tệp khó sản xuất mà tôi đã sử dụng nhiều lần. Tôi không thể đi findtất cả một lần nữa.
Scott M.
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.