
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 -exec
funktioniert, wenn das -type f
wahr ist. Und weil (Erfolg/wahr) grep
zurü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 head
beendet 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