it-swarm-eu.dev

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 ho cercato come fare, 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.

4457
Nathan

Eseguire le seguenti operazioni:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r o -R è ricorsivo,
  • -n è il numero di riga 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, i flag --exclude, --include, --exclude-dir potrebbero essere utilizzati 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 il parametro --exclude-dir. 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.

8076
rakib_

Puoi usare grep -ilR:

grep -Ril "text-to-find-here" /
  • i sta per ignorare il caso (facoltativo nel tuo caso).
  • R sta per ricorsivo.
  • l sta per "mostra il nome del file, non il risultato stesso".
  • / indica la partenza dalla radice della macchina.
1279
fedorqui

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 , specificare il tipo di file, ecc.


UPDATE

Ho appena scoperto The Silver Searcher , che è come ack ma 3-5x più veloce di esso e persino ignora i pattern da un file .gitignore.

283
EarlOfEgo

Puoi usare:

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

La variabile 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

Questo 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 per cercare"/percorso/per/directory/o/file -r: ricerca ricorsiva n: il numero di linea verrà mostrato per le partite

156
learner_19

Puoi usare questo:

grep -inr "Text" folder/to/be/searched/
98
A R

Elenco di nomi di file contenenti un determinato testo

Prima di tutto, credo che tu abbia usato -H invece di -l. Puoi anche provare ad aggiungere il testo tra virgolette seguito 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 l'opzione -i per ignorare il caso. Puoi leggere ulteriori dettagli qui .

Spero che questo ti aiuti.

59
lkamal

Se grep non supporta la ricerca ricorsiva, puoi 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 a 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)
51
RobEarl

grep ( GNU o BSD )

È possibile utilizzare lo strumento grep per cercare in modo ricorsivo la cartella corrente, ad esempio:

grep -r "class foo" .

Nota: -r - Cerca ricorsivamente sottodirectory.

Puoi anche utilizzare la sintassi del 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 estensione o pattern specifici. Per abilitare questa sintassi, eseguire: shopt -s globstar . Si può 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, prendi in considerazione la possibilità di restringere la ricerca o utilizzare invece la sintassi find come:

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

In alternativa, utilizzare 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 / BSDgrep , ucg , ag , sift , ack , pt o simile, poiché è costruito sopra a Rust's regex engine che usa automi finiti, SIMD e ottimizzazioni letterali aggressive per rendere la ricerca molto veloce.

Supporta i pattern di ignora specificati nei file .gitignore, 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 (ad esempio -C5) - Aumenta il contesto, quindi viene visualizzato il codice circostante.
  • --color=auto: contrassegna 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.
50
kenorb
grep -insr "pattern" *
  • i: Ignora le distinzioni tra maiuscole e minuscole sia nel PATTERN che nei file di input.
  • n: Prefixa ogni riga di output con il numero di riga 1 all'interno del suo file di input.
  • s: sopprime i messaggi di errore relativi a file inesistenti o illeggibili.
  • r: legge tutti i file in ogni directory, in modo ricorsivo.
38
enfinet

Provare:

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

Come trovo tutti i file contenenti testo specifico su Linux? (...)

Ho trovato questa soluzione due volte:

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


Se si utilizzafindlike nell'esempio, è meglio aggiungere -s (--no-messages) a grep e 2>/dev/null alla fine del comando per evitare molti messaggi Permission negati emessi da grep e find:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

findè lo strumento standard per la ricerca di file - combinato con grep quando si cerca testo specifico - su piattaforme tipo Unix. Il comando find è spesso combinato con xargs , a proposito.

Esistono strumenti più veloci e semplici per lo stesso scopo: vedi sotto. Meglio provarli, a condizione che siano disponibili sulla tua piattaforma, ovviamente:

Alternative più veloci e facili

RipGrep- strumento di ricerca più veloce in circolazione:

rg 'text-to-find-here' / -l

The Silver Searcher:

ag 'text-to-find-here' / -l

ack:

ack 'text-to-find-here' / -l

Nota: è possibile aggiungere 2>/dev/null anche a questi comandi, per nascondere molti messaggi di errore.


Warning : a meno che tu non possa davvero evitarlo, non cercare da '/' (la directory root) per evitare una ricerca lunga e inefficiente! Quindi negli esempi sopra, è meglio sostituire '/' con un nome di sottodirectory, ad es. "/ home" dipende da dove vuoi effettivamente cercare ...

27
Bludzee

C'è una nuova utility chiamata The Silversearcher

Sudo apt install silversearcher-ag

Funziona a stretto contatto con Git e altri VCS. Quindi non otterrai nulla in .git o in un'altra directory.

Puoi semplicemente usare

ag -ia "Search query"

E farà il compito per te!

27
Neil Agarwal

Usa pwd per cercare da qualsiasi directory in cui ti trovi, ricorsivamente verso il basso

grep -rnw `pwd` -e "pattern"

Aggiorna A seconda della versione di grep che stai usando, puoi omettere pwd. Nelle versioni più recenti . sembra essere il caso predefinito per grep se non viene fornita alcuna directory in questo modo:

