我即将压缩一个大目录,我想知道生成的文件到底有多大。
我尝试过使用du
:
$ tar -cv dir | du -h -
du: cannot access '-': No such file or directory
然后我尝试使用“-”的文件版本:
$ tar -cv dir | du -h /dev/stdin
1.0K
我确信这个数字不准确。如何获取标准输入的大小?
答案1
太长了;博士: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
数字转换为人类可读的结果。
答案2
我建议:
tar cf - dir | wc -c
一个简单的c
(不需要前导-
)用于创建一个tar
存档,f
指定一个输出文件并-
表示它是标准输出。 (请注意,如果您只想要大小并且下面有很多文件目录出于性能原因,您可能宁愿省略tar
's 。)v
答案3
使用 GNUtar
你可以这样做:
tar --totals -c . >/dev/null
...这将呈现输出像...
Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)
...在标准错误上。同样,对于任何 tar(或流)您可以使用它dd
来提供字节计数报告。这可能比 更好,也可能不是wc
,但dd
默认块大小为 512 字节 - 这与tar
的块大小相同。如果您的系统的管道缓冲区如果足够大,您甚至可以扩展 的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
上面 - 但我可以轻松地重定向到某个文件,并且仍然收到编写该文件时的大小报告。
答案4
你的问题的措辞适合tar ... | wc -c
上面的答案。我最初阅读您的问题时有一个无声的假设,即您希望在创建 tar 文件时报告大小(也许 tar 的输出随后通过网络链接进行管道传输?)。
在这种情况下,我建议pv
使用管道查看器。我已经看到了它的参考,但还没有机会使用它。
参考