grep - liệt kê tên tệp nơi tìm thấy kết quả khớp


31

Tôi có một loạt các tập tin .html trong một thư mục. Tôi muốn xem qua từng tệp và khớp với một mẫu (MD5). Tất cả điều đó là đủ dễ dàng. Vấn đề là tôi cần biết tập tin phù hợp được tìm thấy trong.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Chỉ trả về nội dung trang HTML nơi tìm thấy kết quả khớp, nhưng nó không cho tôi biết tệp được tìm thấy. Làm cách nào tôi có thể grep để hiển thị tên tệp nơi tìm thấy kết quả khớp của tôi?


Đề xuất được cung cấp thực sự không hoạt động .... Tất cả những gì tôi nhận được là 'mèo đầu vào tiêu chuẩn' * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (đầu vào tiêu chuẩn): <html> <head> <title>
BeMy Friend 19/215

4
bạn đang thiếu điểm. Bạn không cần sử dụng mèo. Con mèo ngăn grep phân biệt các tập tin cá nhân.
muru

Bạn có thể tìm thấy bài viết Stack Overflow hữu ích này .
Pablo A

Câu trả lời:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
Như đã nói, đó là mặc định cho nhiều tệp, miễn là có nhiều hơn một tệp html, -Hlà không cần thiết.
muru

1
Xin lỗi câu hỏi của tôi đã gây khó chịu. Tôi nên nói rằng tôi đã làm việc này một thời gian và tôi đã sử dụng một số công tắc VÀ đã đọc trang MAN trong đó nói rằng nó liệt kê tên tệp theo mặc định .... Nhưng những gì tôi nhận được là (đầu vào tiêu chuẩn ) nơi nó sẽ liệt kê tên tệp.
BeMy Friend 19/2/2015

và đó chỉ là khi tôi đưa ra công tắc -H. Nếu tôi chỉ làm những gì tôi liệt kê trong OP, thì nó không cung cấp bất kỳ tên tệp nào.
Hãy là bạn của tôi

3
@BeMyFriend, vấn đề là cat. catcó nghĩa là nối. Nếu bạn nối tất cả các tệp togheter trước khi chuyển chúng tới grep, grepchỉ xem một tệp đầu vào tiêu chuẩn lớn và không thể (thiếu thực hiện bói toán) cung cấp cho bạn bất kỳ thông tin nào về các tệp đơn lẻ. Xem?. Cyrus, những gì về việc giải thích điều này trong câu trả lời?
Rmano

OK, vấn đề là lệnh mèo, nhưng điều gì có thể là một giải pháp?
Josef Klimuk

20

Tôi sử dụng cái này mọi lúc để tìm kiếm các tệp có chứa một chuỗi, TUYỂN DỤNG trong một thư mục (có nghĩa là, đi qua bất kỳ thư mục con phụ nào) grep -Ril "yoursearchtermhere"

  • R là tìm kiếm đệ quy (theo các liên kết tượng trưng)
  • i là làm cho nó không nhạy cảm
  • l chỉ là để liệt kê tên của các tập tin.

Vì vậy, trả lời câu hỏi của bạn grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlsẽ làm nhưng bạn chỉ có thể làm grep -Ril '75447A831E943724DD2DE9959E72EE31'để tìm chuỗi đó, không phân biệt chữ hoa chữ thường, trong bất kỳ tệp nào trong bất kỳ thư mục con nào


macOS yêu cầu một def file luôn, có thể nó là ký tự đại diện. Nếu không, nó giả định đầu vào từ stdin( grep: cảnh báo: tìm kiếm đệ quy của stdin , bất cứ đệ quy stdin đầu vào có nghĩa :-). Nói cách khác:grep -Ril 'texttofind' *
Ville

grep -RiH 'pattern'hiển thị tên tệp và dòng trùng khớp
Ikrom


2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Thay thế cho

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Làm ở trên sẽ tìm kiếm đệ quy trong thư mục và các thư mục con và in đường dẫn của tệp ...


grep -r -l là điều duy nhất làm việc với tôi.
Josef Klimuk

0

Câu trả lời được đăng bởi Cyrus là hoàn toàn đúng đắn và là The Right Way TM để thực hiện grepnếu chúng ta chỉ cần tìm tệp . Khi tên tệp cần phân tích cú pháp bổ sung hoặc thao tác trên tên tệp phù hợp, chúng ta có thể sử dụng whilevòng lặp với ifcâu lệnh. Dưới đây là một ví dụ trong đó danh sách tên tệp đến từ cấu trúc find+ được sử dụng rất phổ biến whileđể phân tích tên tệp an toàn.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

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.