2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76
Advertisement

如何从命令行获取Linux或Mac OS X目录的大小?

Advertisement

我用什么命令来查找Linux或Mac OS X目录中所有文件的大小(递归)?

Advertisement
Advertisement

答案 (5)

83
83
83
2012-03-18 05:54:47 +0000

OS X中使用的BSD版本的du以512字节的块报告大小–大小基本上是四舍五入到下一个512字节的值。这告诉你磁盘上的空间,它比数据量大。如果你有很多小文件,差别就会很大。

这是一个例子。

这是有规律的du的值。它是以512字节的块为单位的。

$ du -s
248 .

-h标志的结果是一个更易读的数字,单位是千字节。正如所料,它是512字节块数的一半。

$ du -hs
124K .

最后,你可以用findawk来给出文件中实际字节数的总和。这有点慢,但很有效。

$ 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没有这么灵活。

75
75
75
2009-08-13 20:01:52 +0000

du -h path_to_a_file

显示单个文件的大小

显示一个目录、每个子目录和每个单独文件内容的大小。

du -h path_to_a_directory

显示一个目录内容的大小。

du -sh path_to_a_directory

9
Advertisement
9
9
2013-11-11 22:31:48 +0000
Advertisement

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
``` 。
6
6
6
2015-03-05 14:03:07 +0000

你可以使用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&

2
Advertisement
2
2
2014-03-05 11:30:06 +0000
Advertisement

我结合了你所有的应用,并将其与人类可读的输出相结合,结果是。

#!/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 } }}'

链接到要点。 https://gist.github.com/mlegenhausen/9365461

Advertisement

相关问题

6
10
12
7
8
Advertisement
Advertisement