Answers:
通常,du
显示有关磁盘使用情况的信息(其名称来自何处)。请记住
disk usage != sum of file sizes
因为每个文件占用文件系统上的许多块(man mkfs.ext2
例如,请参见)。这意味着,仅在极少数情况下,文件的磁盘使用量等于其实际大小-为此,该大小必须恰好是块大小的倍数。
可以将文件系统块视为包含文件部分的框-每个框只能包含一个文件的一部分。
对于的GNU版本du
,请检查该--apparent-size
选项。
当文件系统上有一些稀疏文件时,可能会发生更有趣的情况!
actual
或的引用apparent
。(另请参阅我的最新解释)。
关于Mac OS X和Finder(在Snow Leopard,版本10.6.8中),我注意到了以下内容。
bash
(1)中)获取路径(文件或文件夹)的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
#!/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
du
(1)和(gnu)gdu
(1)似乎都没有计算扩展属性(xattr
)然后我必须在这个时候双关语 “运行路径并做数学”“
和平与晚安”。
在我的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
coreutils
以获得du
as 的GNU版本gdu
。因此,它不是完全可移植的,但是对于OS X上的人们来说,获得一些核心实用程序的GNU版本可能很有用。