grep -rnw -e "pattern"

o

grep -rnw "pattern"

farà la stessa cosa di cui sopra!

26
mahatmanich

grep può essere usato anche se non stiamo cercando una stringa.

Semplicemente in esecuzione,

grep -RIl "" .

stamperà il percorso di tutti i file di testo, cioè quelli che contengono solo caratteri stampabili.

18
Alex Jasmin

Ecco i diversi elenchi di comandi che possono essere utilizzati per cercare il file.

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "Word-1|Word-2” directory-path

egrep -w -R "Word-1|Word-2” directory-path
16
Atul Arvind

Un semplice find può funzionare a portata di mano. lo alias nel tuo file ~/.bashrc:

alias ffind find / -type f | xargs grep

Avvia un nuovo terminale e genera:

ffind 'text-to-find-here'
14
danglingpointer
find /path -type f -exec grep -l "string" {} \;

Spiegazione dai commenti

find è un comando che consente di trovare file e altri oggetti come directory e collegamenti nelle sottodirectory di un determinato percorso. Se non si specifica una maschera che i nomi dei file devono soddisfare, enumera tutti gli oggetti directory.

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
14
Vinod Joshi

Spero che questo sia di assistenza ...

Espandere il grep un po 'per dare più informazioni nell'output, ad esempio, per ottenere il numero di riga nel file in cui il testo può essere fatto come segue:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

E se hai un'idea di quale sia il tipo di file puoi restringere la ricerca specificando le estensioni del tipo di file da cercare, in questo caso i file .pas OR .dfm:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

Breve spiegazione delle opzioni:

  1. . nel find specifica dalla directory corrente.
  2. -name "*.*": per tutti i file (-name "*.pas" -o -name "*.dfm"): solo i file *.pas OR *.dfm, OR specificati con -o
  3. -type f specifica che stai cercando i file
  4. -print0 e --null sull'altro lato del | (pipe) sono quelli cruciali, passando il nome file da find al grep incorporato nel xargs, consentendo il passaggio di nomi di file WITH spazi nei nomi di file, consentendo a grep di trattare il percorso e nome file come una stringa, e non suddividerlo in ogni spazio.
14
Gert van Biljon

Silver Searcher è uno strumento fantastico, ma ripgrep potrebbe essere ancora migliore.

Funziona su Linux, Mac e Windows, ed è stato scritto su Hacker News un paio di mesi fa (questo ha un link al blog di Andrew Gallant che ha un link GitHub):

Ripgrep - Un nuovo strumento di ricerca da riga di comando

14
AAAfarmclub

Provare:

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

che cercherà tutti i file system, perché / è la cartella radice.

Per l'uso della cartella home:

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

Per la cartella corrente utilizzare:

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

Ho scritto un script Python che fa qualcosa di simile. Questo è il modo in cui si dovrebbe usare questo script.

./sniff.py path pattern_to_search [file_pattern]

Il primo argomento, path, è la directory in cui cercheremo ricorsivamente. Il secondo argomento, pattern_to_search, è un'espressione regolare che vogliamo cercare in un file. Usiamo il formato di espressione regolare definito nella libreria Pythonre. In questo script, . corrisponde anche a newline.

Il terzo argomento, file_pattern, è facoltativo. Questa è un'altra espressione regolare che funziona su un nome di file. Verranno considerati solo i file che corrispondono a questa espressione regolare.

Ad esempio, se voglio cercare i file Python con l'estensione py contenente Pool( seguito da Word Adaptor, faccio quanto segue,

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

E voilà, genera il percorso dei file corrispondenti e il numero di riga in cui è stata trovata la corrispondenza. Se è stata trovata più di una corrispondenza, ciascun numero di riga verrà aggiunto al nome file.

13
Dilawar

Uso:

grep -c Your_Pattern *

Questo riporterà quante copie del tuo pattern ci sono in ciascuno dei file nella directory corrente.

12
Dr_Hope

grep è il tuo buon amico per raggiungere questo obiettivo.

grep -r <text_fo_find> <directory>

se non ti interessa il caso del testo da trovare poi usa

grep -ir <text_to_find> <directory>
11
Prash

Tutte le risposte precedenti suggeriscono grep e find. Ma c'è un altro modo: Usa Midnight Commander

È un'utilità gratuita (30 anni, comprovata dal tempo) che è visiva senza essere una GUI. Ha un sacco di funzioni e trovare i file è solo uno di questi.

11
Peter M.

Per cercare la stringa ed emettere solo quella riga con la stringa di ricerca:

for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

per esempio.:

for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

Per visualizzare il nome del file contenente la stringa di ricerca:

for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

per esempio.:

for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
11
user3124504

C'è uno strumento ack che farebbe esattamente quello che stai cercando.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

Puoi ignorare -i per la ricerca sensibile al maiuscolo/minuscolo

11
Pal

Il comando seguente funzionerà bene per questo approccio:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
10
Pradeep Goswami

