在 FreeBSD 上使用 ls -sh 实现“人类可读”大小

在 FreeBSD 上使用 ls -sh 实现“人类可读”大小

使用 GNU,ls我们可以获得“人类可读”的文件大小(这意味着附加后缀如 K、M、G、...,表示千字节、兆字节和千兆字节等,并且数字保持在 1024 以下),-h即使不是与 一起使用,-l但只能与 一起使用-s

如何通过lsFreeBSD 附带的软件获得这种行为,即如何ls -sh在 FreeBSD 中工作?

答案1

回答这个问题的方法就是阅读源码:

-h如果没有提供任何这些选项,则不会报告错误。

FreeBSD 在 2001 年添加了该选项,早于 OSX 中的(相当旧的)用户区。 FreeBSD 和 OSX 手册页具有相同的描述-h(并且“ls -lh”适用于两者)。但那时,它只适用于-l

添加一个新标志,-h当与-l选项导致文件大小以单位后缀显示;字节、千字节、兆字节、千兆字节、太字节和拍字节,以便将位数减少到三位或更少。

答案2

如果你想在 FreeBSd 上使用 GNU ls 功能,你可以安装gnuls 包并别名lsgnuls.

如果您想坚持使用基础软件,您可以对ls. (脚本转发自如何按大小对 du 输出进行排序?) 这适用于任何 POSIX 系统。

CLICOLOR_FORCE=1 ls | awk '
    function human(x) {
        s="kMGTEPYZ";
        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}'

CLICOLOR_FORCE导致 BSDls使用颜色,即使它没有写入终端。另一方面,由于ls不写入终端,因此您将每行获得一个文件而不是列。在 FreeBSD 上,您可以使用该选项-C来获取列,但后处理脚本会变得更加复杂,因为它需要查找行中间的大小。试试这个(未经测试):

CLICOLOR_FORCE=1 ls -C | awk '
    function human(x) {
        s="kMGTEPYZ";
        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}'

相关内容