sto cercando di trovare un modo per eseguire la scansione del mio intero sistema Linux per tutti i file contenenti una specifica stringa di testo. solo per chiarire, sto cercando il testo all'interno del file, non nel nome del file.
quando stavo cercando su come fare questo, mi sono imbattuto in questa soluzione due volte:
find/-type f -exec grep -H 'text-to-find-here' {} \;
tuttavia, non funziona. sembra visualizzare ogni singolo file nel sistema.
è questo vicino al modo corretto per 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.
En title : How do I find all files containing specific text on Linux?
è possibile utilizzare
grep -ilR
:i
sta per ignore case (opzionale nel tuo caso).R
significa ricorsivo.l
sta per "mostrare il nome del file, non il risultato stesso"./
sta per partire alla radice della vostra macchina.pensi che usare un'espressione regolare con grep renderebbe più veloce?
-i
rende rallentare un sacco, quindi non usarlo se non necessario. testarlo in una certa dir e poi generalizzare. dovrebbe essere completato in pochi minuti. penso che un'espressione regolare renderebbe più lento. ma i miei commenti si basano su supposizioni, vi suggerisco di provarlo contime
di fronte alla linea./*
sta per questo. comunque ho appena provato e notato che solo/
funziona.sembra che questo sia catturare un sacco di file che non posso nemmeno aprire in un editor di testo. è forse interpretare tutti i formati a testo, e così casualmente trovare risultati in binario "rumore" in un file eseguibile, per esempio?
2>/dev/null | grep -v "Binary file"
-i
rallenta quello che sembra 10x più lento almeno-i
è sicuramente più lento, ma è complicato sapere quanto: se si esegue il test con e senza, probabilmente i risultati del primo sono memorizzati nella cache e utilizzati durante l'esecuzione del secondo. inoltre, è più "costoso" controllare una parola lunga (aBcDEFghIj
) che una parola corta (aBc
), perché ci sono molte più combinazioni possibili di maiuscole / minuscole.ack 'search text'
, funziona davvero bene per quello che avevo bisogno per ed è molto veloce. il suo bello a causa della bella evidenziazione che utilizza.grep -Ril "text-to-find-here" ~/sites/
o usare. per la directory correntegrep -Ril "text-to-find-here" .
-I
(capitale i) per escludere i file binari. penso che questo sia stato il punto chiave qui, invece diexclude
oinclude
. meglio tardi che mai: dgrep -rl 'pattern' .
opere ricorsive anche con minuscolo-r
. ricerca Scope dot.
per la directory corrente è più intuitivo AFAIK rathan di/
-R
e-r
sono diversi. daman grep
: leggere tutti i file in ogni directory, ricorsivamente. segui tutti i link, a differenza di -r.-n
:grep -n "pattern" file
.grep
rallenta su-i
e parole lunghe, come avrei dovuto pensare che l'algoritmo di ricerca stringa "generated-skip-length-table-driven" di Boyer-Moore sarebbe altrettanto veloce su-i
e più veloce su parole più lunghe - presumibilmente Linuxgrep
sta usando qualcosa di più semplice! ma https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore ricerca stringa _ algoritmo # Implementazioni dice che viene utilizzato!find -name filename.txt -exec grep 'x' {} \;
effettuare le seguenti operazioni:
-r
o-R
è ricorsivo,-n
è il numero di linea, e-w
significa che corrisponde all'intera parola.-l
(minuscola L) può essere aggiunto solo per dare il nome del file di file corrispondenti.insieme a questi,
--exclude
,--include
,--exclude-dir
bandiere potrebbero essere utilizzati per una ricerca efficiente:questo ricerca solo attraverso quei file che hanno estensioni .c o .h:
questo escluderà la ricerca di tutti i file che terminano con estensione .o:
per le directory è possibile escludere una directory particolare (ies) attraverso il parametro
--exclude-dir
. per esempio, questo escluderà i dirs dir1 /, dir2 / e tutti corrispondenti * .dst /:questo funziona molto bene per me, per raggiungere quasi lo stesso scopo come il vostro.
per ulteriori opzioni controllare
man grep
.grep -rnw --include = * .java. -e "quello che sto cercando"
r
sia lazy (attraversa la depth-first, poi si ferma dopo la prima directory), mentreR
è greedy (attraverserà correttamente l'intero albero).grep -rnw --colour . -e "terminal"
R
enr
percorre correttamente le directory, maR
segue collegamenti simbolici.grep -rnwl
"/ usr / bin / grep: 0403-027 L'elenco dei parametri è troppo lungo."
-i
molto utile anche per "ignorare caso". forse gettare questo nella tua lista di opzioni.-w
. ho trovato che non corrisponde a testo arbitrario.findin () {
grep -rnw "$2" -e "$1"
}}}}}}
--include-dir
. mi chiedevo quando questo è stato incluso, sulla mia prima versione? non ricordo. sarebbe bello se fosse possibile vedere la risposta cambiare log come git.grep -r 'rrr' ./
. (o come detto -R invece di -r, in modo da includere collegamenti simbolici)puoi usare ack. è come grep per il codice sorgente. è possibile eseguire la scansione dell'intero file system con esso.
basta fare:
nella tua directory root.
è inoltre possibile utilizzare espressioni regolari, specificare il tipo di file, ecc.
aggiornamento aggiornamento aggiornamento aggiornamento
ho appena scoperto The Silver Searcher, che è come un errore ma 3-5x più veloce di esso e anche ignora i modelli da un
.gitignore
file.è possibile utilizzare questo:
.
come un carattere singolo, tra gli altri. il mio consiglio è quello di usare alway o fgrep o egrep.-H
con-l
(e forsegrep
confgrep
). per escludere i file con determinati modelli di nomi si utilizzafind
in modo più avanzato. è opportuno imparare ad usarefind
, però. soloman find
.elenco dei nomi dei file contenenti un dato testo
prima di tutto, credo che tu abbia usato
-H
invece di-l
. inoltre puoi provare ad aggiungere il testo tra virgolette seguito da{} \
.esempio di esempio
diciamo che stai cercando dei file contenenti un testo specifico "Apache License" nella tua directory. mostrerà i risultati in qualche modo simili a sotto (l'uscita sarà differente basato sul vostro soddisfare di indice).
rimuovere sensibilità caso
anche se non si utilizza il caso come "text" vs "TEXT", è possibile utilizzare l'opzione
-i
per ignorare il caso. potete leggere ulteriori dettagli qui.spero che questo ti aiuti.
find
passerà tutti i percorsi che trova al comandogrep -l "text-to-find-here" <file found>"
. è possibile aggiungere restrizioni al nome del file, ad esempiofind / -iname "*.txt"
per cercare solo nei file che il nome finisce in.txt
-iname
è case-insensibili il che significa che sarebbe anche trovare i file .TXT, per esempio, così come TXT e TXT e così via.ho scritto uno script Python che fa qualcosa di simile. questo è come si dovrebbe usare questo script.
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, il.
corrisponde anche a newline.il terzo argomento,
file_pattern
, è opzionale. questa è un'altra espressione regolare che funziona su un nome di file. verranno considerati solo i file che corrispondono a questa espressione regolare.per esempio, se voglio cercare i file Python con l'estensione
py
contenentePool(
seguita dalla parolaAdaptor
, faccio quanto segue,e voilà, genera il percorso dei file corrispondenti e il numero di linea a cui la partita è stata trovata. se è stata trovata più di una corrispondenza, ogni numero di linea verrà aggiunto al nome del file.
per cercare la stringa e l'output basta quella linea con la stringa di ricerca:
ad es. per esempio ::::
per visualizzare filename contenente la stringa di ricerca:
ad es. per esempio ::::
find … -exec grep 'str' {} \;
(se si deve usarefind
a tutti).find
spazi contenuti.. si potrebbe finiregrepping
i file errati e / o mancanti i file giusti del tutto. basta usarefind ... -exec grep ...
se si ha la necessità di utilizzarefind
.. ma in questo caso ungrep -r ...
basta.qui ci sono diversi elenco di comandi che possono essere utilizzati per la ricerca di file.
egrep
equivale agrep -E
e significa--extended-regexp
si possono trovare i dettagli qui https://unix.stackexchange.com/a/17951/196072è possibile utilizzare:
il
r
sta per ricorsivo e quindi cercherà nel percorso specificato ed anche nelle sue sottodirectory. questo vi dirà il nome del file così come stampare la linea nel file in cui la stringa appare.o un comando simile a quello che stai cercando (esempio:) per la ricerca in tutti i file javascript (* .js):
questo stamperà le righe nei file in cui il testo appare, ma non stampa il nome del file.
in aggiunta a questo comando, possiamo scrivere anche questo: grep -rn "String to search" / path / to / directory / or / file -r: ricorsive search n: line number sarà mostrato per matches
grep
può essere utilizzato anche se non siamo alla ricerca di una stringa.semplicemente in esecuzione,
stamperà il percorso di tutti i file di testo, cioè quelli contenenti solo caratteri stampabili.
ls
ofind
(per la ricorsiva)se
grep
non supporta la ricerca ricorsiva, è possibile combinarefind
conxargs
:trovo questo più facile da ricordare che il formato per
find -exec
.questo mostrerà il nome del file e il contenuto della riga corrispondente, ad esempio
flag opzionali da aggiungere a
grep
:-i
- ricerca insensibile alle maiuscole-l
- visualizza solo il nome del file in cui è stata trovata la corrispondenza-h
- visualizza solo la riga che corrisponde (non il nome del file)grep 'text-to-find-here'
senza nome file sefind
non trova nulla. questo sarà appendere e attendere l'input dell'utente! aggiungere--no-run-if-empty
come opzione axargs
.find … -exec grep … +
. se insisti nell'usare find insieme con xargs, usa-print0
e-0
.spiegazione dai commenti
find è un comando che permette di trovare file e altri oggetti come directory e link in sottodirectory di un determinato percorso. se non specifichi una maschera che i nomi dei file dovrebbero incontrare, elenca tutti gli oggetti di directory.
prova: prova:
xargs
come quello. consideri questo.echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
. ilxargs
qui corrisponde al file FORTE e NON corrisponde al file desiderato. o utilizzare unfind .. -print0 | xargs -0 ...
, ma che è un uso inutile di un tubo o megliofind ... -exec grep ... {} +
prova questo:
se si dispone di un insieme di file che sarà sempre il controllo è possibile alias i loro percorsi, per esempio:
poi si può semplicemente filtrare l'elenco come questo:
che filtra l'elenco fd in file che contengono il modello CR.
trovo che l'aliasing dei file che mi interessa mi aiuta a creare script più facili poi sempre cercando di ricordare come ottenere tutti quei file. la roba ricorsiva funziona pure, ma prima o poi si sta andando a fare i conti con estirpare specifici tipi di file. ecco perché trovo tutti i tipi di file che mi interessano per cominciare.
spero che questo sia di aiuto...
espandere il
grep
un po 'per dare maggiori informazioni nell'output, per esempio, per ottenere il numero di linea nel file in cui il testo è può essere fatto come segue:e se hai un'idea del tipo di file puoi restringere la ricerca specificando il tipo di file da cercare, in questo caso
.pas
O.dfm
file:breve spiegazione delle opzioni:
.
nelfind
specifica dalla directory corrente.-name
"*.*
": per tutti i file (-name "*.pas
" -o -name "*.dfm
"): solo i file*.pas
O*.dfm
, O specificati con-o
-type f
specifica che si sta cercando di file-print0
e--null
dall'altro lato del|
(pipe) sono quelli cruciali, passando il nome del file dalfind
algrep
incluso nelxargs
, permettendo il passaggio dei nomi di file CON gli spazi nei nomi dei file, permettendo a grep di trattare il percorso e il nome del file come una stringa, e non spezzarlo su ogni spazio.-name '*.*'
non è quello che si dice; non sarebbe prendere su un file chiamato 'file' perché il modello non equivale a quello (no. ext);*
sarebbe comunque (bene. file a parte). ma c'è un'altra cosa: se volete tutti i file perché preoccuparsi di specificare un nome di file, in primo luogo? nessun altro commento - tranne che è bello sapere che ci sono ancora persone che non usano la terminologia MS 'cartella' (che in realtà dopo averlo detto abbastanza non vorrei aggiungere, ma volevo sottolineare l'affermazione leggermente errata che hai fatto con i nomi di file - così come la ridondanza / inutilità nel caso di 'all').prova: prova:
che cercherà tutti i file system, perché
/
è la cartella principale.per uso cartella home:
per l'uso della cartella corrente:
grep
(GNU o BSD)è possibile utilizzare
grep
strumento per cercare ricorsivamente la cartella corrente, come:nota:
-r
- ricerca ricorsivamente sottodirectory.è inoltre possibile utilizzare la sintassi globbing per cercare all'interno di file specifici come:
nota: utilizzando l'opzione globbing (
**
), esegue la scansione ricorsivamente di tutti i file con estensione o pattern specifici. per abilitare questa sintassi, eseguire:shopt -s globstar
. è inoltre possibile utilizzare**/*.*
per tutti i file (escluso nascosto e senza estensione) o qualsiasi altro modello.se hai l'errore che il tuo argomento è troppo lungo, considerare restringere la ricerca, o utilizzare
find
sintassi invece come:in alternativa utilizzare
ripgrep
.ripgrep
se si sta lavorando su progetti più grandi o grandi file, si dovrebbe utilizzare
ripgrep
invece, come:verifica i documenti, i passaggi di installazione o il codice sorgente nella pagina del progetto GitHub.
e 'molto più veloce di qualsiasi altro strumento come GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
o simili, dato che è costruito sopra il motore regex di Rust che usa automi finiti, SIMD e ottimizzazioni letterali aggressive per rendere la ricerca molto veloce.questo sostiene ignore i modelli specificati in file
.gitignore
, allora un percorso di file solo può esser abbinato a modelli glob multipli contemporaneamente.è possibile utilizzare i parametri comuni come:
-i
- Ricerca sensibile.-I
- Ignora i file binari.-w
- Cerca tutte le parole (in contrario alla corrispondenza parziale delle parole).-n
- Visualizza la linea della partita.-C
/--context
(ad esempio-C5
) - Aumenta il contesto, in modo da vedere il codice circostante.--color=auto
- Seleziona 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
.è possibile utilizzare sotto comando come non si desidera il nome del file, ma si desidera cercare da tutti i file. qui sono io sto catturando "TEXT" forma Tutti i file di log assicurandosi che il nome del file non è stampato
grep con l'opzione -e è abbastanza veloce rispetto ad altre opzioni in quanto è per la corrispondenza PATTERN
prova questo
se si utilizza find come nell'esempio, è meglio aggiungere
-s
(--no-messages
) agrep
, e2>/dev/null
alla fine del comando per evitare un sacco di messaggi negati Permission emessi dagrep
efind
:find è lo strumento standard per la ricerca di file - combinato con grep quando si cerca un testo specifico - su piattaforme Unix-like. il comando find è spesso combinato con xargs, a proposito.
esistono strumenti più semplici e veloci per lo stesso scopo - vedi sotto. meglio provarli, purché siano disponibili sulla vostra piattaforma, naturalmente:
alternative più semplici e veloci
RipGrep - strumento di ricerca più veloce intorno:
il cercatore d'argento:
ACK: Jack:
nota: è possibile aggiungere
2>/dev/null
anche a questi comandi, per nascondere molti messaggi di errore.attenzione: a meno che non si possa davvero evitare, non cercare da '/' (la directory principale) per evitare una ricerca lunga e inefficiente! quindi negli esempi qui sopra, è meglio sostituire '/' con un nome di sottodirectory, ad esempio "/ home" a seconda di dove si vuole effettivamente cercare...
grep
find
non cerca direttamente l'interno dei file per il testo. e forse quegli strumenti aggiuntivi sono utili per alcuni ma vecchi timer e quelli whoa sono ben abituati ad esempiogrep
non avrebbe dato loro in qualsiasi momento a tutti (beh certamente non lo farò). non dicendo che sono inutili però.il seguente comando funzionerà bene per questo approccio:
find
e poigrep -r
? sono pensati per lo stesso, quindi questo è ridondante.find
.find … -exec <cmd> +
è più facile da digitare e più veloce difind … -exec <cmd> \;
. funziona solo se<cmd>
accetta qualsiasi numero di argomenti di nome file. il risparmio nel tempo di esecuzione è particolarmente grande se<cmd>
è lento per iniziare come script Python o Ruby.i
: ignora le distinzioni di casi sia nel PATTERN che nei file di input.n
: prefisso ogni linea di output con il numero di linea basato su 1 all'interno del file di input.s
: sopprimere i messaggi di errore sui file inesistenti o illeggibili.r
: leggere tutti i file in ogni directory, ricorsivamente.-I Ignore binary files.
.evitare il fastidio e installare ack-grep. elimina un sacco di problemi di permesso e citazione.
poi vai alla directory che vuoi cercare ed eseguire il comando qui sotto
USA
pwd
per cercare da qualsiasi directory in cui ti trovi, ripetendo verso il bassoaggiornamento A seconda della versione di grep che si sta utilizzando, è possibile omettere
pwd
. nelle versioni più recenti.
sembra essere il caso predefinito per grep se nessuna directory è data così:grep -rnw -e "pattern"
o o o o o
grep -rnw "pattern"
farà la stessa cosa di sopra!
pwd
non è affatto necessario, dato che è il default.grep -rnw "pattern"
è sufficiente.grep -rnw
e simile è quello che è stato risposto come tre anni fa, non vedo come questa risposta è l'aggiunta di valore.grep -rnw '/path/to/somewhere/' -e "pattern"
che è quello che hai qui. 5 voti dopo 2.3m visite non significa molto.grep "pattern"
ha bisogno di qualcosa da controllare (una dir, un file...) mentregrep -R "pattern"
funziona come standalone. allora probabilmente un'aggiunta alla risposta beneficerebbe più gente (gli ultimi alberini sono notati raramente). ma sono contento che avete imparato da esso:) Ho la seconda risposta più votata e vedo che ci sono molte, molte varianti di fare questo.pwd
stavo cercando di trovare un hack facile da non digitare nel percorso completo, ma sono sicuro che.
sarebbe sufficiente, come directory corrente, ma lasciando fuori del tutto è naturalmente il più magro.pwd
è necessario @fedorquicd /tmp; mkdir mytest; cd mytest; mkdir a{1..3}; seq 10 > a1/a1; seq 10 > a1/a2; seq 10 > a2/a1
una volta che hai tutto questo, scriveregrep -rnw 5
. questo funziona bene per me su GNU grep 2.16.c'è uno strumento
ack
che farebbe esattamente quello che stai cercando.si può ignorare
-i
per la ricerca caso sensibileuso: uso:
il comando cerca ricorsivamente in tutti i file e directory della directory corrente e stampa il risultato.
nota: se l'output di grep non è colorato, puoi modificarlo usando l'alias grep = 'grep --color = always' nel file sorgente della shell.
prova questo:
o o o o o
grep -rnw '/ path / to / da qualche parte /' -e "pattern" > > > ha ottenuto l'errore "/ usr / bin / grep: 0403-027 L'elenco dei parametri è troppo lungo."
grep -il "text-to-find-here" / > > > ha ottenuto l'errore "/ usr / bin / grep: 0403-027 L'elenco dei parametri è troppo lungo."
"text-to-find-here '> > > ha ottenuto l'errore" errore di segmentazione (corredump) "
find / -type f -exec grep -H 'text-to-find-here' {}\; > > Essa produrrà il risultato solo con filename.
per i in / *; fare grep -Ril "String _ to _ search" $i; fare 2 > / dev / null > > funzionerà come grep -Ril "text-to-find-here" / ma supporterà un gran numero di file.
c'è una nuova utility chiamata il Silversearcher
lavora a stretto contatto con Git e altri VCS. quindi non otterrai nulla in una directory .git o in un'altra.
si può semplicemente usare
e farà il compito per voi!
grep "pattern" path/*.txt
Silver Searcher è un fantastico strumento, ma ripgrep può essere ancora meglio.
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 a riga di comando
uso: uso:
questo segnalerà quante copie del vostro modello ci sono in ciascuno dei file nella directory corrente.
è possibile utilizzare i seguenti comandi per trovare un particolare testo da un file:
un Simple
find
può funzionare a portata di mano. alias nel file~/.bashrc
:avviare un nuovo terminale ed emettere:
tutte le risposte precedenti suggeriscono grep e trovare. ma c'è un altro modo: USA Midnight Commander
è un'utilità libera (30 anni, provata da tempo) che è visiva senza essere GUI. ha tonnellate di funzioni, e trovare file è solo uno di loro.
come Peter nella risposta precedente accennato, tutte le risposte precedenti suggeriscono grep e trovare.
ma c'è un modo più sofisticato di usare Gnome Commander con una GUI perfetta e con molte opzioni dal 2001, e trovare file è solo uno di questi. si tratta di un programma gratuito e, dimostrato da tempo.
sono affascinato da come grep semplice rende con 'rl'
funziona solo perfetto..
spero che aiuti!
.txt
). o c'è un modo per farlo?Grep è il tuo buon amico per raggiungere questo obiettivo.
se non ti interessa il caso del testo per trovare quindi utilizzare
find
conxarg
s è preferito quando ci sono molte partite potenziali per passare al setaccio. funziona più lentamente di altre opzioni, ma funziona sempre. come alcuni hanno scoperto,xargs
non gestisce i file con spazi incorporati per impostazione predefinita. è possibile superare questo problema specificando l'opzione-d
.ecco la risposta @RobEarl's, migliorata in modo da gestire i file con spazi:
ecco la risposta @venkat's, allo stesso modo migliorato:
ecco la risposta di van Biljon, ugualmente migliorata:
ecco la risposta @LetalProgrammer's, allo stesso modo migliorato:
ecco la risposta di Hussain, ugualmente migliorata:
grep -rl
non funziona con molte partite?alternativa alla ricerca GUI - Per l'utilizzo desktop:
- Poiché la domanda non è precisamente chiedere comandi
Searchmonkey: avanzato strumento di ricerca di file senza dover indicizzare il sistema utilizzando espressioni regolari. grafica equivalente a find / grep. disponibile per Linux (Gnome / KDE / Java) e Windows (Java) - open source GPL v3
caratteristiche:
download - Links:
....
screen-shot:
vedi anche The Platinium Searcher, che è simile a The Silver Searcher ed è scritto in Go.
esempio: esempio:
se si desidera utilizzare rigorosamente
find
allora:find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
find + grep
1.Use
find
per cercare i file, 2.Then eseguiregrep
su tutti loro.può essere combinato in un unico comando come segue:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
utilizzare
-name Pattern
se si desideragrep
solo alcuni file:find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
questo può dare il potere di
find
per trovare i file. è possibile giocare con esso e utilizzare diverse opzioni difind
per migliorare o restringere la ricerca di file.