400 GiB以上のデータを含むディレクトリがあります。私はすべてのファイルがエラーなしで読めることを確認したかったので、私が考えた簡単な方法はに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を使用しています。
pv
:tar -cf - | pv >/dev/null
。それは問題を回避し、進捗情報(さまざまなpv
オプション)を提供します
gtar -cf /dev/zero ...
好きなものを取得するために使用します。
find . -type f -exec shasum -a256 -b '{}' +
。実際にすべてのデータを読み取ってチェックサムするだけでなく、出力を保存する場合は、後で再実行してファイルの内容が変更されていないことを確認できます。