使用 GNU,ls
我们可以获得“人类可读”的文件大小(这意味着附加后缀如 K、M、G、...,表示千字节、兆字节和千兆字节等,并且数字保持在 1024 以下),-h
即使不是与 一起使用,-l
但只能与 一起使用-s
。
如何通过ls
FreeBSD 附带的软件获得这种行为,即如何ls -sh
在 FreeBSD 中工作?
答案1
回答这个问题的方法就是阅读源码:
- FreeBSD在几个地方
ls
使用了该选项。-h
它首先执行此操作时需要文件的统计信息。 - 做的时候需要统计"longform" (
-l
)、inode (-i
) 或 size (-s
) 选项,计算最大数字的宽度。 - 如果这些选项均未设置,它不使用该
-h
选项。 - 它结合了
-h
和-i
/或-s
当做一个长列表时 (-l
),特别是当它打印尺寸。否则,它会被忽略。
-h
如果没有提供任何这些选项,则不会报告错误。
FreeBSD 在 2001 年添加了该选项,早于 OSX 中的(相当旧的)用户区。 FreeBSD 和 OSX 手册页具有相同的描述-h
(并且“ls -lh”适用于两者)。但那时,它只适用于-l
:
添加一个新标志,
-h
当与-l
选项导致文件大小以单位后缀显示;字节、千字节、兆字节、千兆字节、太字节和拍字节,以便将位数减少到三位或更少。
答案2
如果你想在 FreeBSd 上使用 GNU ls 功能,你可以安装gnuls 包并别名ls
为gnuls
.
如果您想坚持使用基础软件,您可以对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}'