如何按人类可读的大小对数字进行排序?


20

例如,我有一条显示文件夹占用空间的命令

du folder | sort -n

它很好用,但是我想拥有人类可读的形式

du -h folder

但是,如果执行此操作,则无法将其排序为数字。

如何加入du folderdu -h folder查看输出排序为du folder,但第一列来自du -h folder

PS这只是一个例子。这项技术对我可能非常有用(如果可能的话)

Answers:


11

这是一种更通用的方法。获取du folderdu -h folder在两个不同文件中的输出。

du folder > file1
du -h folder > file2

的关键部分是这样的:串连file1file2逐行,用合适的分隔符。

paste -d '#' file1 file2 > file3

(假设#没有出现在file1和中file2

现在排序file3。请注意,这将根据file1内容排序,并按内容断开联系file2。使用cut以下命令提取相关结果:

sort -n -k1,7 file3 | cut -d '#' -f 2

还要看看man sort其他选项。


您也可以将其另存为别名,以备将来使用。为此,请将以下内容添加到的底部~/.bashrc

sorted-du () {
    paste -d '#' <( du "$1" ) <( du -h "$1" ) | sort -n -k1,7 | cut -d '#' -f 2
}

然后,打开一个新的终端会话并执行新的别名:

sorted-du /home

我在最后一部分中添加了有关如何使您的解决方案成为别名的内容。
沙洛爵士(SirCharlo)2012年

1
在别名中使用实际文件(然后在它们上调用rm)是一个非常糟糕的主意!想一想,如果我的目录中确实有一个命名的文件file3,将会被覆盖然后删除!@SirCharlo我正在从此答案中删除别名定义,并用更安全的名称替换它。
jmiserez

那么askubuntu.com/a/80248/22308只需与sort -h
Nam G VU

36

尝试类似的方法:

du -h folder | sort -h

替代方法:-n用于数字排序

注意:-hsort选项仅在较新版本的Ubuntu中存在。


3
版本8.17中有,所以我想这是最简单的方法
steabert 2012年

1
感谢steabert指出sort命令已从sort --version = 8.17得到改进,这是Ubuntu较新版本的最佳答案。
卡特·阿姆斯特丹

这应该是被接受的原因之一,因为它可以通过使用sort -h
Nam G VU

4

该答案适用于10.04.4LTS和更低版本的Ubuntu。

不幸的是,对KMG进行分类的准确答案既困难又复杂:

您可以使用此命令对整个du命令使用别名,该命令对人类可读内容进行排序

alias duf='du -sk * | sort -n | perl -ne '\''($s,$f)=split(m{\t});for (qw(K M G)) {if($s<1024) {printf("%.1f",$s);print "$_\t$f"; last};$s=$s/1024}'\'

我在这里找到的

http://www.earthinfo.org/linux-disk-usage-sorted-by-size-and-human-可读/

只需将cd放入您想知道的文件夹中,然后duf

您可以将此duf别名添加到/home/user/.profile的末尾,以使duf命令成为半永久性

结果:

user@hostname:~$ duf
0.0K  Documenten
0.0K  Muziek
0.0K  Openbaar
0.0K  Sjablonen
0.0K  Video's
4.0K  backup_db.sql.g
4.0K  examples.desktop
12.0K xml printer ticket
52.0K hardinfo_report.html
152.0K    librxtxSerial.so
2.7M  jpos
4.4M  nxclient_3.5.0-7_amd64.deb
6.4M  nxnode_3.5.0-4_amd64.deb
6.8M  Downloads
7.4M  nxserver_3.5.0-5_amd64.deb
12.4M NetBeansProjects
18.1M mysqlworkbench.deb
28.3M Afbeeldingen
45.8M ergens-20110928-18.sql.gz
60.5M 2012-06-02ergens_archive.tar.gz
65.5M 2012-08-26ergens_archive.tar.gz
65.6M 2012-08-28ergens_archive.tar.gz
65.6M 2012-08-29ergens_archive.tar.gz
65.7M 2012-08-30ergens_archive.tar.gz
113.0M    Bureaublad
306.2M    ergens-20110928-18.sql

这就是为什么du -sch /var/* | sort -n不起作用,请参阅MKKMMKKMMK的排序

user@hostname:~$ du -sch /var/* |sort -n

0 /var/crash
0 /var/local
0 /var/lock
0 /var/opt
8,0M  /var/backups
12K   /var/games
16K   /var/tmp
17M   /var/log
68M   /var/cache
104K  /var/spool
144K  /var/run
351M  /var/lib
443M  totaal
704K  /var/mail

我已经向gnu-core开发人员报告了此功能,并提出了一项功能要求,以改善带有排序功能的du -h功能。通过bugs-coreutils@gnu.org
阿姆斯特丹,阿姆斯特丹

+1,类似的du folder | sort -n | cut -f 2 | while IFS= read -r -d '' path; do du -sh -- "$path"; done
单线

刚刚在实时系统上尝试了1个班轮。出现“访问被拒绝”错误,无任何结果。您是否首先在Ubuntu系统上尝试了此命令?我将文件夹更改为/ home / username
Kat Amsterdam

哦,对不起,您应该删除-d '',这是在file命令的输出中使用它时遗留下来的内容。
steabert

这似乎在不支持GNU的非Linux系统上很好用sort
Stefan Lasiewski

2

命令GNU sort具有以下选项:

-h--human-numeric-sort 比较人类可读的数字(例如2K 1G)。

要在BSD / OSX上具有此选项,您可以sort通过coreutils(通过brew)进行安装,然后将bin文件夹添加PATHrc文件中。

因此,命令如下所示:

du -ah . | sort -rh | head -20

0

对于最新版本的Ubuntu,请使用du -h directory | sort -h

我一直使用这种形式查找失控的文件。


答案的重复副本,11年11月17日在17:13 Allu2
极客长老

0

使用Ctrl+ Alt+ 打开终端,t然后输入:

  du -sk * | sort -rn 

:DI现在已经习惯将Ctrl + Alt + t更改为上述格式,以至于我已经将所需的格式粘贴到了Xpad中。:D如此出色的工作
真是值得称赞

您在这里所做的每项工作都值得补充。
rɑːdʒɑ

0

该文件名使用空格或撇号处理文件名,并且在不支持xargs -d或的系统上工作sort -h

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

结果是:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

用替换\n\0什么意义?这样做是否为时已晚?
muru

它为准备输入xargs -0,期望输入是NUL分隔的(如find -print0将产生的那样)。否则,您不能使用-0,并且撇号具有特殊含义。
马克·克罗斯菲尔德,2014年

我知道-0,但这无关紧要:imgur.com/87w3vfj
muru

我认为这很有用,因为您使用了反引号,而不是撇号。gist.github.com/mrmanc/8aef830945ce03aa65f0
Mark Crossfield

0

我发现可以在所有系统上使用的版本(sort -h与我无关)是

du -h $(du * | sort -n | awk '{print $2}')

awk '{print $2}'基本打印文件名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.