如何获得stdin的大小?


8

我要压缩一个大目录,并且我想知道结果文件的大小。

我试过使用du

$ tar -cv dir | du -h -
du: cannot access '-': No such file or directory

然后,我尝试使用文件版本“-”:

$ tar -cv dir | du -h /dev/stdin
1.0K

我确定这个数字不正确。如何获得stdin的大小?

Answers:


10

tl; drtar -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圈数成的人类可读的结果。


8
请注意,如果只省略了wc多余的,-则也不需要后续cut命令。
Janis

1
1.0K是stdin的块大小。
科迪·艾伦·泰勒

6

使用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

但是,在ddtar用例中,您实际上都不需要处理流。我重定向到/dev/null上面-但是我可以很容易地重定向到某个文件,并且在编写时仍收到有关其大小的报告。


万一文件被写入磁盘,由于该信息与文件一起存储,因此将无法单独确定大小。(+1)的预期性能提升dd(与相比wc)。
贾尼斯(Janis)2015年

1
@Janis-在最简单的情况下可能是正确的-但可以想象,将dd输出传递给-压缩器-例如,无论出于何种原因,您都希望同时知道档案的原始大小和压缩的原始大小。获取有关记录计数的即时报告也很有用- tar不仅是存档,而是流格式。除了将一组文件保存到其他文件外,还可以使用其他方式。通常在修改流之前将其用于阻塞流很有用。在每个记录边界处都是一整块NUL。
mikeserv

5

我建议:

tar cf - dir | wc -c

一个简单的c(不需要前导-)用于创建tar档案,f指定一个输出文件并-表示它为stdout。(请注意,如果你只想规模和有下面许多文件目录,你可能反而省略tarv性能方面的原因。)


@mikeserv; 我似乎还记得,我tar过去曾与s 一起工作,需要指定tar文件(因此f-)。-抬头看看;没有f -tar假设/etc/mt0为默认。
Janis 2015年

1
我在当时用作手册的书中进行了查找,我认为它是基于SysV R4的。几乎没有人会回想起/etc/mt0真正的含义-“磁带” ;-)我会对Solaris的tar行为表现出浓厚的兴趣(因为Solaris是其中的现代操作系统之一,众所周知它仍然具有非常古老的功能/bin)。
贾尼斯(Janis)2015年

@mikeserv; PS:书中提到AT&T的“ UNIX程序员手册第1卷,2A,2B”作为源(尽管没有手册日期或UNIX发行版;但一定是1980年代初,1983左右)。
贾尼斯(Janis)2015年

你见过这个吗?无关-但是我今天才发现它,并认为您可能会喜欢。
mikeserv 2015年

我不太了解这个答案与我的答案有何不同。是否存在-f标志tar
2015年

1

您的问题的措词很适合tar ... | wc -c上面的答案。我最初以无声的假设来阅读您的问题,即您希望在创建tar文件时报告其大小(也许tar的输出随后通过网络链接进行了管道传输?)。

在这种情况下,我建议pv-管道查看器。我已经看过它的参考资料,但是还没有机会使用它。

参考文献

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.