Как вернуть имя файла и номер строки с помощью find… -exec grep?

45

При использовании find, как я могу вернуть имя файла и номер строки при поиске строки? Мне удается вернуть имя файла в одной команде и номера строк с другой, но я не могу объединить их.

Имена файлов: find . -type f -exec grep -l 'string to search' {} \;

Номера строк: find . -type f -exec grep -n 'string to search' {} \;

Danny_Joris
источник

Ответы:

51

Переключатель командной строки -Hзаставляет grepпечатать имя файла, даже с одним файлом.

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

Обратите внимание, что, как говорит Кодзиро в комментарии , это не является частью стандарта POSIX; он есть как в GNU, так и в BSD grep, но возможно, что в некоторых системах его нет (например, Solaris).

Kevin
источник
4
Этот ответ можно улучшить, указав, что -Hфлаг grepявляется нестандартным расширением GNU, и предложив альтернативный подход для не-GNU систем.
Кодзиро
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(или с GNU grep, смотрите -Hопцию)

Стефан Шазелас
источник
оба + и -H работают отлично, спасибо!
Danny_Joris
И связано с этим ответом: unix.stackexchange.com/questions/3682/…
Danny_Joris
4
+1 Правильно, потому что grepналичие нескольких аргументов имени файла вынудит его вывести совпадающие имена файлов. Умная!
Кодзиро
-1

Если ваш grep поддерживает рекурсивный -rфлаг, это решает ваш запрос:

grep -rn "String to search " * 
сойка
источник
1
Это правда, но я не вижу, что это добавляет к существующим ответам.
Wildcard
И если в текущем каталоге есть только один (не точечный) файл, он не отображает имя файла.
G-Man говорит «Восстановить Монику»