bash find xargs grep chỉ xảy ra một lần duy nhất


16

Có lẽ nó hơi lạ - và có thể có những công cụ khác để làm điều này nhưng, ừm ..

Tôi đang sử dụng lệnh bash cổ điển sau đây để tìm tất cả các tệp có chứa một số chuỗi:

find . -type f | xargs grep "something"

Tôi có một số lượng lớn các tập tin, trên nhiều độ sâu. sự xuất hiện đầu tiên của "một cái gì đó" là đủ cho tôi, nhưng tìm thấy tiếp tục tìm kiếm và mất nhiều thời gian để hoàn thành phần còn lại của các tệp. Những gì tôi muốn làm là một cái gì đó như một "phản hồi" từ grep trở lại để tìm thấy để tìm có thể ngừng tìm kiếm thêm tập tin. Là một điều như vậy có thể?

Câu trả lời:


20

Chỉ cần giữ nó trong phạm vi tìm kiếm:

find . -type f -exec grep "something" {} \; -quit

Đây là cách nó hoạt động:

Ý -execchí làm việc khi -type fsẽ là sự thật. Và bởi vì greptrả về 0(thành công / đúng) khi -exec grep "something"có kết quả khớp, -quitsẽ được kích hoạt.


8
find -type f | xargs grep e | head -1

thực hiện chính xác điều đó: khi headchấm dứt, phần tử ở giữa của đường ống được thông báo với tín hiệu 'đường ống bị vỡ', lần lượt chấm dứt và thông báo find. Bạn sẽ thấy một thông báo như

xargs: grep: terminated by signal 13

trong đó xác nhận điều này.


+1 để giải thích và thay thế, mặc dù câu trả lời khác có vẻ thanh lịch hơn đối với tôi, vì nó tự túc hơn
hello_earth

8

Để làm điều này mà không thay đổi công cụ: (Tôi yêu xargs)

#!/bin/bash
find . -type f |
    # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
    # grep -m1: show just on match per file
    # grep --line-buffered: multiple matches from independent grep processes
    #      will not be interleaved
    xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
        # Error output (stderr) is redirected to this command.
        # We ignore this particular error, and send any others back to stderr.
        grep -v '^xargs: .*: terminated by signal 13$' >&2
    ) |
    # Little known fact: all `head` does is send signal 13 after n lines.
    head -n 1

1
+1 không bao giờ biết xargs sẽ có khả năng đa nhiệm như vậy - cảm ơn vì những bình luận khác! :)
xin chào
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.