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.
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âu trả lời:
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 đó.
mdfind
là một cách OSXy hơn để làm điều này !
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).
Sử dụng grep tốt hơn grep, ack :
ack -l --java "string"
Đ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" {} \;
grep -rl --include="*.java" simplestring *
Bỏ qua find
và sử dụng Spotlight
từ 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!
Hãy thử đi:
grep -rl "string" */*java
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.