Tìm kiếm văn bản đệ quy với mẫu grep và tệp


46

Cho ví dụ cấu trúc thư mục này:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

Làm cách nào để thực hiện tìm kiếm văn bản đệ quy trên tất cả *.txtcác tệp có greptừ "/"?

( "grep -r <pattern> *.txt"không thành công khi chạy từ "/", vì không có .txttệp nào trong thư mục đó.)

Câu trả lời:


61

Phiên bản GNU Grep của tôi có một công tắc cho việc này:

grep -R --include='*.txt' $Pattern

Mô tả như sau:

--include=GLOB

Chỉ tìm kiếm các tệp có tên cơ sở khớp với GLOB (sử dụng khớp ký tự đại diện như được mô tả trong phần - bao gồm).


19

Nếu bạn có số lượng tệp lớn, sẽ rất hữu ích khi kết hợp xargs vào lệnh để tránh lỗi list Danh sách đối số quá dài '.

find . -name '*.txt' -print | xargs grep <pattern>

6
Nếu có khoảng trắng trong bất kỳ tên tệp hoặc thư mục nào, hãy sử dụng biểu mẫu này: find. -name '* .txt' -print0 | xargs -0 grep <mẫu>
Jason Luther

2
Và tất nhiên, có vấn đề về tên tập tin bắt đầu bằng -.
TJ Crowder

greplà nhanh hơn của find.
Nabi KAZ

2

bạn có thể tận dụng của bạn zsh's EXTENDED_GLOBtùy chọn ( tài liệu )

grep <pattern> **/*.txt

Chỉ khi OP đang sử dụng zsh, nhưng dù sao cũng thú vị.
Luật29


0
find . -name '*.txt' -type f -exec grep <pattern> {} \;

thay vào đó, bạn có thể muốn sử dụng "find. -name '* .txt' -type f -exec grep <pattern> {} +" để nó hoạt động tương tự như cách xác định từ Mark Robinson - chỉ hoạt động với GNU find theo hiểu biết của tôi
dị

0

Câu trả lời của Manni sẽ tạo ra một quy trình grep mới cho mỗi tệp văn bản. Nếu bạn có nhiều tệp văn bản ở đó, bạn có thể xem xét việc sắp xếp mọi tệp trước và chọn tệp .txt khi hoàn tất:

grep -r <pattern> * | grep \.txt:

Đó là nhiều đĩa hơn, nhưng dù sao có thể nhanh hơn.


0

Đó là năm 2019 và không có cách nào tôi vẫn sử dụng grep để tìm kiếm văn bản đệ quy.

Câu trả lời hôm nay của IMHO nên bao gồm ripgrep :

rg <pattern> -ttxt
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.