目录大小计算差异


9

我需要获取终端中目录的大小以进行签名。我正在使用以下命令:

du -s /path/to/dir

我将结果乘以传统的UNIX块大小(512字节),并得到以字节为单位的实际目录大小。但是,Finder的“获取信息”对话框窗口显示的大小略小于使用terminal命令计算的大小。而且似乎可以在任何文件夹/捆绑包上复制。我想念什么?

Answers:


11

通常,du显示有关磁盘使用情况的信息(其名称来自何处)。请记住

disk usage != sum of file sizes

因为每个文件占用文件系统上的许多man mkfs.ext2例如,请参见)。这意味着,仅在极少数情况下,文件的磁盘使用量等于其实际大小-为此,该大小必须恰好是块大小的倍数。

可以将文件系统块视为包含文件部分的框-每个框只能包含一个文件的一部分。

对于的GNU版本du,请检查该--apparent-size选项。


当文件系统上有一些稀疏文件时,可能会发生更有趣的情况!


没有这样的选项(我使用的是OS X,而不是Linux)。可能需要提一个问题,因为标记不够。)
Eimantas 2011年

啊,对。。。然后看一下联机帮助页,然后尝试找到对actual或的引用apparent。(另请参阅我的最新解释)。
rozcietrzewiacz 2011年

2
除不等式外,更正。文件大小有时可能会大于存储它们所需的实际磁盘空间。(unix.stackexchange.com/q/33801/9426
斯特凡Gimenez的

@StéphaneGimenez哇...谢谢你告诉我!
rozcietrzewiacz 2012年

2

关于Mac OS X和Finder(在Snow Leopard,版本10.6.8中),我注意到了以下内容。

  • 我使用下面的代码(在bash(1)中)获取路径(文件或文件夹)的Finder“量化”图形的字节数。
  • Finder的“信息”窗口和窗格以十进制(以10为基数,1000)字节显示“量化”(例如,千字节)数字,而不是以二进制(以2、1024为基数)字节显示,因此我通过除以“量化” 1000并增加单位(字节)作为前缀“ quantifier”(量级)(幅度),并进行一些奇怪的“ off key”舍入。(我的完整代码充满了注释不清的开发代码,并且分成多个文件(和语言),因此很难共享。)
    到目前为止,我已经看到我的“量化”数字与Finder中的“量化”数字相同。
  • 另外,连同代码,我想说的是BLOCKSIZE,我的外壳中没有设置(也从未设置过)环境变量,但是我测试了一下(现在有一点)两个版本和默认值都$BLOCKSIZE给出了相同的值。

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • 我没有匹配的未量化数字。
    我唯一能说的是,我仅通过计数文件(因此不包括目录〜'file-system meta index / header'〜data)来获得距离,而与之最接近的是以下内容。

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • (xnu)du(1)和(gnu)gdu(1)似乎都没有计算扩展属性(xattr

然后我必须在这个时候双关语 “运行路径并做数学”“
和平与晚安”。


1

在我的Ubuntu系统上,使用ext4 du -b file给出实际文件du -b dir的大小(以字节为单位),并给出文件的大小(以字节为单位)+目录开销。在我的情况下,开销是4096字节的倍数..

该开销随着文件数量的增加而增加。
注意:即使文件被删除,目录开销仍保持在删除文件之前的较高级别。

我没有尝试重新启动,以查看它是否可以还原,但是无论哪种情况,这都意味着目录的大小会根据历史情况而变化。

计算总文件大小的准确值可能是最好的选择。

以下脚本总计所有文件大小(以字节为单位)。

对于OS X,如果您没有-b用于'du'的选择器,则可以使用stat。(如果您有:)...注释行显示了Ubuntu的stat替代品du -b

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSX 没有,du -b并且有所不同stat。您的脚本都不能在Linux外部移植。
吉尔(Gilles)'所以

使用OS X上的MacPorts,您可以安装coreutils以获得duas 的GNU版本gdu。因此,它不是完全可移植的,但是对于OS X上的人们来说,获得一些核心实用程序的GNU版本可能很有用。
drfrogsplat 2012年

1

对目录中的所有文件求和:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


find: unrecognized: -printf。高山图片
gadelat
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.