GNU/Linux >> Linux Esercitazione >  >> Linux

Come combinare find e grep per una ricerca complessa? ( GNU/linux, trova, grep )

Prova

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

Questo dovrebbe cercare in modo ricorsivo le cartelle sotto application per i file con .php e passali a grep .

Un'ottimizzazione su questo sarebbe eseguire:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Questo utilizza xargs per passare tutti i .php file emessi da find come argomenti di un singolo grep comando;ad esempio, grep "debug (" file1 file2 file3 . L'-print0 opzione di find e -0 opzione di xargs assicurarsi che gli spazi nei nomi di file e directory siano gestiti correttamente. Il -H opzione passata a grep assicura che il nome del file venga stampato in tutte le situazioni. (Per impostazione predefinita, grep stampa il nome del file solo quando vengono passati più argomenti.)

Da man xargs:

-0

      Gli elementi di input sono terminati da un carattere null invece che da uno spazio bianco, e le virgolette e la barra rovesciata non sono speciali (ogni carattere è preso alla lettera). Disabilita la stringa di fine file, che viene trattata come qualsiasi altro argomento. Utile quando gli elementi di input possono contenere spazi bianchi, virgolette o barre rovesciate. Lo GNU trova -print0 option produce un input adatto a questa modalità.


find non è nemmeno necessario per questo esempio, si può usare grep direttamente (almeno GNU grep ):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

e siamo arrivati ​​a un unico fork di processo.

Opzioni:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

Linux
  1. Come utilizzare il comando "trova" per cercare più nomi di file (estensioni) in Linux

  2. Come trovare e uccidere il processo Zombie in Linux

  3. Come cercare i file per dimensione ed estensione?

  4. Usa Trova e trova per cercare file in Linux

  5. Come posso cercare un file per nome e percorso parziale?

Come usare il comando grep in Linux/UNIX

Come trovare una stringa in un file su Linux

Come trovare ed eliminare i collegamenti simbolici interrotti in Linux

Come cercare file dalla riga di comando di Linux

Come trovare ed eliminare directory vuote in Linux

Come trovare il nome e la versione della versione della distribuzione Linux