Làm thế nào tôi có thể đệ quy grep tệp cụ thể trong một thư mục?


14

Tôi mới sử dụng linux và grep và đang cố gắng tìm đường.

Bằng cách sử dụng find -name *.javatôi có thể tìm thấy tên của tất cả các tệp java trong một thư mục cụ thể. Giả sử tôi muốn đếm số lần fooxảy ra trong các tệp này, tôi sẽ làm thế nào?

Tôi đã thử những thứ như:

grep -r "foo" *.java

và nhận được phản hồi như:

grep:  *.java:  No such file or directory

Có ý kiến ​​gì không?



1
Xin lỗi, lần sau tôi sẽ chăm chỉ hơn. Đáng chú ý là các câu hỏi rất giống nhau.
Eric Wilson

1
Tiêu đề của 3512 có thể tốt hơn rất nhiều . "Câu hỏi sử dụng grep cơ bản" không cho bạn biết nhiều về câu hỏi thực tế. Có lẽ chúng ta sẽ có nhiều bản sao hơn trừ khi nó được sửa.
Richard Hoskins

1
@richardhoskins, cố định.
John T

Câu trả lời:


16
find . -name '*.java' | xargs grep <your pattern here>

5
Tốt hơn hết, hãy sử dụng các mục kết thúc null để tên tệp có khoảng trắng trong đó không bị tách thành hai tên tệp: find. -name '* .java' -type f -print0 | xargs -0 grep <mẫu của bạn ở đây>
CoverosGene

1
@CoverosGene: Bạn có thể sử dụng tùy chọn --replace để xargs để xử lý việc đó - như thế này: ... | xargs --replace grep "{}" <mẫu>
arathorn

cảm ơn nhiều, tôi biết phải có một lệnh làm những gì xargs.
Eric Wilson

6

Có một công cụ được thiết kế đặc biệt cho loại nhu cầu này: ack .

ack là một công cụ như grep, nhắm đến các lập trình viên với các cây mã nguồn không đồng nhất lớn

Đồng thời đọc "10 lý do hàng đầu để sử dụng ack thay vì grep." tại trang ack .


1
Meh. Một công cụ unix thực sự cần một tên đệ quy đề cập đến di sản của nó ... như abtg [ABTG's Better Than Grep], hoặc một cái gì đó. ACK? Suy nghĩ tốt duy nhất về điều đó là tác giả của NACK được cải tiến đã có một cái tên được chọn ra;)
Mikeage

Một trong những lý do tôi thực sự yêu thích ack là bạn có thể chỉ định các loại tệp. Ví dụ: tôi với "ack --html <mẫu>" nó tìm kiếm tất cả các tệp .html, .htm, .xhtml, .dhtml, v.v. của tôi trong một lần.
Mark van Chay

Ack đã thay thế khá nhiều grep cho tôi.
Ryan C. Thompson


0

tìm thấy . -type f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l


3
Chào mừng bạn đến với SuperUser! Bạn sẽ thấy rằng câu trả lời của bạn được chú ý nhiều hơn khi đó là câu hỏi hiện tại hơn (câu hỏi này là từ năm 2009) và khi bạn giải thích lý do tại sao câu trả lời của bạn tốt hơn câu trả lời đã được chấp nhận.
Eric Wilson
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.