locate(1)は出力をバッファリングする

locate(1)は出力をバッファリングする

私はlocate(1)ちょっとしたタスクに GNU findutils を使用していますが、出力をバッファリングしているようです。locate の出力を、locate が見つけた行を処理する別のタスクにパイプしています。locate の実行には長い時間がかかる可能性があるため、locate は見つかったファイルをそのまま出力するだろうと思っていましたが、locate は出力をバッファリングしているようです。

TTY で locate を実行すると、最初の一致がすぐに出力され、残りの一致を見つけるのにおそらく 10 秒かかります。

代わりに、locate を実行して cat にパイプすると、コマンド全体が完了するまで何も表示されません。

どうやら、locate は出力をバッファリングしており、それをオフにする方法はないようです。

私が実現したいのは、いくつかのファイルを見つけて、出力をパイプして見つけたらすぐにコマンドを実行することです。

locate something | xargs -n 1 do_something

しかし、何が起こるかというと、find が完了するまで xargs と do_something は呼び出されません。

答え1

もちろん、投稿後すぐに答えを見つけました。投稿時にstackexchangeが提案した投稿

unbuffer(expect から) これを解決します。

unbuffer locate something | xargs -n 1 do_something

見つけられる限り速くコマンドを実行します。

答え2

locateSTDOUT ストリームをバッファリングする場合は、STDOUT をlocateバッファリングしない (または行をバッファリングする) 必要があります。

GNU システムを使用している場合は、stdbuf(GNU に付属coreutils) を使用できます。

STDOUT をlocateバッファリングせずに作成するには:

stdbuf -o0 locate something | ...

バッファリングされた行:

stdbuf -oL locate something | ...

さらに詳しい情報を得るにはチェックしてくださいman stdbuf

関連情報