Làm cách nào để sử dụng grep để tìm kiếm thư mục hiện tại cho tất cả các tệp có chuỗi Chuỗi hello hello mà chỉ hiển thị các tệp .h và .cc?


138

Làm cách nào để sử dụng grep để tìm kiếm thư mục hiện tại cho bất kỳ và tất cả các tệp có chứa chuỗi "xin chào" và chỉ hiển thị các tệp .h và .cc?

Câu trả lời:


161
grep -r --include=*.{cc,h} "hello" .

Điều này đọc: tìm kiếm đệ quy (trong tất cả các thư mục con) cho tất cả các tệp .cc OR .h có chứa "xin chào" tại thư mục .(hiện tại) này

Từ một câu hỏi stackoverflow khác


5
Trong bài viết gốc, bạn đã nói "thư mục hiện tại" và không có gì về việc cần đệ quy hoặc trong các thư mục con (tôi nhận ra bạn đã đề cập đến nó trong một bài đăng sau). Đối với những người quan tâm đến cách làm điều đó chỉ trong thư mục hiện tại, nó grep -si "hello" --include=*.{cc,h} ./* ./.*(cũng tìm kiếm các tệp ẩn). Đây là phiên bản chung để tìm kiếm một chuỗi trong tất cả / tệp ẩn : grep -s "hello" * .*. Có thể nói chung là hữu ích nhất (và đơn giản nhất), điều này tìm kiếm tất cả các tệp không bị ẩn cho "xin chào": grep -si "hello" ./* Nhờ vào bài đăng này: askubfox.com/a/777456
jbobbins

1
grep -r --include=*.{java,py} "hello" .

Vì một số lý do, điều này không hoạt động trên macOS, ngay cả khi sử dụng tiện ích GNU grep.
xApple

49

Bạn có thể chuyển vào các ký tự đại diện thay vì chỉ định tên tệp hoặc sử dụng stdin.

grep hello *.h *.cc

Tôi cũng cần tất cả các thư mục con
stackoverflow

Thêm -Rkhông làm việc không may. Nó mở rộng *trước khi đi đệ quy.
Thợ mỏ Donald

Câu trả lời của Noufal là những gì bạn đang tìm kiếm nếu bạn cần các thư mục con
Donald Miner

8
@Jammin Bạn nên rõ ràng về điều đó khi đặt câu hỏi. Câu trả lời này là câu trả lời "chính xác" cho câu hỏi đã nêu của bạn.
jordanm

$ grep -R hello *# tìm từ tất cả các từ có chứa hello (bao gồm cả thư mục phụ)

19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Kiểm tra các trang hướng dẫn findxargsđể biết chi tiết.


1
Bạn phải có -print0sau khi '*.cc'bạn không có hành động cho phần tìm kiếm đó. Hoặc bạn phải chèn dấu ngoặc đơn vào đó : find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler

Cảm ơn đã nhận thấy điều đó. Tôi đã chỉnh sửa câu trả lời để "sửa" nó.
Noufal Ibrahim

3
Bạn cũng có thể sử dụng find -exec +cú pháp thay vì xargs
jordanm

@jordanm: Có: -exec grep "hello" {} +trong đó cặp dấu ngoặc nhọn thể hiện tên tệp. Gợi ý tốt.
Jonathan Leffler

10

Để tìm kiếm trong thư mục hiện tại đệ quy:

grep -r 'myString' .

5

Nếu bạn cần một tìm kiếm đệ quy, bạn có nhiều lựa chọn. Bạn nên cân nhắc ack.

Không, nếu bạn có GNU findxargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

Việc sử dụng /dev/nullđảm bảo bạn có được tên tập tin được in; các -print0-0 giao dịch với tên tập tin chứa khoảng trống (dòng mới, vv).

Nếu bạn không có tên khó tính (có dấu cách, v.v.), bạn có thể sử dụng:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Điều này có thể chọn một vài tên mà bạn không có ý định, bởi vì mô hình khớp sẽ mờ hơn (nhưng đơn giản hơn), nhưng nếu không thì hoạt động. Và nó hoạt động với các phiên bản không phải của GNU findxargs.


lưu ý bạn cũng có thể nóifind ... -exec grep "hello" {} +
fedorqui 'SO ngừng gây hại'

5

Nếu tôi đọc kỹ câu hỏi của bạn, bạn yêu cầu "grep để tìm kiếm thư mục hiện tại cho bất kỳ và tất cả các tệp có chứa chuỗi" xin chào "và chỉ hiển thị các tệp .h và .cc". Vì vậy, để đáp ứng yêu cầu chính xác của bạn ở đây là trình của tôi:

Điều này sẽ hiển thị tên tập tin:

grep -lR hello * | egrep '(cc|h)$'

... và điều này sẽ hiển thị tên và nội dung của tệp:

grep hello `grep -lR hello * | egrep '(cc|h)$'`

2
grep -l hello **/*.{h,cc}

Bạn có thể muốn shopt -s nullglobtránh các thông báo lỗi nếu không có tệp .h hoặc không có .cc.


4
Tôi biết cách sử dụng google, v.v. Tôi đã hỏi nó ở đây vì một số câu trả lời có "-l" và thật tuyệt khi có tất cả thông tin ở một nơi.
Andrew Swift

-l (Chữ thường "el") Loại bỏ đầu ra bình thường. In tên của từng tệp đầu vào mà từ đó đầu ra thường được in. Quá trình quét / tìm kiếm sẽ dừng lại ở trận đấu đầu tiên.
Rex CoolCode Charles

-1

Cách đơn giản nhất: grep -Ril "Your text" /


1
Điều này không chỉ hiển thị các tệp .h hoặc .cc và rất hữu ích để giải thích các tùy chọn bạn đã sử dụng và tại sao.
kon tâm lý
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.