如何找到列表中的文件使用了多少磁盘空间?我正在寻找一个变体
du -s *.sql
我只想查看总计,上面的命令总是为每个文件显示一行。
答案1
用于du -c
获取总计,然后通过管道tail
仅获取最后一行(总计):
du -c -- *.sql | tail -n 1
好像没有办法让du
自己举报只是一组文件的总数。
这--
不是必需的,但如果要在脚本中使用此命令,强烈建议这样做。它标记选项的结束并防止一些有趣的文件名。请参阅此处了解更多信息“--”(双破折号)是什么意思?
一些技术上的挑剔:
如果任何*.sql
文件是“隐藏”的(文件名以点开头),那么它们将不会被包含在内。这是因为默认情况下 glob 不包含隐藏文件。
为此*.sql
,目录du
将包括全部递归地访问这些目录中的文件。
使用 zsh 您可以编写*.sql(^/)
排除目录。或者*.sql(D)
包含隐藏文件。有关更多信息,请查找 zsh glob 限定符。
为此*.sql
,符号链接du
将计算链接本身的大小,而不是它指向的目标的大小。用于du -H
获取链接目标的大小。
请注意,在任何情况下,du
包括 GNU 在内的大多数实现du
都只会计算唯一文件的磁盘使用情况。因此,如果foo.sql
是硬链接bar.sql
(或符号链接并被-H
使用),则其磁盘使用量将仅计算一次。
如果您计划将文件复制到不支持硬链接的文件系统,这可能会导致混乱。在大多数情况下,硬链接文件将被复制两次,最终您在目标系统上需要的磁盘空间将多于所示的磁盘空间du
。
通过 GNU 实现,可以使用du
该选项来跳过重复数据删除。-l
答案2
从你的例子来看,什么不起作用?你想要一笔钱吗?
man du
显示该-c
选项提供了使用总和:
du -sc -- *.sql
您可能还喜欢-h
或-k
参数。
答案3
你的问题非常含糊,但我怀疑你正在寻找-c
标志来产生总数。
du -c -- *.sql
答案4
如果您可以使用 find 生成文件列表(或其他内容),您还可以:
find {directory} {matching expression} -exec stat -c "%s" {} \; | awk 'BEGIN{total=0} {total=total+$1} END{print total/1000000.00}'
例如,要查看 /some/dir 中所有 .jar 文件的总大小(以 MB 为单位):
find /some/dir -name '*.jar' -exec ...
虽然这确实为每个文件执行一个进程,但结果相当快。