Vorrei elencare i file in modo ricorsivo e univoco che contengono la parola data.
Esempio : controllo della parola “check”, normalmente faccio è un grep
$ grep check * -R
Ma poiché ci sono molte occorrenze di questa parola, ottengo molto output. Quindi devo solo elencare i nomi dei file che contengono la parola di ricerca data. Immagino che qualche trucco con find
e xargs
sarebbe sufficiente qui, ma non sono sicuro.
Qualche idea?
Risposta
Utilizza -l
o --files-with-matches
che è documentata come segue:
Sopprimi loutput normale; stampa invece il nome di ogni file di input da cui normalmente sarebbe stato stampato loutput. La scansione si interromperà alla prima partita. (
-l
è specificato da POSIX.)
Quindi, per esempio, puoi usare quanto segue:
$ grep check * -lR
Commenti
Risposta
find . -type f -exec grep -l check {} +
Probabilmente “non vuoi usare lopzione -R
che con le versioni moderne di GNU grep
segue i collegamenti simbolici quando discendono le directory. Utilizza lopzione -r
che dalla versione 2.12 (aprile 2012) non segue più i collegamenti simbolici.
Se il tuo grep non è quello GNU, o è precedente alla versione 2.12, o se hai bisogno che il tuo codice sia portabile su sistemi GNU non-bleeding-edge, usa il find
sopra.
Altrimenti, puoi fare:
grep -rl check .
Non “utilizzare *
(poiché ciò ometterebbe i file nascosti nella directory corrente (e solo nella directory corrente) e causerebbe problemi per i file il cui nome inizia con -
), evita di passare opzioni dopo gli argomenti in quanto non sono garantite teed per funzionare a seconda dellambiente e non è portabile.
Answer
Prova questo:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Per quanto riguarda i grep
flag …
-c
restituisce un nome file seguito da: e un numero che indica quante volte la stringa di ricerca appare nel file specificato.
-v
prenderà loutput dal primo grep
cerca, filtra i file con zero risultati e stampa solo i file con risultati diversi da zero.
Commenti
- Otterrai un falso negativo se hai file (o direttori) i cui nomi contengono
:0
. ' è meglio faregrep -v ':0$'
. Anche questo soffocerà sui nomi di percorso che contengono una nuova riga.
Risposta
funziona bene.
ad esempio, grep -lR "NAVIGATE" .
dove troviamo la parola NAVIGATE
in .
nella directory corrente.
Answer
grep -rin “whatToFind” locationToFInd
es $ grep -rin “vihaan”.
cercherà ed elencherà ricorsivamente i nomi dei file e le righe corrispondenti che contengono “vihaan”, “.” fa riferimento alla directory corrente.
Risposta
find . -type f | grep "keyword" *
cerca nella directory corrente. Per cercare da root, specifica /
invece di .
Risposta
grep -rli trim \` find . -name *.q \`
Fornisci lelenco dei file .q
contiene la parola chiave trim
grep -rl "text to find" "/usr/share"
e ha funzionato benissimo!