Рекурсивный поиск файлов с заданным именем и поиск экземпляров определенной фразы И отображение пути к этому файлу

У меня есть куча папок и подпапок. Каждый из них содержит, среди прочего, текстовый файл с именем index.yml с полезными данными. Я хочу выполнить поиск по всем различным файлам index.yml, чтобы найти экземпляры строки поиска. Я должен видеть несколько строк контекста и каталог найденного файла index.yml.

Это почти работает, но не дает мне имя файла:

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

Как я могу это сделать и получить имя файла?

Я застрял в Windows с использованием msys. Примечание. Кажется, у меня нет полного GNU grep, поэтому я не могу запустить grep --exclude или grep -R, как это предлагается в других вопросах SO.


person AndyL    schedule 21.08.2010    source источник


Ответы (2)


попробуй это:

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

примечание: на самом деле не тестировалось под msys.

person lesmana    schedule 21.08.2010
comment
Это правильный ответ для обычной Unix-подобной системы. Я не мог получить что-то подобное или разновидность xargs для работы с cygwin. - person Amir Afghani; 22.08.2010
comment
Большой! Спасибо. Как только SO позволит мне... я приму этот ответ. Кажется, какой-то срок. - person AndyL; 22.08.2010
comment
@AndyL {} заменяется найденным именем файла (или имени каталога). \; обозначает конец аргументов для exec. косая черта предназначена для выхода из оболочки точки с запятой. иногда также необходимо экранировать {}. - person lesmana; 22.08.2010
comment
Это обратная косая черта, а не косая черта. - person Dennis Williamson; 22.08.2010
comment
на osx нужно было указать путь для поиска, find . -name "index.yml" -exec grep -i -H -C4 pattern {} \; - person Andrew Homeyer; 04.09.2015

Одна возможность (я не знаю, что именно принимает msys):

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

/dev/null служит для того, чтобы гарантировать наличие по крайней мере двух путей, чтобы путь печатался при каждом совпадении. Параметр -H для grep имеет аналогичный эффект.

Конструкция -exec...+ в find вызывает передачу нескольких путей к одному экземпляру команды. Если это не реализовано, вам придется использовать -exec...\;.

person jilles    schedule 21.08.2010