Come posso richiedere una stringa in modo ricorsivo attraverso tutti i .gzfile in tutte le directory e sottodirectory?
Come posso richiedere una stringa in modo ricorsivo attraverso tutti i .gzfile 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
xargsfornirà 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 findcomando. L'uso delle opzioni -print0e gli -0consente 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 {} +
-Hper 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 -rper attraversare un albero o se il -r non funziona, xargs zgrep
/bin/zgrep: -r: option not supportedsul mio sistema Ubuntu appena installato.
xargsinvece 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/nullassicurerà 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' -execargomento da trovare aggiungerà quanti più nomi di file possibili (simile al modo in cui xargssi 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).
-Hper mostrare sempre il nome del file con la riga corrispondente, almeno in GNU grep, anziché l' /dev/nullhack.