我有一个包含超过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
在运行了很长时间之后,上面的第三个命令被Ctrl+ 强制停止C。此外,当前两个命令正在工作时,包含该存储设备的活动指示器.
几乎始终处于空闲状态。使用第三个命令,指示灯会持续亮起,这意味着非常忙碌。
如此看来,当tar
能够发现其输出文件为时/dev/null
,即当/dev/null
直接打开以具有tar
写入的文件句柄时,文件主体就会被跳过。(添加v
选项tar
的确会打印tar
红色目录中的所有文件。)
所以我想知道,为什么会这样呢?是某种优化吗?如果是,那么为什么还要tar
针对这种特殊情况进行如此可疑的优化呢?
我在Linux 4.14.105 amd64上使用带有glibc 2.27的GNU tar 1.26。
pv
:tar -cf - | pv >/dev/null
。那回避了问题,并为您提供了进度信息(各种pv
选项)
gtar -cf /dev/zero ...
得到你喜欢的东西。
find . -type f -exec shasum -a256 -b '{}' +
。它不仅实际读取并校验所有数据,而且还存储了输出,以后可以重新运行以检查文件内容是否未更改。