ls -lh: humanize the total

Before this change, the total printed on the first line was always in
blocks.

Now the long format with -h will print the "humanized number" instead.

`ls -sh` never provided sizes in anything other than blocks, total or
individual, and this commit doesn't change that.

The total number of blocks is a sum of fts_statp->st_blocks, so it's
multiplied by 512 and not by blocksize.

$ ls -lh /usr/bin | head -n 2
total 442 MB
-r-xr-xr-x 1 root wheel 70B Dec 20 21:06 CC

Differential Revision:	https://reviews.freebsd.org/D48329
This commit is contained in:
Piotr Pawel Stefaniak 2025-01-06 18:59:03 +01:00
parent e2012b81cb
commit 82fa7f83b5
2 changed files with 12 additions and 1 deletions

View file

@ -539,6 +539,10 @@ which are listed as the directory's contents
and
.Pa ..
and other files which start with a dot, depending on other options).
If the
.Fl h
option is given,
the total size is displayed as the number of bytes.
.Pp
The default block size is 512 bytes.
The block size may be set with option

View file

@ -210,7 +210,14 @@ printlong(const DISPLAY *dp)
if ((dp->list == NULL || dp->list->fts_level != FTS_ROOTLEVEL) &&
(f_longform || f_size)) {
(void)printf("total %lu\n", howmany(dp->btotal, blocksize));
if (!f_humanval)
(void)printf("total %lu\n", howmany(dp->btotal, blocksize));
else {
(void)humanize_number(buf, 7 /* "1024 KB" */,
dp->btotal * 512, "B", HN_AUTOSCALE, HN_DECIMAL);
(void)printf("total %s\n", buf);
}
}
for (p = dp->list; p; p = p->fts_link) {