xen*_*ide 236 command-line disk-usage text-processing sort units
你如何du -sh /dir/*按大小排序?我读过一个网站说使用,| sort -n但这显然是不对的。这是一个错误的例子。
[~]# du -sh /var/* | sort -n
0 /var/mail
1.2M /var/www
1.8M /var/tmp
1.9G /var/named
2.9M /var/run
4.1G /var/log
8.0K /var/account
8.0K /var/crash
8.0K /var/cvs
8.0K /var/games
8.0K /var/local
8.0K /var/nis
8.0K /var/opt
8.0K /var/preserve
8.0K /var/racoon
12K /var/aquota.user
12K /var/portsentry
16K /var/ftp
16K /var/quota.user
20K /var/yp
24K /var/db
28K /var/empty
32K /var/lock
84K /var/profiles
224M /var/netenberg
235M /var/cpanel
245M /var/cache
620M /var/lib
748K /var/spool
Run Code Online (Sandbox Code Playgroud)
Sha*_*off 310
如果你有 GNU coreutils(在大多数 Linux 发行版中很常见),你可以使用
du -sh -- * | sort -h
Run Code Online (Sandbox Code Playgroud)
该-h选项告诉sort输入是人类可读的格式(带单位的数字;基于 1024,因此 1023 被认为小于 1K,这恰好与 GNU 匹配du -h)。
此功能已于 2009 年 8 月添加到 GNU Core Utilities 7.5 中。
笔记:
如果您使用的是旧版本的 Mac OSX,则需要使用
brew install coreutils? 然后gsort用作sort.较新版本的 macOS(已在 Mojave 上验证)
sort -h本机支持。
pbo*_*oin 51
尝试使用 -k 标志来计算 1K 块,而不是使用人类可读的。然后,您就有了一个通用单位,并且可以轻松地进行数字排序。
du -ck | sort -n
Run Code Online (Sandbox Code Playgroud)
你没有明确要求人类单位,但如果你这样做了,那么有很多方法可以做到。许多人似乎使用了上面的 1K 块技术,然后再次调用 du。
https://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size
如果要查看添加的 KB 单位,请使用:
du -k | sed -e 's_^\([0-9]*\)_\1 KB_' | sort -n
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 19
如果您没有最新版本的 GNU coreutils,您可以调用du而无需-h获得可排序的输出,并通过一些后处理生成对人类友好的输出。即使您的版本du没有-h标志,这也具有工作的优势。
du -k | sort -n | awk '
function human(x) {
if (x<1000) {return x} else {x/=1024}
s="kMGTEPZY";
while (x>=1000 && length(s)>1)
{x/=1024; s=substr(s,2)}
return int(x+0.5) substr(s,1,1)
}
{gsub(/^[0-9]+/, human($1)); print}'
Run Code Online (Sandbox Code Playgroud)
如果您想要 SI 后缀(即 1000 的倍数而不是 1024),请将while循环体中的 1024 更改为 1000 。(请注意,条件中的 1000 是有意的,因此您得到的是 eg1M而不是1000k。)
如果您du可以选择以字节为单位显示大小(例如-b或-B 1- 请注意,这可能会产生计算实际文件大小而不是磁盘使用量的副作用),请在s(ie s=" kMGTEPYZ";)的开头添加一个空格,或if (x<1000) {return x} else {x/=1024}在该human功能。
显示 1-10 范围内的数字的十进制数字留给读者作为练习。
如果你没有,sort -h你可以这样做:
du -sh * | sed 's/\([[:digit:]]\)\t/\1B\t/' | sed 's/\(.\t\)/\t\1/' | sed 's/G\t/Z\t/' | sort -n -k 2d,2 -k 1n,1 | sed 's/Z\t/G\t/'
Run Code Online (Sandbox Code Playgroud)
这将获取 du 列表,分隔后缀,并使用它进行排序。由于 <1K 没有后缀,所以第一个 sed 添加了一个 B(用于字节)。第二个 sed 在数字和后缀之间添加一个分隔符。第三个 sed 将 G 转换为 Z,使其大于 M;如果您有 TB 级的文件,则必须将 G 转换为 Y,将 T 转换为 Z。最后,我们按两列排序,然后替换 G 后缀。
小智 7
在 OS X 上,您可以通过Homebrew安装所需的 coreutils :
brew install coreutils
Run Code Online (Sandbox Code Playgroud)
有了这个,您将拥有gsort,其中包括-h命令行参数。
由于 Mac OS X 没有选项-h(sort我可能使用 Mavericks 或 Yosemite),所以我尝试并学习了sed第awk一次尝试:
du -sk * | sort -g | awk '{ numBytes = $1 * 1024; numUnits = split("B K M G T P", unit); num = numBytes; iUnit = 0; while(num >= 1024 && iUnit + 1 < numUnits) { num = num / 1024; iUnit++; } $1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]); print $0; }'
Run Code Online (Sandbox Code Playgroud)
这是一条很长的线。展开来就是:
du -sk * | sort -g | awk '{
numBytes = $1 * 1024;
numUnits = split("B K M G T P", unit);
num = numBytes;
iUnit = 0;
while(num >= 1024 && iUnit + 1 < numUnits) {
num = num / 1024;
iUnit++;
}
$1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]);
print $0;
}'
Run Code Online (Sandbox Code Playgroud)
我在 Mac OS X Mavericks、Yosemite、Ubuntu 2014-04 上尝试过,使用awk默认值awk(即nawk,因为awk和都nawk指向/usr/bin/mawk)或 gawk,它们都有效。
以下是 Mac 上的输出示例:
0B bar
0B foo
4.0K wah
43.0M Documents
1.2G Music
2.5G Desktop
4.7G Movies
5.6G VirtualBox VMs
9.0G Dropbox
11.7G Library
21.2G Pictures
27.0G Downloads
Run Code Online (Sandbox Code Playgroud)
而不是du -sk *,我在@Stefan的答案中看到,其中还显示了总计,并且没有遍历任何文件系统挂载点,通过使用du -skcx *