bash trova xargs grep solo una singola occorrenza


16

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

Sto usando il seguente classico comando bash per trovare tutti i file che contengono alcune stringhe:

find . -type f | xargs grep "something"

Ho un gran numero di file, su più profondità. la prima occorrenza di "qualcosa" è abbastanza per me, ma find continua a cercare e richiede 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 possa smettere di cercare altri file. E 'possibile una cosa del genere?

Risposte:


20

Tienilo semplicemente nel regno di find:

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

È così che funziona:

Il -execfunzionerà quando il -type fsarà vero. E poiché greprestituisce 0(successo / vero) quando -exec grep "something"ha una corrispondenza, -quitverrà attivato.


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

fa esattamente questo: quando headtermina, l'elemento centrale del tubo viene notificato con un segnale di "tubo rotto", termina a sua volta e avvisa find. Dovresti vedere un avviso come

xargs: grep: terminated by signal 13

che lo conferma.


+1 per la spiegazione e l'alternativa, sebbene l'altra risposta mi sembri più elegante, poiché è più autosufficiente
hello_earth

8

Per fare questo 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

1
+1 non ha mai saputo che xargs avrebbe avuto tali capacità multitasking - grazie anche per altri commenti! :)
hello_earth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.