Forse “è un po strano – e forse ci sono altri strumenti per farlo ma, beh ..

Sto usando il seguente comando bash classico per trovare tutti i file che contengono una stringa:

find . -type f | xargs grep "something" 

Ho un gran numero di file, su più profondità . la prima occorrenza di “qualcosa” è sufficiente per me, ma find continua la ricerca e impiega molto tempo per completare il resto dei file. Quello che vorrei fare è qualcosa come un “feedback” da grep indietro per trovare in modo che find potrebbe interrompere la ricerca di altri file. È possibile una cosa del genere?

Answer

Tienila semplicemente nel regno di find:

find . -type f -exec grep "something" {} \; -quit 

Funziona così:

-exec funzionerà quando -type f sarà true. E poiché grep restituisce 0 (success / true) quando ha una corrispondenza, la -quit verrà attivata.

Risposta

find -type f | xargs grep e | head -1 

fa esattamente questo: quando head termina, lelemento centrale del tubo viene notificato con un” tubo rotto “, termina a sua volta e notifica a find. Dovresti visualizzare un avviso del tipo

xargs: grep: terminated by signal 13 

che lo conferma.

Commenti

  • +1 per la spiegazione e lalternativa, anche se laltra risposta mi sembra più elegante, poiché è più autosufficiente

Risposta

Per farlo senza cambiare strumenti: (Adoro xargs)

#!/bin/bash find . -type f | # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20 # grep -m1: show just on match per file # grep --line-buffered: multiple matches from independent grep processes # will not be interleaved xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >( # Error output (stderr) is redirected to this command. # We ignore this particular error, and send any others back to stderr. grep -v "^xargs: .*: terminated by signal 13$" >&2 ) | # Little known fact: all `head` does is send signal 13 after n lines. head -n 1 

Commenti

  • +1 non sapevo che xargs avrebbe avuto tali capacità multitasking – grazie anche per gli altri commenti! 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *