Come posso usare grep per mostrare solo nomi di file su Linux?


1068

Come posso usare grepper mostrare solo i nomi di file (nessuna corrispondenza in linea) su Linux?

Di solito sto usando qualcosa come:

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

Come posso ottenere solo i nomi dei file (con percorsi), ma senza le corrispondenze? Devo usare xargs? Non ho visto un modo per farlo sulla mia greppagina man.


3
Vuoi dire, vuoi i nomi dei file che hanno almeno una corrispondenza?
leonbloy,

4
Ottima domanda In realtà ho iniziato a usarlo per aprire un elenco di file restituiti da grep in Vim. vim $(grep -rl Something app/)
David Tuite,

1
Non è possibile elencare i file usando il comando grep, è sostanzialmente usato per recuperare il testo desiderato da un file o da un elenco. Ad esempio, ps aux | grep 'apt-get' o grep 'text-to-find' / path / to / file /
iamjayp

Risposte:


1625

L'opzione standard grep -l(che è una L minuscola) potrebbe farlo.

Dallo standard 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.

Anche -Hin questo caso non è necessario .


37
La documentazione di questa opzione è (come spesso nella maggior parte dei file man) così poco chiara! Pfff ... Incredibile come l'uomo possa essere un dolore nel culo.
Monsieur,

1
-H mostra anche le partite stesse. La domanda era solo per i nomi dei file.
Hauke,

@Hauke ​​E la mia risposta è stata -l. Ho citato -H solo perché il comando dell'utente nella domanda includeva -H ed è ridondante quando viene dato -l.
Casuale 832,

2
Bene, personalmente mi piace usarlo con altre bandiere grep -nrl "some text" .quando cerco ricorsivamente testo in una serie di sottocartelle
openwonk,

142

Dalla grep(1)pagina man:

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

4
È necessario fermarsi alla prima partita e la natura.
Thomson

7
la documentazione lo rende un po 'poco chiaro. "La scansione si interromperà alla prima corrispondenza": indica che verranno stampati tutti i nomi dei file, ma la scansione per la parola corrispondente si interromperà alla prima occorrenza.
TheMonkWhoSoldHisCode

2
@VishalP: Dal momento che non ci interessa dove si trovano le occorrenze, solo che esistono, non ha senso cercare ogni file oltre la prima occorrenza.
Ignacio Vazquez-Abrams,

17
@ IgnacioVazquez-Abrams esattamente. La prima impressione del documento ti fa sentire che stamperà solo il nome del primo file. Hai davvero bisogno di un paio di letture per capirlo.
TheMonkWhoSoldHisCode

5
"La scansione del file corrente si interromperà alla prima corrispondenza." sarebbe molto più chiaro.
sorrymissjackson,

37

Per una semplice ricerca di file puoi usare grep -le le -ropzioni:

grep -rl "mystring"

Tutta la ricerca viene eseguita da grep. Naturalmente, se devi selezionare i file su qualche altro parametro, find è la soluzione corretta:

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

L' execdiropzione crea ogni comando grep per ogni directory e concatena i nomi dei file in un solo comando ( +).


0

La tua domanda Come posso ottenere solo i nomi dei file (con percorsi)

Il tuo esempio di sintassi trova. -iname "* php" -exec grep -H myString {} \;

Il mio suggerimento di comando

sudo find /home -name *.php

L'output di questo comando sul mio sistema operativo Linux:

composizione-campione-3 / html / mail / contact_me.php

Se hai bisogno del nome file con percorso, divertiti!


La domanda chiede specificamente come ottengono i nomi dei file usando grep .
snakecharmerb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.