出力ファイルが/ dev / nullのときにtarがファイルの内容をスキップするのはなぜですか?

出力ファイルが/ dev / nullのときにtarがファイルの内容をスキップするのはなぜですか?

400GiBを超えるデータを含むディレクトリがあります。すべてのファイルをエラーなく読み取ることができるかどうかを確認したいので、私が考えた簡単な方法はtarこれです/dev/null

$ time tar cf /dev/null .

real    0m4.387s
user    0m3.462s
sys     0m0.185s
$ time tar cf - . > /dev/null

real    0m3.130s
user    0m3.091s
sys     0m0.035s
$ time tar cf - . | cat > /dev/null
^C

real    10m32.985s
user    0m1.942s
sys     0m33.764s

上記の3番目のコマンドは、Ctrl長時間実行した後に強制的に停止しました。Cさらに、最初の2つのコマンドが機能しているときに含まれるストレージデバイスのアクティビティインジケータは、ほとんど.常にアイドル状態です。 3番目のコマンドが実行されると、インジケータが点灯し続けていて、非常に忙しいという意味です。

この観点から見ると、tar出力ファイルが見つかると、/dev/nullつまり/dev/null書き込み用のファイルハンドルを直接開くと、tarファイル本文がスキップされます。 (vオプションを追加すると、tarディレクトリ内のすべてのファイルがtar「赤」で印刷されます。)

だから知りたいです。なぜこのようなことが起こるのでしょうか?一種の最適化ですか?それでは、なぜtarこの特定の事例に対してそんなに疑わしい最適化がなされたのでしょうか。

私はLinux 4.14.105 amd64でGNU tar 1.26とglibc 2.27を使用しています。

ベストアンサー1

それはい 記録された最適化:

アーカイブが作成されると、/dev/nullGNU tar は入出力操作を最小化しようとします。 GNU tarでAmandaバックアップシステムを使用するときにこの機能を使用する初期サイズ変更プロセスがあります。

おすすめ記事