it-swarm.it

Come cercare il testo nell'intero file system?

Supponendo che lo strumento grep debba essere usato, mi piacerebbe cercare la stringa di testo "800x600" in tutto il file system.

Provai:

grep -r 800x600 /

ma non funziona.

Quello che credo che il mio comando dovrebbe fare è grep ricorsivamente attraverso tutti i file/cartelle in root per il testo "800x600" ed elencare i risultati della ricerca.

Che cosa sto facendo di sbagliato?

56
Level1Coder

Normalmente utilizzo questo stile di comando per eseguire grep su un numero di file:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

Ciò che effettivamente fa è creare un elenco di tutti i file sul sistema e quindi, per ogni file, eseguire grep con gli argomenti dati e il nome di ciascun file.

Il -xdev L'argomento dice che deve ignorare altri filesystem - questo è utile per evitare filesystem speciali come /proc. Tuttavia ignorerà anche i normali filesystem - quindi se, per esempio, la tua cartella/home si trova su una partizione diversa, non verrà cercata - dovresti dire find / /home -xdev ....

-type f significa cercare solo i file, quindi le directory, i dispositivi e altri file speciali vengono ignorati (continuerà a rientrare nelle directory ed eseguirà grep sui file all'interno - semplicemente non eseguirà grep sulla directory stessa, che non funzionerebbe comunque). E il -H L'opzione a grep gli dice di stampare sempre il nome del file nel suo output.

find accetta tutti i tipi di opzioni per filtrare l'elenco dei file. Per esempio, -name '*.txt' elabora solo i file che terminano con .txt. -size -2M indica file di dimensioni inferiori a 2 megabyte. -mtime -5 indica i file modificati negli ultimi cinque giorni. Unisciti a questi insieme a -a per e e -o per o e usa '(' parentesi ')' per raggruppare le espressioni (tra virgolette per impedire a Shell di interpretarle). Quindi per esempio:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

Date un'occhiata al man find per visualizzare l'elenco completo dei possibili filtri.

68
Richard Downer

Normalmente non dovresti cercare TUTTO sul sistema. Linux usa nodi di file per tutto, quindi alcuni "file" non sono cose che vorresti cercare. Per esempio /dev/sda è il dispositivo a blocchi fisici per il tuo primo disco rigido. Probabilmente si desidera cercare i file system montati e non il dispositivo a disco grezzo. Inoltre c'è /dev/random che sputa dati casuali ogni volta che li leggi. La ricerca non ha molto senso. Il /proc il file system è anche problematico nel tuo caso.

Consiglierei una delle due cose.

  1. Non cercare alla radice, cerca solo i luoghi che potrebbero essere utili. Ricerca /home o /usr o /etc separatamente. Le informazioni che stai cercando sono probabilmente di un tipo specifico, quindi è probabile che si trovino comunque in una cartella specifica. Le impostazioni di configurazione dovrebbero essere in /etc. I tuoi file di dati personali dovrebbero essere in /home. Limitare la ricerca a un'area importante come questa ridurrà notevolmente i tuoi problemi con greps ricorsivi.

  2. Escludere aree problematiche utilizzando --exclude-dir e una serie di cose che sai di non aver bisogno di questo:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

Infine, non è raro imbattersi in alcuni errori "negati dal permesso" quando si fa un grep ricorsivo. Nel normale corso dell'uso ci sono file che l'utente potrebbe non essere in grado di leggere. Fintanto che questi sono solo alcuni file dispari e non cose come il dispositivo grezzo per i tuoi dischi rigidi o l'intero file system proc, va bene semplicemente ignorare gli errori. In effetti puoi farlo dalla riga di comando inviando tutti gli errori in mai terra:

grep -r search_string /path 2> /dev/null
15
Caleb

Per semplicità, suggerirei ack-grep . Il link mostra molti casi quando ack-grep è un'opzione migliore.

Da utilizzare è, dopo l'installazione:

ack-grep pattern /
3
bbaja42

Un altro modo di vederlo è in questo modo:

grep -r /* | grep "800x600"
2
maniat1k

* poi ottengo un/proc/sysrq-trigger: errore di input/output

Il tuo comando funziona, ricevi questo errore perché stai cercando di scansionare i processi in esecuzione per una stringa.

Consiglio di escludere le directory di sistema con

grep -exclude-dir = {proc, sys} "800x600" /

0
Koffee