Como posso usar o grep para mostrar apenas os nomes de arquivos no Linux?

1068

Como posso usar greppara mostrar apenas nomes de arquivos (sem correspondências em linha) no Linux?

Normalmente, estou usando algo como:

find . -iname "*php" -exec grep -H myString {} \;

Como posso obter os nomes dos arquivos (com caminhos), mas sem as correspondências? Eu tenho que usar xargs? Não vi uma maneira de fazer isso na minha greppágina de manual.

cwd
fonte
3
Quer dizer, você quer os nomes de arquivos que tenham pelo menos uma correspondência?
9789 Leonbloy
4
Ótima pergunta. Na verdade, comecei a usar isso para abrir uma lista de arquivos retornados pelo grep no Vim. vim $(grep -rl Something app/)
David Tuite
1
Você não pode listar arquivos usando o comando grep, é basicamente usado para buscar o texto desejado de um arquivo ou lista. Por exemplo, ps aux | grep 'apt-get' ou grep 'texto-para-encontrar' / path / to / file /
iamjayp

Respostas:

1625

A opção padrão grep -l(que é um L minúsculo) pode fazer isso.

Do padrão Unix :

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

Você também não precisa -Hneste caso.

Random832
fonte
37
A documentação desta opção é (como na maioria dos arquivos man) tão incerta! Pfff ... Incrível como o homem pode ser um pé no saco.
MonsieurDart
1
-H também mostra os jogos eles mesmos. A questão era apenas para nomes de arquivos.
26718 Hauke
@ Hauke ​​E minha resposta foi -l. Eu mencionei -H apenas porque o comando do usuário na pergunta incluía -H e é redundante quando -l é fornecido.
usar o seguinte código
2
Bom, eu pessoalmente gosto de usar isso com outras bandeiras grep -nrl "some text" .quando se olha para o texto em um conjunto de subpastas recursivamente
openwonk
142

Na grep(1)página do manual:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)
Ignacio Vazquez-Abrams
fonte
4
Parar na primeira partida é necessário e natureza.
Thomson
7
a documentação torna um pouco claro. "A verificação será interrompida na primeira correspondência" - indica que todos os nomes de arquivos serão impressos, mas a verificação da palavra correspondente será interrompida na primeira ocorrência.
TheMonkWhoSoldHisCode
2
@VishalP: Como não nos importamos com a localização das ocorrências, apenas com a existência delas, não faz sentido pesquisar em cada arquivo além da primeira ocorrência.
Ignacio Vazquez-Abrams
17
@ IgnacioVazquez-Abrams Exatamente. A primeira impressão do documento faz com que você sinta que apenas imprimirá o nome do primeiro arquivo. Você realmente precisa de algumas leituras para entender.
TheMonkWhoSoldHisCode
5
'A verificação do arquivo atual será interrompida na primeira correspondência.' seria muito mais claro.
sorrymissjackson
37

Para uma pesquisa simples de arquivos, você pode usar o grep -le as -ropções:

grep -rl "mystring"

Toda a pesquisa é feita pelo grep. Obviamente, se você precisar selecionar arquivos em algum outro parâmetro, find é a solução correta:

find . -iname "*.php" -execdir grep -l "mystring" {} +

A execdiropção cria cada comando grep por cada diretório e concatena os nomes de arquivos em apenas um comando ( +).

o homem de lata
fonte
0

Sua pergunta Como posso obter os nomes dos arquivos (com caminhos)

O seu exemplo de sintaxe encontra. -iname "* php" -exec grep -H myString {} \;

Minha sugestão de comando

sudo find /home -name *.php

A saída deste comando no meu sistema operacional Linux:

compose-sample-3 / html / mail / contact_me.php

Como você precisa do nome do arquivo com o caminho, aproveite!

apl
fonte
A pergunta pergunta especificamente como eles obtêm os nomes dos arquivos usando grep .
snakecharmerb 11/04