grep tất cả các tệp .java trong một thư mục cho một chuỗi cụ thể


12

Làm cách nào để tìm kiếm tất cả các tệp .java cho một chuỗi đơn giản (không phải regex) trong thư mục hiện tại và tất cả các thư mục con trên Mac OS X? Tôi chỉ muốn in một danh sách các tên tập tin và thư mục phù hợp.


Cảm ơn đã hỏi điều này vì vậy tôi không phải. Bây giờ tôi chỉ cần tìm ra cách loại trừ ".git" và tôi đã hoàn thành một chút.
Dan Rosenstark

Tôi nghĩ rằng câu trả lời của js ngắn gọn hơn, vẫn hút bạn phải loại ra - bao gồm, nhưng vẫn còn. Có lẽ chỉ cần viết một bí danh để che giấu điều đó
Craig Tataryn

Câu trả lời:


19

Và luôn luôn phổ biến

find . -name '*.java' | xargs grep -l 'string'

EDIT (bởi Frank Szczerba):

Nếu bạn đang xử lý tên tệp hoặc thư mục có khoảng trắng trong đó, cách an toàn nhất để thực hiện việc này là:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Luôn luôn có nhiều hơn một cách để làm điều đó.



11

Câu trả lời UNIX truyền thống sẽ là câu trả lời được chấp nhận cho câu hỏi này:

find . -name '*.java' | xargs grep -l 'string'

Điều này có thể sẽ hoạt động cho các tệp Java, nhưng không gian trong tên tệp phổ biến hơn nhiều trên Mac so với trong thế giới UNIX truyền thống. Khi tên tệp có dấu cách được truyền qua đường dẫn ở trên, xargs sẽ diễn giải các từ riêng lẻ thành các tên khác nhau.

Những gì bạn thực sự muốn là tách biệt các tên để làm cho ranh giới rõ ràng:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Cách khác là để tìm chạy grep cho bạn, như Mark gợi ý, mặc dù cách tiếp cận đó chậm hơn nếu bạn đang tìm kiếm số lượng lớn tệp (vì grep được gọi một lần trên mỗi tệp thay vì một lần với toàn bộ danh sách tệp).


Bạn cũng có thể sử dụng tùy chọn "--replace" trong xargs để xử lý tên tệp có khoảng trắng trong chúng: ... | xargs --replace grep 'chuỗi' '{}' ({} sẽ được thay thế bằng tên tệp)
arathorn

1
Các phiên bản tìm kiếm hiện đại (bao gồm phiên bản được cài đặt trên OS X) hỗ trợ "-exec <lệnh> {} +" trong đó dấu cộng ở cuối (thay vì \;) cho biết tìm thay thế {} bằng "càng nhiều tên đường dẫn càng tốt ... Điều này tương tự với xargs (1) "(từ trang man).
Doug Harris

7

Sử dụng grep tốt hơn grep, ack :

ack -l --java  "string" 

3
ack không được cài đặt trên Mac OS X theo mặc định.
John Topley

Tôi không biết "mặc định" nghĩa là gì. Trên nhiều hệ điều hành, bạn chọn những gì bạn cài đặt nên rất khó tìm thấy các chương trình luôn có mặt. Tại một thời điểm, một trình biên dịch C luôn ở đó và Perl không phổ biến ...
bortzmeyer

1
Nó có nghĩa là nó là một phần của cài đặt hệ điều hành tiêu chuẩn. Tôi đã cài đặt các công cụ dành cho nhà phát triển trên máy Mac của mình và họ không cài đặt ack. Bạn phải tự cài đặt nó. Nếu bạn có nó, thì đó là một cú pháp tốt.
John Topley

Trong trường hợp của ack, đó là một chương trình Perl duy nhất không có phụ thuộc mô-đun. Nếu bạn có thể "cài đặt" các chương trình trong thư mục ~ / bin của mình, thì bạn có thể dễ dàng "cài đặt" ack.
Andy Lester

4

Điều này thực sự sẽ sử dụng một biểu thức chính quy nếu bạn muốn, chỉ cần tránh xa các siêu ký tự hoặc thoát chúng và bạn có thể tìm kiếm các chuỗi.

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
Đây dường như là câu trả lời tốt nhất ở đây - nếu grep làm tất cả, tại sao lại sử dụng find & xargs?
Peter Gibson

FYI, với những gì được hỏi trong câu hỏi, nó phải là chữ "l" không lớn "L" trong lệnh đó
Craig Tataryn

Craig nói đúng, tôi đã sửa câu trả lời của mình.
js.

1

Vì đây là câu hỏi về OSX, đây là câu trả lời cụ thể hơn về OSX.

Bỏ qua findvà sử dụng Spotlighttừ dòng lệnh. Mạnh mẽ hơn nhiều!

LINE LINE SPOTLIGHT - TÌM MEETS GREP

Hầu hết mọi người không biết bạn có thể thực hiện tìm kiếm Spotlight từ dòng lệnh. Tại sao phải nhớ tất cả các tùy chọn tìm kiếm và grep phức tạp và những gì không phải khi bạn có thể để Spotlight thực hiện công việc cho bạn. Giao diện dòng lệnh đến Spotlight được gọi là mdfind. Nó có tất cả sức mạnh tương tự như tìm kiếm GUI Spotlight và hơn thế nữa vì nó có thể được viết theo dòng lệnh!


0

Hãy thử đi:

grep -rl "string" */*java

1
Điều này mang lại "grep: * / * java: Không có tệp hoặc thư mục như vậy" trên Mac OS X.
John Topley

Vấn đề ở đây là nó sẽ chỉ tìm thấy các tệp * .java sâu một cấp. Xem câu trả lời của Mark Thalman cho IMHO cách thích hợp để làm điều đó.
Ludwig Weinzierl

Xin lỗi, không phải ở máy Mac của tôi. Không phải phiên bản Mac của grep có cờ -r (đệ quy)?
dwj

Nó có, nhưng đó là đầu ra mà tôi có được khi tìm kiếm một chuỗi mà tôi biết có trong các tệp.
John Topley

0

Bạn cũng có thể sử dụng chương trình GUI như TextWrangler để thực hiện tìm kiếm trực quan hơn trong đó các tùy chọn nằm trong giao diện.


0
grep "(your string)" -rl $(find ./ -name "*.java")

Nếu bạn muốn bỏ qua trường hợp, thay thế -rl bằng -irl. (chuỗi của bạn) cũng có thể là một biểu thức chính quy nếu bạn thấy cần.

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.