Como retornar o nome do arquivo e o número da linha com find ... -exec grep?

45

Ao usar find, como retorno o nome do arquivo e o número da linha ao procurar uma string? Consigo retornar o nome do arquivo em um comando e os números de linha com outro, mas não consigo combiná-los.

Nomes de arquivos: find . -type f -exec grep -l 'string to search' {} \;

Números de linha: find . -type f -exec grep -n 'string to search' {} \;

Danny_Joris
fonte

Respostas:

51

A opção da linha de comando -Hforça grepa impressão do nome do arquivo, mesmo com apenas um arquivo.

% 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.

Observe que, como Kojiro diz em um comentário , isso não faz parte do padrão POSIX; está no GNU e no BSD grep, mas é possível que alguns sistemas não o possuam (por exemplo, Solaris).

Kevin
fonte
4
Esta resposta pode ser melhorada, apontando que o -Hsinalizador para grepé uma extensão GNU fora do padrão e propondo uma abordagem alternativa para sistemas não-GNU.
Kojiro #
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(ou com GNU grep, veja a -Hopção)

Stéphane Chazelas
fonte
ambos + e -H funcionam muito bem, obrigado!
Danny_Joris
E relacionado a esta resposta: unix.stackexchange.com/questions/3682/…
Danny_Joris
4
+1 Certo, porque fazer grepcom que vários argumentos de nome de arquivo forçam a saída dos nomes de arquivos correspondentes. Esperto!
Kojiro # 28/12
-1

Se o seu grep suporta o -rsinalizador recursivo , isso resolve sua solicitação:

grep -rn "String to search " * 
Jay
fonte
1
Isso é verdade, mas não vejo o que isso acrescenta às respostas existentes.
Curinga
E se houver apenas um arquivo (sem ponto) no diretório atual, isso não exibirá o nome do arquivo.
G-Man diz 'Reinstate Monica'