Trovare i file che contengono una certa stringa usando find (1) e grep (1)
find . -type f -print -exec cat {} \; | grep some string
Il comando sopra non stampa il percorso del file.
Sto usando: Ubuntu, bash 4
.
find . -type f -print -exec cat {} \; | grep some string
Il comando sopra non stampa il percorso del file.
Sto usando: Ubuntu, bash 4
.
Io uso
grep "some string" . -R
e funziona più velocemente
p.s.
caso d'uso più complesso
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
Per leggere i param i spiegazione
grep --help | grep -- -i
Questo perché state fornendo a grep
un flusso di testo che si dà il caso contenga nomi di file. Poiché non hai fornito alcun nome di file come argomento a grep, non ci si può aspettare che deduca da quale file provenga una linea corrispondente. Usate xargs
:
find . -type f -print | xargs grep "some string"
Poiché avete GNU find/xargs, questo è un modo più sicuro per xargs di leggere i nomi di file:
find . -type f -print0 | xargs -0 grep "some string"
Se volete solo i nomi di file che hanno una linea corrispondente senza mostrare la linea corrispondente:
find . -type f -print0 | xargs -0 grep -l "some string"
Cerco spesso il codice sorgente in strutture di cartelle complesse e trovo utile usare:
cd /your/folder/
grep -rHino "your string"
Con questi parametri, senza usare find, ottengo il percorso completo del file e il numero di riga che contiene la stringa specificata.
È anche facile da ricordare perché si BASH attraverso la ricerca come un rHino :)
Mostrerò come funziona con un rapido esempio.
Visualizziamo il contenuto di un file usando cat:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
E cerchiamo ricorsivamente tutti i file che contengono la stringa “iptables -P”:
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
Come potete vedere nell'output abbiamo nome del file:riga trovata:stringa cercata
Ecco una descrizione più dettagliata dei parametri utilizzati:
-r Per ogni operando di directory, legge ed elabora tutti i file in quella directory, ricorsivamente. Segui i link simbolici sulla linea di comando, ma salta i link simbolici che vengono incontrati ricorsivamente. Notate che se non viene dato alcun operando di file, grep cerca nella directory di lavoro. Questo è lo stesso dell'opzione ‘–directories=recurse’.
-i Stampa il nome del file per ogni corrispondenza. Questo è il default quando c'è più di un file da cercare.
-n Prefissa ogni linea di output con il numero di linea basato su 1 all'interno del suo file di input. (-n è specificato da POSIX.)
-H Stampa il nome del file per ogni corrispondenza. Questo è il default quando c'è più di un file da cercare.
-o Stampa solo le parti corrispondenti (non vuote) delle linee corrispondenti, con ciascuna di queste parti su una linea di output separata. Le linee di output usano gli stessi delimitatori dell'input, e i delimitatori sono byte nulli se viene usato anche -z (–null-data) (vedi Altre opzioni).
Ho preferito
| trovare il file | fare grep per trovare il file | mostrare il percorso completo del file
find / -type f -exec grep ‘some string’ {} \; -exec echo {} \;
Silver Searcher ](https://github.com/ggreer/the_silver_searcher) è un programma molto veloce e pratico per cercare file e contenuti.
Per risolvere il tuo problema il comando silver searcher sarebbe come questo…
ag 'some string' -l
-l
Stampa solo i nomi di file che contengono corrispondenze (non stampa le linee corrispondenti)