OS X中使用的BSD版本的du
以512字节的块报告大小–大小基本上是四舍五入到下一个512字节的值。这告诉你磁盘上的空间,它比数据量大。如果你有很多小文件,差别就会很大。
这是一个例子。
这是有规律的du
的值。它是以512字节的块为单位的。
$ du -s
248 .
-h
标志的结果是一个更易读的数字,单位是千字节。正如所料,它是512字节块数的一半。
$ du -hs
124K .
最后,你可以用find
和awk
来给出文件中实际字节数的总和。这有点慢,但很有效。
$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527
这个值和Finder的Get Info窗口报告的数字完全一致。(这组文件中没有奇怪的叉号或xattrs。)它比du
报告的值小得多。
下面是它的工作原理:它得到一个所有文件的列表,并将它们传递给ls -l
;然后awk
被用来计算字节数。-type f
标志的存在是为了让只有文件(而不是目录)被发送到ls
。如果没有这个标志,它也会将目录名发送到 ls
,而且每个文件会被列出两次:一次是作为一个单独的文件,一次是作为目录中的一个项目。
GNU版本的du
可以用实际的字节而不是块来给出值。不幸的是,BSD版本的du
没有这么灵活。
du -h path_to_a_file
显示单个文件的大小
显示一个目录、每个子目录和每个单独文件内容的大小。
du -h path_to_a_directory
显示一个目录内容的大小。
du -sh path_to_a_directory
du - 显示的是磁盘使用情况,而不是文件大小。
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
上面的终端代码(我在osx 10.6上)为我提供了最好的结果,比 “find … -exec "快得多
快速基准
time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970
real 0m0.086s
user 0m0.029s
sys 0m0.073s
time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970
real 0m18.515s
user 0m2.929s
sys 0m9.339s
``` 。
你可以使用du -ah .
,它可以递归显示所有文件和目录的大小。
这可以和sort
结合使用,所以你会看到当前文件夹中最大的20个目录。
du -ah . | sort -rh | head -20
注意: -h
的选项sort
在OSX/BSD上是不可用的, 所以你必须从sort
安装coreutils
(例如通过brew
),并将bin路径应用到PATH
,例如
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
否则使用:
du -a . | sort -rn | head -20
否则使用:
0x1&
我结合了你所有的应用,并将其与人类可读的输出相结合,结果是。
#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'