我有一个bash脚本需要知道目录中所有gzip文件的字节数。现在,我假设它只是一个没有子目录的目录。做这样的事很有诱惑力:
du -scb /my/dir/*.gz|tail -n 1
但是,我有一大堆文件。 *.gz
不会扩展到某种溢出条件吗?有没有更快,更安全的方法来检查这个数字?
答案 0 :(得分:4)
这有效且“安全”:
(find . -type f -print0 |
xargs -0 stat -c '%s' |
tr '\n' '+'; echo 0) |
bc
工作原理:
find
查找'.gz'文件。使用nul-separator打印它们,这样我们就可以处理奇怪的文件名。xargs
会将文件名组分解为可管理的块。将这些文件名提供给stat -c '%s'
以获取字节大小(感谢@Fritschy)。tr
将换行符转换为+
。 echo在末尾添加一个额外的0加一个换行符。这样我们就不会有悬挂的加号,bc
在输入结束时需要换行。答案 1 :(得分:1)
echo $(( $(find . -type f -name '*.gz' -printf '%s+') 0 ))
如果您需要巨大的值,请将'%s+'
更改为'%s+0'
并将$(( ... 0 ))
更改为... | bc
修改:对于更大的值,您可能希望使用%k
代替%s
,从而获得千字节数。因为整数可能会溢出。
由于我们只在bash中使用内置函数,因此我不确定可执行文件的参数长度是否有问题。