locate(1) puffert seine Ausgabe

locate(1) puffert seine Ausgabe

Ich verwende locate(1)GNU findutils für eine kleine Aufgabe und es scheint, als ob es seine Ausgabe puffert. Ich leite die Ausgabe von Locate an eine andere Aufgabe weiter, die die Zeilen verarbeitet, sobald Locate sie findet. Da Locate lange dauern kann, dachte ich, dass Locate die Dateien so ausdruckt, wie sie gefunden wurden, aber es scheint, dass Locate die Ausgabe puffert.

Wenn ich „locate“ auf einem TTY ausführe, wird die erste Übereinstimmung sofort ausgedruckt und es dauert vielleicht 10 Sekunden, um die restlichen Übereinstimmungen zu finden.

Wenn ich stattdessen „locate“ ausführe, aber eine Pipe an „cat“ sende, sehe ich nichts, bis der gesamte Befehl abgeschlossen ist.

Es scheint, dass Locate die Ausgabe puffert und es keine Möglichkeit gibt, dies abzuschalten.

Ich möchte einige Dateien lokalisieren und unmittelbar nach dem Auffinden einen Befehl ausführen, indem ich die Ausgabe weiterleite.

locate something | xargs -n 1 do_something

Was jedoch passiert, ist, dass xargs und daher do_something nicht aufgerufen werden, bis find abgeschlossen ist.

Antwort1

Natürlich fand ich die Antwort sofort nach dem Posten, in einemVon Stackexchange beim Posten vorgeschlagener Beitrag.

unbuffer(von expect) löst dieses Problem.

unbuffer locate something | xargs -n 1 do_something

führt die Befehle so schnell aus, wie Locate sie finden kann.

Antwort2

locateden STDOUT-Stream puffert, müssen Sie den STDOUT locateungepuffert (oder zeilenweise gepuffert) machen.

Wenn Sie ein GNU-System verwenden, können Sie verwenden stdbuf(wird mit GNU geliefert coreutils).

So schalten Sie STDOUT locateungepuffert:

stdbuf -o0 locate something | ...

Zeilengepuffert:

stdbuf -oL locate something | ...

Schauen Sie nach man stdbuf, um mehr zu erfahren.

verwandte Informationen