bash findet xargs grep nur einzelnes Vorkommen

bash findet xargs grep nur einzelnes Vorkommen

Vielleicht ist es ein bisschen seltsam – und vielleicht gibt es andere Tools dafür, aber, nun ja …

Ich verwende den folgenden klassischen Bash-Befehl, um alle Dateien zu finden, die eine bestimmte Zeichenfolge enthalten:

find . -type f | xargs grep "something"

Ich habe eine große Anzahl von Dateien in mehreren Tiefen. Das erste Vorkommen von „etwas“ reicht mir, aber find sucht weiter und braucht lange, um den Rest der Dateien zu finden. Was ich gerne hätte, ist so etwas wie ein „Feedback“ von grep zurück zu find, damit find die Suche nach weiteren Dateien beenden kann. Ist so etwas möglich?

Antwort1

Behalten Sie es einfach im Suchbereich:

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

So funktioniert es:

Das -execfunktioniert, wenn das -type fwahr ist. Und weil (Erfolg/wahr) grepzurückgibt , wenn das eine Übereinstimmung hat, wird das ausgelöst.0-exec grep "something"-quit

Antwort2

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

tut genau das: Wenn die headbeendet wird, wird das mittlere Element der Pipe mit einem „Broken Pipe“-Signal benachrichtigt, beendet wiederum und benachrichtigt die find. Sie sollten eine Benachrichtigung wie diese sehen:

xargs: grep: terminated by signal 13

was dies bestätigt.

Antwort3

So geht's, ohne das Tool zu wechseln: (Ich liebe 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

verwandte Informationen