2010-12-14 62 views
3

我有一个bash脚本,需要知道目录中所有gzip文件的字节数。现在,我假设它只是一个没有子目录的单一目录。这是非常诱人的做这样的事情:统计目录中所有gzip文件的字节数

du -scb /my/dir/*.gz|tail -n 1

不过,我有文件的TON。 *.gz不会扩展到某种溢出状态吗?有没有更快,更安全的方法来检查这个数字?

+0

你看起来很好。任何体面的实现都将支持64位文件(我的意思是大于2GB),因此也支持64位总计。 – 2010-12-14 23:47:10

+1

@Chris我认为他担心超出命令行长度限制。在大多数Linux系统中,它非常庞大(如果我没记错的话,它是128kB),但在一些* nixes中它非常小(我认为在Solaris上它大概是255字节)。 – 2010-12-14 23:54:28

+0

命令行长度限制是我关心的问题。有没有办法从bash中设置和获取这个值? – User1 2010-12-15 20:12:42

回答

4

这个工程,是 “安全”:

(find . -type f -print0 | 
    xargs -0 stat -c '%s' | 
    tr '\n' '+'; echo 0) | 
    bc 

工作原理:

  • 首先,使用find,找到 '广州' 的文件。用无分隔符打印它们,所以我们可以处理奇怪的文件名。
  • xargs将把文件名组拆分成可管理的块。将这些文件名分配给stat -c '%s'以获取字节大小(谢谢@Fritschy)。
  • tr将换行符转换为+。回声在最后加上一个0加上一个换行符。这是因为我们不会得到一个悬挂加号,并且bc需要在输入结尾处换行。
  • 将巨额款项转入bc。
+0

不错的,检查'统计(1)',它可以根据给定的格式统计文件和打印信息。 – 2010-12-14 23:54:20

+0

@Fritschy:谢谢,我不知道'stat(1)'。纳入答案。 – 2010-12-15 00:05:02

1
echo $(($(find . -type f -name '*.gz' -printf '%s+') 0)) 

如果您需要巨大值,改变'%s+''%s+0',改变$((... 0))... | bc

编辑:对于更大的价值,您可能需要使用%k,而不是%s,给你千字节。由于整数可能溢出。

因为我们只在bash中使用内置函数,所以我不确定可执行文件的参数长度是否有问题。

相关问题