当前位置: 首页>>技术教程>>正文


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

,

问题描述

例如我有命令显示文件夹占用了多少空间

du folder | sort -n

它效果很好,但是我想要人类可读的形式

du -h folder

但是,如果我这样做,我就无法将其排序为数字。

如何连接 du folderdu -h folder 以查看按 du folder 排序的输出,但第一列来自 du -h folder

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

最佳回答

尝试类似的方法:

du -h folder | sort -h

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

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

次佳回答

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

du folder > file1
du -h folder > file2

关键部分是这样的:使用合适的分隔符逐行连接 file1file2

paste -d '#' file1 file2 > file3

(假设 # 没有出现在 file1file2 中)

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

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

另请参阅 man sort 了解其他选项。


您也可以将其另存为别名,供以后使用 re-use。为此,请将以下内容添加到 ~/.bashrc 的底部:

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

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

sorted-du /home

第三种回答

此答案适用于 10.04.4LTS 及更低版本的 Ubuntu。

不幸的是,对 K M G 进行排序的准确答案既困难又复杂:

您可以使用此命令将整个 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-readable/

只需进入你想知道的文件夹,然后 duf

您可以将此 duf 别名添加到 /home/user/.profile\n 的末尾,以使 duf 命令 semi-permenant

结果:

\\n

user@hostname:~$ duf\\n0.0K  Documenten\\n0.0K  Muziek\\n0.0K  Openbaar\\n0.0K  Sjablonen\\n0.0K  Video's\\n4.0K  backup_db.sql.g\\n4.0K  examples.desktop\\n12.0K xml printer ticket\\n52.0K hardinfo_report.html\\n152.0K    librxtxSerial.so\\n2.7M  jpos\\n4.4M  nxclient_3.5.0-7_amd64.deb\\n6.4M  nxnode_3.5.0-4_amd64.deb\\n6.8M  Downloads\\n7.4M  nxserver_3.5.0-5_amd64.deb\\n12.4M NetBeansProjects\\n18.1M mysqlworkbench.deb\\n28.3M Afbeeldingen\\n45.8M ergens-20110928-18.sql.gz\\n60.5M 2012-06-02ergens_archive.tar.gz\\n65.5M 2012-08-26ergens_archive.tar.gz\\n65.6M 2012-08-28ergens_archive.tar.gz\\n65.6M 2012-08-29ergens_archive.tar.gz\\n65.7M 2012-08-30ergens_archive.tar.gz\\n113.0M    Bureaublad\\n306.2M    ergens-20110928-18.sql\\n

\\n

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

\\n

user@hostname:~$ du -sch /var/* |sort -n\\n\\n0 /var/crash\\n0 /var/local\\n0 /var/lock\\n0 /var/opt\\n8,0M  /var/backups\\n12K   /var/games\\n16K   /var/tmp\\n17M   /var/log\\n68M   /var/cache\\n104K  /var/spool\\n144K  /var/run\\n351M  /var/lib\\n443M  totaal\\n704K  /var/mail\\n

\\n

第四种回答

命令 GNU sort 有以下选项:

\\n

-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G).

\\n

To have this option on BSD/OSX, you can install sort from coreutils (via brew) and add the bin folder to your PATH into your rc files.

\\n

所以命令看起来像:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14473.html,未经允许,请勿转载。