Prova questo:

find . | xargs grep 'Word' -sl
10
Tayab Hussain

Sono affascinato dal modo in cui grep lo rende con 'rl'

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

Usa '-r' senza 'l' per vedere i nomi dei file seguiti da testo in cui è stato trovato il modello !

grep -r 'pattern_to_find' /path/where/to/find

Funziona perfettamente ...

Spero che sia d'aiuto!

10
nitinr708

Puoi usare il comando di sotto come non vuoi il nome del file ma vuoi cercare da tutti i file. Ecco sto catturando il modulo "TESTO" Tutti i file di registro assicurandosi che il nome del file non venga stampato

grep -e TEXT *.log | cut -d' ' --complement -s -f1

grep con -e l'opzione è abbastanza veloce rispetto ad altre opzioni come lo è per la corrispondenza PATTERN

10
Mitul Patel

Evita i problemi e installa ack-grep. Elimina molti permessi e problemi di quotazione.

apt-get install ack-grep

Quindi vai alla directory che vuoi cercare ed esegui il comando qui sotto

cd /
ack-grep "find my keyword"
10
Kareem

find con xargs è preferito quando ci sono molte potenziali corrispondenze da esaminare. Funziona più lentamente delle altre opzioni, ma funziona sempre. Come alcuni hanno scoperto, xargs non gestisce i file con spazi incorporati per impostazione predefinita. Puoi superare questo problema specificando l'opzione -d.

Ecco la risposta di @ RobEarl, migliorata in modo da gestire i file con spazi:

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

Ecco la risposta di @ venkat, similmente migliorata:

find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"

Ecco la risposta di @Gert van Biljon, anch'essa migliorata:

find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

Ecco la risposta di @ LetalProgrammer, anch'essa migliorata:

alias ffind find / -type f | xargs -d '\n' grep

Ecco la risposta di @Tayab Hussain, anch'essa migliorata:

find . | xargs -d '\n' grep 'Word' -sl
7
Mike Slinn

Se hai un set di file che controllerai sempre, puoi alias loro percorsi, ad esempio:

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

Quindi puoi semplicemente filtrare la lista in questo modo:

grep -U -l $'\015' $(fd)

Che filtra la lista fd in file che contengono il pattern CR.

Trovo che l'aliasing dei file che mi interessa mi aiuti a creare script più semplici, cercando sempre di ricordare come ottenere tutti quei file. Anche le cose ricorsive funzionano bene, ma prima o poi dovrai fare i conti con l'eliminazione di determinati tipi di file. Questo è il motivo per cui ho appena trovato tutti i tipi di file che mi interessano per cominciare.

7
dkinzer

Se vuoi assolutamente usare find allora:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

find + grep

1. Utilizzare find per cercare i file, 2. Quindi eseguire grep su tutti loro.

Può essere combinato in un comando come di seguito:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

  • Utilizza -name Pattern se vuoi grep solo determinati file:

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

Questo può darti la potenza di find per trovare i file. Puoi giocare con esso e utilizzare diverse opzioni di find per migliorare o restringere la ricerca di file.

7
BreakBadSP

Prova questo:

find / -type f -name "*" -exec grep -il "String_to_search" {} \;

O

for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
7
VIPIN KUMAR

Uso:

grep -Erni + "text you wanna search"

Il comando cercherà in modo ricorsivo in tutti i file e le directory della directory corrente e stamperà il risultato.

Nota: se il tuo output di grep non è colorato, puoi cambiarlo usando il grep = 'grep --color = always' alias nel file sorgente di Shell.

7
baldash

È possibile utilizzare i seguenti comandi per trovare un testo particolare da un file:

cat file | grep 'abc' | cut -d':' -f2
7
iamjayp

Come Peter nella risposta precedente menzionata , tutte le risposte precedenti suggeriscono grep e find.

Ma c'è un modo più sofisticato usando Gnome Commander con un perfettoGUIe con tonnellate di opzioni dal 2001, e trovare i file è solo uno di questi. È anche un'utilità gratuita, comprovata dal tempo.

7
Geeocode

Prova questo

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
6

Ricerca della GUI alternativa - Per uso desktop:

- Siccome la domanda non è precisamente chiedere comandi

Searchmonkey : Strumento di ricerca file avanzata senza dover indicizzare il sistema utilizzando le espressioni regolari. Equivalente grafico per trovare/grep. Disponibile per Linux (Gnome/KDE/Java) e Windows (Java) - GPL v3 open source

Caratteristiche:

  • Avanzate espressioni regolari
  • Risultati mostrati nel contesto
  • Cerca contenente testo
  • Pannello per visualizzare la riga contenente testo
  • Nuovi aggiornamenti 2018
  • eccetera.

Download - Collegamenti:

.

Screen-shot:

 Enter image description here

5
intika

il tuo comando è corretto Basta aggiungere -l a grep.

find / -type f -exec grep -l 'text-to-find-here' {} \;
0
FariZ