2016-12-30 20 views
7

Tôi có một thư mục với hơn 100.000 tệp. Tôi muốn biết nếu chuỗi "str1" tồn tại như là một phần của nội dung của bất kỳ tệp nào trong số này.grep - số lượng tệp giới hạn đọc

Lệnh: grep -l 'str1' * mất quá nhiều thời gian để đọc tất cả các tệp.

Tôi làm cách nào để yêu cầu grep ngừng đọc bất kỳ tệp nào khác nếu nó tìm thấy kết quả phù hợp? Bất kỳ một lớp lót?

Lưu ý: Tôi đã thử grep -l 'str1' * | head nhưng lệnh này chỉ mất nhiều thời gian như trước đó.

+0

Lệnh có hoạt động trong một thư mục có số lượng tệp nhỏ không? –

+0

Có thể, đã trả lời ở đây: http://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop –

+0

'head -1' sẽ thực hiện thủ thuật –

Trả lời

5

Đặt tên 100.000 tên tệp trong lệnh của bạn args sẽ gây ra sự cố. Nó có thể vượt quá kích thước của một dòng lệnh shell.

Nhưng bạn không phải đặt tên tất cả các tệp nếu bạn sử dụng tùy chọn đệ quy chỉ với tên của thư mục mà tệp đang ở (là . nếu bạn muốn tìm kiếm tệp trong thư mục hiện tại):

grep -l -r 'str1' . | head -1 
+0

Trừ trường hợp '-r' không hoàn toàn chuẩn ... –

+0

Để tăng thêm một chút sức mạnh, tôi sẽ quăng trong' LC_ALL = "C" grep -m1 -l -r 'str1'. | đầu -1' – bishop

+2

@gniourf_gniourf, câu hỏi của OP được gắn thẻ [tag: linux] vì vậy tôi nghĩ rằng nó an toàn để giả sử họ đang sử dụng GNU grep. –

3

Sử dụng để grep ngừng sau khi tìm kết quả trùng khớp đầu tiên trong tệp. Nó là cực kỳ hiệu quả cho các tập tin văn bản lớn.

grep -m 1 str1 * /dev/null | head -1 

Nếu có một tệp, thì/dev/null ở trên đảm bảo rằng grep in ra tên tệp ở đầu ra.

Nếu bạn muốn dừng lại sau khi tìm thấy những trận đấu đầu tiên trong bất kỳ tập tin:

for file in *; do 
    if grep -q -m 1 str1 "$file"; then 
    echo "$file" 
    break 
    fi 
done 

Vòng lặp for cũng giúp bạn tiết kiệm từ các vấn đề too many arguments khi bạn có một thư mục với một số lượng lớn các tập tin.

+0

Rất tốt. Tôi đã hy vọng sẽ tìm thấy một lớp lót, nhưng những tuyên bố này sẽ làm. – user2070775

+1

Lưu ý rằng OP đã sử dụng '-l' làm cho' grep' dừng sau trận đấu đầu tiên. –

+1

'cho tệp trong *' sẽ không bao giờ bị "quá nhiều đối số", đó là giải pháp cho nó. Xem ví dụ tại đây: http://www.in-ulm.de/~mascheck/various/argmax/ –

Các vấn đề liên quan