2016-04-27 2 views
6

Следующая команда находит все вхождения «некоторой строки» рекурсивно поиска в текущей директории и всех поддиректорийBash: Piping Найти в Grep

grep -r -n 'some string' . 

Эта команда рекурсивно просматривает текущий каталог и все суб- каталоги и возвращает все файлы вида * .axvw

find . -name '*.axvw' 

Я хочу, чтобы эти две команды вместе, так я получаю все из «мест где-то строка» рекурсивно поиска в текущем каталоге, но только глядя на файлы, оканчивающиеся в 'axvw ».

Когда я попытался запустить следующую команду ничего не было возвращено:

find . -name '*js' | grep -n 'some string' 

Что я делаю неправильно?

+1

Смотри ответы приведены здесь: http://serverfault.com/questions/9822/recursive-text-search-with-grep-and-file-patterns –

+0

Возможный дубликат [Как использовать трубу внутри -exec в поиске] (https://stackoverflow.com/questions/21825393/how-to-use-pipe-within-exec-in-find) – koppor

ответ

8

Вы можете использовать -exec опцию в find:

find . -name '*.axvw' -exec grep -n 'some string' {} + 

Или использовать xargs:

find . -name '*.axvw' -print0 | xargs -0 grep -n 'some string' 
+2

'-exec grep -n 'некоторая строка' {} +' сделало бы подход 'find -exec' конкурентоспособным с xargs по производительности и, как гарантируется, будет доступен в спецификации POSIX 2006 года. –

+0

Спасибо, да, хороший вопрос об использовании '+' вместо '\;' – anubhava

1

find . -name '*js' -exec grep -n 'some string' {} \;

Должен работать я думаю.

Редактировать: только для удовольствия вы также можете использовать двойной греп, которому я верю.

find . | grep 'some string' | grep js

+1

Нет, «двойной grep», который вы предлагаете, не помогает - это grepping имена файлов, а не содержимое, на обоих этапах. –