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
locate
den STDOUT-Stream puffert, müssen Sie den STDOUT locate
ungepuffert (oder zeilenweise gepuffert) machen.
Wenn Sie ein GNU-System verwenden, können Sie verwenden stdbuf
(wird mit GNU geliefert coreutils
).
So schalten Sie STDOUT locate
ungepuffert:
stdbuf -o0 locate something | ...
Zeilengepuffert:
stdbuf -oL locate something | ...
Schauen Sie nach man stdbuf
, um mehr zu erfahren.