2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

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.

Risposte (5)

117
117
117
2013-07-02 12:01:16 +0000

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
98
98
98
2013-07-02 10:02:41 +0000

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"
14
14
14
2014-09-26 13:24:22 +0000

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).

2
2
2
2015-10-28 19:03:56 +0000

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 {} \;

0
0
0
2018-10-22 16:15:38 +0000

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)