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! 🙂