Con find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
è solo per cercare in file regolari (escludendo anche i collegamenti simbolici anche se puntano a file regolari). Se si desidera cercare in qualsiasi tipo di file tranne le directory (ma attenzione ci sono alcuni tipi di file come fifos o / dev / zero che di solito non vuoi leggere), sostituiscilo -type f
con quello specifico di GNU ! -xtype d
( -xtype d
corrisponde a file di tipo directory dopo la risoluzione del link simbolico)).
Con GNU grep
:
grep -r pattern /the/dir
(ma attenzione che a meno che non si disponga di una versione recente di GNU grep, questo seguirà i collegamenti simbolici quando si scende nelle directory). I file non regolari non verranno cercati se non aggiungi -D read
un'opzione. Le versioni recenti di GNU non grep
effettueranno comunque ricerche all'interno dei symlink.
Le versioni molto vecchie di GNU find
non supportavano la {} +
sintassi standard , ma lì si poteva usare il non standard:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
È probabile che le prestazioni siano associate all'I / O. Quello è il tempo di fare la ricerca sarebbe il tempo necessario per leggere tutti quei dati dalla memoria.
Se i dati si trovano su un array di dischi ridondante, la lettura di più file alla volta potrebbe migliorare le prestazioni (e altrimenti degradarle). Se le prestazioni non sono associate all'I / O (perché ad esempio tutti i dati sono nella cache) e si dispone di più CPU, anche i concorrenti greps
possono essere d'aiuto. Puoi farlo con xargs
l' -P
opzione GNU .
Ad esempio, se i dati si trovano su un array RAID1 con 3 unità o se i dati sono nella cache e si dispone di 3 CPU il cui tempo libero:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(qui usando -n1000
per generare un nuovo grep
ogni 1000 file, fino a 3 in esecuzione alla volta).
Tuttavia, se l'output di grep
viene reindirizzato, si otterrà un output interfogliato in modo errato dai 3 grep
processi, nel qual caso si consiglia di eseguirlo come:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(su un recente sistema GNU o FreeBSD) o usa l' --line-buffered
opzione di GNU grep
.
Se pattern
è una stringa fissa, l'aggiunta -F
dell'opzione potrebbe migliorare le cose.
Se non si tratta di dati carattere multibyte o se per la corrispondenza di quel modello, non importa se i dati sono carattere multibyte oppure no, quindi:
cd /the/dir &&
LC_ALL=C grep -r pattern .
potrebbe migliorare significativamente le prestazioni.
Se finisci per fare spesso tali ricerche, allora potresti voler indicizzare i tuoi dati usando uno dei tanti motori di ricerca là fuori.
find
conxargs
ogrep -R