Cerco spesso il codice sorgente in strutture di cartelle complesse e trovo utile utilizzando:
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é BASH è attraverso la tua ricerca come un rHino :)
Mostrerò come funziona con un rapido esempio.
Mostriamo 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 contenenti 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 puoi vedere nell'output, abbiamo nomefile: hit row: stringa cercata
Ecco una descrizione più dettagliata dei parametri utilizzati:
-r Per ogni operando di directory, leggere ed elaborare tutti i file in quella directory, in modo ricorsivo. Segui i collegamenti simbolici sulla riga di comando, ma salta i collegamenti simbolici che si incontrano in modo ricorsivo. Si noti che se non viene fornito alcun operando di file, grep cerca la directory di lavoro. È uguale all'opzione '--directories = recurse'.
-i Stampa il nome del file per ogni corrispondenza. Questo è il valore predefinito quando c'è più di un file da cercare.
-n Prefisso ogni riga di output con il numero di riga 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 valore predefinito quando c'è più di un file da cercare.
-o Stampa solo le parti corrispondenti (non vuote) delle linee corrispondenti, con ciascuna di tali 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 utilizzato anche -z (--null-data) (vedere Altre opzioni).
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string