2010-08-21 9 views
10

Tôi có một loạt thư mục và thư mục con. Mỗi cái chứa một trong số những thứ khác, một tệp văn bản có tên là index.yml với dữ liệu hữu ích. Tôi muốn tìm kiếm qua tất cả các tệp index.yml khác nhau để tìm các phiên bản của chuỗi tìm kiếm. Tôi phải có thể thấy một vài dòng ngữ cảnh và thư mục của tệp index.yml đã được tìm thấy.Đệ quy tìm kiếm các tệp của một tên cụ thể và tìm các phiên bản của một cụm từ cụ thể VÀ hiển thị đường dẫn đến tệp đó

này hầu hết các công trình, nhưng nó không cho tôi filename:

cat `find . -name 'index.yml'`| grep -i -C4 mySearchString 

Làm thế nào tôi có thể làm được điều này và nhận được tên tập tin?

Tôi bị kẹt trên Windows bằng cách sử dụng msys. Lưu ý tôi dường như không có grep GNU đầy đủ, vì vậy tôi không thể chạy grep --exclude hoặc grep -R như được đề xuất trong các câu hỏi SO khác.

Trả lời

10

thử điều này:

find -name "index.yml" -exec grep -i -H -C4 pattern {} \; 

lưu ý: không thực sự được thử nghiệm dưới msys.

+0

Đây là câu trả lời đúng cho một hệ thống unix bình thường như hệ thống. Tôi không thể có được một cái gì đó như thế này, hoặc một loạt xargs để làm việc trên Cygwin –

+0

Tuyệt vời! Cảm ơn. Ngay sau khi SO cho phép tôi .. tôi sẽ chấp nhận câu trả lời này. Có vẻ là một số giới hạn thời gian. – AndyL

+0

Vì vậy, những gì hiện {} \; làm gì? – AndyL

0

Một khả năng (Tôi không biết những gì msys chấp nhận chính xác):

find . -name index.yml -exec grep -i -C4 mySearchString /dev/null {} + 

Các /dev/null phục vụ để đảm bảo có ít nhất hai tên đường dẫn để các tên đường dẫn được in với mỗi trận đấu. Tùy chọn -H để grep có hiệu ứng tương tự.

-exec ... + xây dựng trong find khiến nhiều tên đường dẫn được chuyển đến một phiên bản lệnh. Nếu không được triển khai, bạn sẽ phải sử dụng -exec ... \;.