这个问题已经在这里有了答案:
在Linux或Mac OS X目录中,我使用什么命令来(递归)查找所有文件的大小?
这个问题已经在这里有了答案:
在Linux或Mac OS X目录中,我使用什么命令来(递归)查找所有文件的大小?
Answers:
du
OS X 中使用的BSD版本报告的大小为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的“获取信息”窗口报告的数字完全匹配。(这组文件中没有古怪的fork或xattrs。)它比所报告的值小得多du
。
它是这样工作的:它获取所有文件的列表,并将它们传递给ls -l
; 然后awk
用于计数字节。该-type f
标记在那里,因此只有文件(而不是目录)发送到ls
。如果没有该标志,它还会将目录名称发送到ls
,每个文件将被列出两次:一次作为一个单独的文件,一次作为目录中的一项。
GNU版本du
可以以实际字节而不是块的形式给出值。不幸的是,BSD版本du
没有这么灵活。
du
从带有-b
选项的GNU coreutils中使用时,我得到的结果与find
管道的结果不同。对于36 GB的目录,我得到82 KB的差异。
显示单个文件的大小
du -h path_to_a_file
显示目录,每个子目录和每个文件的内容大小:
du -h path_to_a_directory
显示目录内容的大小:
du -sh path_to_a_directory
du -sch
如果您想要更容易阅读的内容。
du-告诉磁盘使用的不是文件大小。
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
上面的终端代码(在osx 10.6上运行im)为我提供了最佳结果,并且比“ 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
find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
您可以使用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
brew install coreutils
方式将其安装在macOS上:否则,请在不带末尾使用BSD排序命令-h
。
我将您的所有处理方式组合在一起,并与人类可读的输出相结合,结果是:
#!/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 } }}'
-k
选项使用1K字节的块大小