Come posso richiedere una stringa in modo ricorsivo attraverso tutti i .gz
file in tutte le directory e sottodirectory?
Come posso richiedere una stringa in modo ricorsivo attraverso tutti i .gz
file in tutte le directory e sottodirectory?
Risposte:
@Steve Weet è quasi arrivato. L'uso di / dev / null come argomento aggiuntivo è un buon modo per forzare la visualizzazione del nome del file (lo ricorderò, grazie Steve) ma esegue comunque il exec per ogni file trovato - un enorme sovraccarico.
Volete eseguire zgrep il minor numero di volte possibile, ottenendo il massimo da ogni esecuzione:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
fornirà il maggior numero possibile di arg (nomi di file) a zgrep e lo eseguirà ripetutamente fino a quando non avrà utilizzato tutti i file forniti dal find
comando. L'uso delle opzioni -print0
e gli -0
consente di funzionare se ci sono spazi in uno dei nomi di file o directory.
Su Mac OS X, puoi ottenere lo stesso effetto senza xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
per mostrare sempre il nome del file con la riga corrispondente, almeno in GNU grep.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Quindi qualcosa del genere
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
per attraversare un albero o se il -r non funziona, xargs zgrep
/bin/zgrep: -r: option not supported
sul mio sistema Ubuntu appena installato.
xargs
invece invece.
@aioobe è quasi arrivato. Il comando farà il lavoro ma non ti dirà il nome del file
Quanto segue dovrebbe indicare anche il nome del file:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
L'aggiunta di /dev/null
assicurerà che zgrep veda due nomi di file, quindi ti mostrerà il nome del file se trova la stringa
MODIFICARE
Ulteriori ricerche rivelano che per la mia macchina (OS / X) l' -exec
argomento da trovare aggiungerà quanti più nomi di file possibili (simile al modo in cui xargs
si comporta).
-exec
: mi occupo della portabilità, quindi non lo userei in uno script, ma ottimo per il prompt dei comandi.
find
, ma per la maggior parte di quelle moderne (ad esempio nelle distribuzioni basate su Debian).
-H
per mostrare sempre il nome del file con la riga corrispondente, almeno in GNU grep, anziché l' /dev/null
hack.