如何获取实际目录大小(来自 du)?

如何获取实际目录大小(来自 du)?

如何使用 UNIX/Linux 标准工具获取实际目录大小?

备选问题:我如何获得显示实际目录大小(而不是磁盘使用情况)?

由于人们似乎对“大小”一词有不同的定义:我对“目录大小”的定义是该目录中所有常规文件的总和。

我并不关心目录 inode 的大小,也不关心文件在相应文件系统上占用的容量(块 * 块大小)。如果一个目录包含 3 个文件,每个文件占 1 字节,则目录大小为 3 字节(根据我的定义)。

使用 du 计算目录大小似乎不可靠。
例如,mkdir foo && du -b foo报告“4096 foo”,4096 字节而不是 0 字节。对于非常大的目录,报告的目录大小du -hs可能会有 100 GB (!) 甚至更多(压缩文件系统)。

那么,必须使用什么(工具/选项)来获取实际目录大小?

答案1

这是一个使用 Unix 标准工具(POSIX)显示人类可读的目录大小的脚本。

#!/bin/sh
find ${1:-.} -type f -exec ls -lnq {} \+ | awk '
BEGIN {sum=0} # initialization for clarity and safety
function pp() {
  u="+Ki+Mi+Gi+Ti+Pi+Ei";
  split(u,unit,"+");
  v=sum;
  for(i=1;i<7;i++) {
    if(v<1024) break;
    v/=1024;
  }
  printf("%.3f %sB\n", v, unit[i]);
}
{sum+=$5}
END{pp()}'

例如:

$ ds ~        
72.891 GiB

答案2

某些版本支持显示表观大小而不是磁盘使用情况的du参数。因此,您的命令将是:--apparent-size

du -hs --apparent-size

从 Ubuntu 12.04 LTS 附带的 du 手册页中:

--apparent-size
      print apparent sizes,  rather  than  disk  usage;  although  the
      apparent  size is usually smaller, it may be larger due to holes
      in (`sparse') files, internal  fragmentation,  indirect  blocks,
      and the like

答案3

假设您有duGNU coreutils,此命令应该计算目录内任意数量的常规文件的总表观大小,而对文件数量没有任何任意限制:

find . -type f -print0 | du -scb --files0-from=- | tail -n 1

如果里面有一些硬链接文件,则添加-l选项du,并且您想要分别计算每个硬链接(默认情况下du仅计算一次多个硬链接)。

与 plain 最重要的区别du -sb是 recursivedu还计算目录的大小,而不同的文件系统报告目录的大小不同;为了避免这种情况,该find命令仅用于将常规文件传递给du。另一个区别是符号链接被忽略(如果应计算它们,find则应调整命令)。

此命令也将消耗比普通命令更多的内存,因为du -sb使用--files0-from=FILEdu全部已处理的文件,而不是默认行为,即只记住具有多个硬链接的文件。(如果-l使用该选项多次计数硬链接,则这不是问题,因为存储设备和 inode 编号的唯一原因是跳过已经处理过的硬链接文件。)

如果您想获得总大小的可读表示,只需添加选项-h(这有效,因为du只调用一次并计算总大小本身,与其他一些建议的答案不同):

find . -type f -print0 | du -scbh --files0-from=- | tail -n 1

或者(如果您担心的某些效果-b会被覆盖-h

find . -type f -print0 | du -sc --apparent-size -h --files0-from=- | tail -n 1

答案4

如果你只想要文件的大小(不包括目录占用的空间),你可以这样做

find . -type f -print0 | xargs -0 du -scb | tail -n 1

@SergeyVlasov 指出,如果你的文件数量超过argmax。为了避免这种情况,你可以使用类似以下方法:

find . -type f -exec du -sb '{}' \; | gawk '{k+=$1}END{print k}'

相关内容