tìm -print0 | xargs -0 grep không hoạt động như mong đợi trên Ubuntu 10.04


0

Tôi đã có một chút vấn đề kỳ lạ.

Nếu tôi chạy:

find . -iname '*.php' -o -iname '*.pl' -o -iname '*.html' | xargs grep -i users

Tôi nhận được vô số lỗi cho tên tệp chứa khoảng trắng, nhưng cũng có một số tệp khớp.

Tuy nhiên, nếu tôi thử các cách sau để tên tệp có khoảng trắng được xử lý chính xác, không có kết quả trùng khớp nào được trả về:

find . -iname '*.php' -o -iname '*.pl' -o -iname '*.html' -print0 | xargs -0 grep -i users

Tôi đang làm gì sai? Lệnh thứ hai sẽ trả về cho tôi ít nhất các tệp trùng khớp với tệp đầu tiên, nhưng tôi không nhận được bất kỳ kết quả khớp nào.

shell  find  xargs 

Tại sao bạn không chỉ thêm -exec grep -i users {} \;thay vì sử dụng xargs?

Nó vẫn không hoạt động. Nó hoạt động mà không cần thêm -o -iname ' .pl' -o -iname ' .html' mặc dù

Câu trả lời:


2

Và câu trả lời là:

find . \( -iname '*.php' -o -iname '*.pl' -o -iname '*.html' \) -print0 | xargs -r0 grep -i users

Những công việc này. Tôi đã không nhìn thấy nó trước đây nhưng một đồng nghiệp đã nói với tôi về nó.


Hoặc -iname '*.php' -print0 -o -iname '*.pl' -print0 ......
Jonathan Leffler

Bạn cũng có thể sử dụng \( -iname '*.php' ... \) -exec grep -i users +, trong đó dấu cộng có nghĩa là 'xây dựng một dòng lệnh như thế xargsmà không cần sử dụng xargs'. Sử dụng dấu chấm phẩy \;có nghĩa là thực thi grepcho mỗi tệp khi nó được tìm thấy.
Jonathan Leffler

0

Bạn không cần print0 và xargs, chức năng này đã được tích hợp sẵn trong find:

find . -iname "*.php" -o -iname "*.pl" -o -iname "*.html" -exec grep -i users {} + 
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.