Як повернути і ім’я файлу, і номер рядка за допомогою find… -exec grep?


45

Як використовувати find, як повернути ім'я файлу та номер рядка під час пошуку рядка? Мені вдається повернути ім'я файлу в одній команді та номери рядків з іншою, але я не можу їх поєднувати.

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

Номери рядків: find . -type f -exec grep -n 'string to search' {} \;

Відповіді:


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.

Зауважте, що, як говорить у коментарі Kojiro , це не є частиною стандарту POSIX; він є і в GNU, і в BSD grep, але можливо, деякі системи його не мають (наприклад, Solaris).


4
Цю відповідь можна було б покращити, вказавши, що -Hпрапор grepє нестандартним розширенням GNU та створює альтернативний підхід для не-GNU систем.
kojiro

22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(або з GNU grep, див. -Hваріант)


і + і -Н чудово працюють, дякую!
Danny_Joris

І пов'язана з цією відповіддю: unix.stackexchange.com/questions/3682/…
Danny_Joris

4
+1 Правильно, тому що викликаючи grepнаявність декількох аргументів імені файлів, це змусить його виводити відповідні імена файлів. Розумний!
kojiro

-1

Якщо ваш grep підтримує рекурсивний -rпрапор, це вирішує ваш запит:

grep -rn "String to search " * 

1
Це правда, але я не бачу, що це додає до існуючих відповідей.
Wildcard

І якщо в поточному каталозі є лише один (не крапковий) файл, він не відображає ім'я файлу.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.