Answers:
tl; dr:tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'
du
实际上并不计算文件本身的大小。它只是要求内核查询文件系统,该文件系统已经跟踪了文件大小。这就是为什么它这么快的原因。因此,您正在计算流而不是文件的du
事实不起作用。我的猜测是内核中1.0K
的硬编码大小/dev/std*
。
解决方案是使用wc -c
,它自己对字节计数而不是查询内核:
$ tar -cv dir | wc -c
如果要输出类似于du -h
:
$ tar -cv dir | wc -c | awk '{print $1/1000"K"}'
的awk
圈数成的人类可读的结果。
使用GNU,tar
您可以执行以下操作:
tar --totals -c . >/dev/null
...将呈现类似...的输出
Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)
...在stderr上 同样,对于任何tar (或流),您都可以使用它dd
来提供有关字节数的报告。这可能优于或可能不理想wc
,但dd
默认为512字节的块大小-与tar
的块大小相同。如果系统的PIPE_BUF足够大,您甚至可以扩展dd
的块大小以匹配tar
的记录大小-20块或10240字节。像这样:
tar -c . | dd bs=bx20 >/dev/null
585+0 records in
585+0 records out
5990400 bytes (6.0 MB) copied, 0.0085661 s, 699 MB/s
这可能会或可能不会提供比更好的解决方案wc
。
但是,在dd
和tar
用例中,您实际上都不需要处理流。我重定向到/dev/null
上面-但是我可以很容易地重定向到某个文件,并且在编写时仍收到有关其大小的报告。
dd
(与相比wc
)。
dd
输出传递给-压缩器-例如,无论出于何种原因,您都希望同时知道档案的原始大小和压缩的原始大小。获取有关记录计数的即时报告也很有用- tar
不仅是存档,而是流格式。除了将一组文件保存到其他文件外,还可以使用其他方式。通常在修改流之前将其用于阻塞流很有用。在每个记录边界处都是一整块NUL。
我建议:
tar cf - dir | wc -c
一个简单的c
(不需要前导-
)用于创建tar
档案,f
指定一个输出文件并-
表示它为stdout。(请注意,如果你只想规模和有下面许多文件目录,你可能反而省略tar
的v
性能方面的原因。)
tar
过去曾与s 一起工作,需要指定tar文件(因此f
和-
)。-抬头看看;没有f
-
的tar
假设/etc/mt0
为默认。
/etc/mt0
真正的含义-“磁带” ;-)我会对Solaris的tar
行为表现出浓厚的兴趣(因为Solaris是其中的现代操作系统之一,众所周知它仍然具有非常古老的功能/bin
)。
-f
标志tar
?
您的问题的措词很适合tar ... | wc -c
上面的答案。我最初以无声的假设来阅读您的问题,即您希望在创建tar文件时报告其大小(也许tar的输出随后通过网络链接进行了管道传输?)。
在这种情况下,我建议pv
-管道查看器。我已经看过它的参考资料,但是还没有机会使用它。
参考文献
wc
多余的,-
则也不需要后续cut
命令。