Vielleicht ist es etwas seltsam – und vielleicht gibt es andere Tools, um dies zu tun, aber gut ..
Ich verwende den folgenden klassischen Bash-Befehl, um alle Dateien zu finden, die eine Zeichenfolge enthalten:
find . -type f | xargs grep "something"
Ich habe eine große Anzahl von Dateien in mehreren Tiefen Das erste Auftreten von „etwas“ reicht mir, aber find sucht weiter und es dauert lange, bis der Rest der Dateien fertig ist. Was ich tun möchte, ist so etwas wie ein „Feedback“ von grep zurück, um dies zu finden find könnte aufhören, nach weiteren Dateien zu suchen. Ist so etwas möglich?
Antwort
Bewahren Sie es einfach im Bereich find auf:
find . -type f -exec grep "something" {} \; -quit
So funktioniert es:
Die -exec
funktioniert, wenn die -type f
ist wahr. Und weil grep
0
(Erfolg / wahr) zurückgibt, wenn das hat eine Übereinstimmung, die -quit
wird ausgelöst.
Antwort
find -type f | xargs grep e | head -1
macht genau das: Wenn die head
endet, wird das mittlere Element der Pipe mit einem“ defekten Pipe „benachrichtigt „signalisiert, endet der Reihe nach und benachrichtigt die find
. Sie sollten einen Hinweis wie
xargs: grep: terminated by signal 13
sehen, der dies bestätigt.
Kommentare
- +1 zur Erklärung und Alternative, obwohl mir die andere Antwort eleganter erscheint, da sie autarker ist.
Antwort
Um dies zu tun, ohne die Werkzeuge 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
Kommentare
- +1 wusste nie, dass xargs solche Multitasking-Funktionen haben würde – danke auch für andere Kommentare! 🙂