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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.