Domanda Come trovo tutti i file contenenti testo specifico su Linux?


Sto cercando di trovare un modo per scansionare il mio intero sistema Linux per tutti i file contenenti una specifica stringa di testo. Giusto per chiarire, sto cercando il testo all'interno del file, non nel nome del file.

Quando stavo cercando come farlo, ho trovato questa soluzione due volte:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Tuttavia, non funziona. Sembra che mostri ogni singolo file nel sistema.

È vicino al modo giusto di farlo? Se no, come dovrei? Questa capacità di trovare stringhe di testo nei file sarebbe straordinariamente utile per alcuni progetti di programmazione che sto facendo.


3674
2018-06-06 08:06


origine


risposte:


Fare quanto segue:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r o -R è ricorsivo,
  • -n è il numero della linea, e
  • -w sta per abbinare l'intera parola.
  • -l (minuscolo L) può essere aggiunto solo per dare il nome del file dei file corrispondenti.

Insieme a questi, --exclude, --include, --exclude-dir le bandiere potrebbero essere utilizzate per una ricerca efficiente:

  • Questo cercherà solo quei file che hanno estensioni .c o .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Questo escluderà la ricerca di tutti i file che terminano con estensione .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Per le directory è possibile escludere una particolare directory (i) attraverso --exclude-dir parametro. Ad esempio, ciò escluderà le dirs dir1 /, dir2 / e tutte corrispondenti a * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Questo funziona molto bene per me, per raggiungere quasi lo stesso scopo come il tuo.

Per ulteriori opzioni controlla man grep.


6643
2018-06-06 08:21



Puoi usare grep -ilR:

grep -Ril "text-to-find-here" /
  • i sta per ignorare il caso (opzionale nel tuo caso).
  • R sta per ricorsivo.
  • l sta per "mostra il nome del file, non il risultato stesso".
  • / sta per iniziare alla radice della tua macchina.

1085
2018-06-06 08:08



Puoi usare ack. È come grep per il codice sorgente. È possibile eseguire la scansione dell'intero file system con esso.

Basta fare:

ack 'text-to-find-here'

Nella tua directory principale.

Puoi anche usare espressioni regolari, specifica il tipo di file, ecc.


AGGIORNARE

Ho appena scoperto The Silver Searcher, che è come ack ma 3-5x più veloce di quanto non faccia e ignora anche i pattern di a .gitignore file.


232
2018-06-06 08:26



Puoi usare:

grep -r "string to be searched"  /path/to/dir

Il r sta per ricorsivo e quindi cercherà nel percorso specificato e anche nelle sue sottodirectory. Questo ti dirà il nome del file e stamperà la riga nel file in cui appare la stringa.

O un comando simile a quello che stai provando (esempio:) per la ricerca in tutti i file javascript (* .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Ciò stamperà le linee nei file in cui appare il testo, ma non stampa il nome del file.

Oltre a questo comando, possiamo scrivere anche questo: grep -rn "Stringa da cercare" / percorso / su / directory / o / file -r: ricerca ricorsiva n: il numero di linea verrà mostrato per le partite


124
2018-03-14 23:29



Puoi usare questo:

grep -inr "Text" folder/to/be/searched/

83
2017-07-31 13:44



Elenco di nomi di file contenenti un determinato testo

Prima di tutto, credo che tu abbia usato -H invece di -l. Inoltre puoi provare ad aggiungere il testo tra virgolette seguite da {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Esempio

Diciamo che stai cercando file contenenti testo specifico "Licenza Apache" all'interno della tua directory. Visualizzerà risultati un po 'simili a quelli di seguito (l'output sarà diverso in base al contenuto della directory).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Rimuovere la sensibilità del case

Anche se non si utilizza il caso come "testo" o "TESTO", è possibile utilizzare il -i passa a ignorare il caso. Puoi leggere ulteriori dettagli Qui.

Spero che questo ti aiuti.


48
2017-11-09 13:18



Se tuo grep non supporta la ricerca ricorsiva, è possibile combinare find con xargs:

find / -type f | xargs grep 'text-to-find-here'

Trovo che sia più facile da ricordare rispetto al formato per find -exec.

Ciò produrrà il nome file e il contenuto della riga corrispondente, ad es.

/home/rob/file:text-to-find-here

Bandiere opzionali che potresti voler aggiungere grep:

  • -i - ricerca senza distinzione tra maiuscole e minuscole
  • -l - mostra solo il nome del file in cui è stata trovata la corrispondenza
  • -h - emette solo la riga che corrisponde (non il nome del file)

46
2018-06-20 08:49



grep -insr "pattern" *
  • i: Ignora le distinzioni tra maiuscole e minuscole nel PATTERN e nei file di input.
  • n: Prefixa ogni riga di output con il numero di riga 1 all'interno del suo file di input.
  • s: Elimina i messaggi di errore relativi a file inesistenti o illeggibili.
  • r: Leggi tutti i file in ogni directory, in modo ricorsivo.

34
2018-02-26 05:47



grep (GNU o BSD)

Puoi usare grep strumento per cercare in modo ricorsivo la cartella corrente, come:

grep -r "class foo" .

Nota: -r - Cerca ricorsivamente sottodirectory.

Puoi anche usare la sintassi globbing per cercare all'interno di file specifici come:

grep "class foo" **/*.c

Nota: usando opzione globbing (**), esegue la scansione di tutti i file in modo ricorsivo con un'estensione o un modello specifico. Per abilitare questa sintassi, esegui: shopt -s globstar. Puoi anche usare **/*.* per tutti i file (esclusi quelli nascosti e senza estensione) o qualsiasi altro modello.

Se hai l'errore che il tuo argomento è troppo lungo, considera di restringere la ricerca o utilizzare find sintassi invece come:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

In alternativa, usa ripgrep.

ripgrep

Se stai lavorando su progetti più grandi o file di grandi dimensioni, dovresti usare ripgrep invece, come:

rg "class foo" .

Esegui il checkout dei documenti, dei passaggi di installazione o del codice sorgente su Pagina del progetto GitHub.

È molto più veloce di qualsiasi altro strumento come GNU/BSD  grep, ucg, ag, sift, ack, pt o simile, poiché è costruito sopra Il motore regex di Rust che utilizza automi finiti, SIMD e ottimizzazioni letterali aggressive per rendere la ricerca molto veloce.

Supporta i pattern di ignora specificati in .gitignore file, quindi un singolo percorso file può essere abbinato contemporaneamente a più pattern glob.


Puoi usare i parametri comuni come:

  • -i - Ricerca insensibile.
  • -I - Ignora i file binari.
  • -w - Cerca le parole intere (in opposizione alla corrispondenza parziale delle parole).
  • -n - Mostra la linea della tua partita.
  • -C/--context (per esempio. -C5) - Aumenta il contesto, quindi vedi il codice circostante.
  • --color=auto - Segna il testo corrispondente.
  • -H - Visualizza il nome del file in cui viene trovato il testo.
  • -c - Visualizza il conteggio delle linee corrispondenti. Può essere combinato con -H.

29
2018-05-09 10:11



Provare:

find . -name "*.txt" | xargs grep -i "text_pattern"

24
2017-12-10 05:47