diff options
author | mlaier <mlaier@FreeBSD.org> | 2008-11-06 16:30:38 +0000 |
---|---|---|
committer | mlaier <mlaier@FreeBSD.org> | 2008-11-06 16:30:38 +0000 |
commit | 1d778ddbeb9b13388425dbe2dba709328cc37d59 (patch) | |
tree | 1414064fee2d8041a6f41dd267e67699cf392897 | |
parent | ee7c8c9b71b98b9add1ecd2a754eba4812773aa4 (diff) | |
download | FreeBSD-src-1d778ddbeb9b13388425dbe2dba709328cc37d59.zip FreeBSD-src-1d778ddbeb9b13388425dbe2dba709328cc37d59.tar.gz |
Add two new options to du(1):
-A Display the apparent size instead of the disk usage. This can be
helpful when operating on compressed volumes or sparse files.
-B blocksize
Calculate block counts in blocksize byte blocks. This is differ-
ent from the -k, -m options or setting BLOCKSIZE and gives an
estimate of how much space the examined file hierachy would
require on a filesystem with the given blocksize. Unless in -A
mode, blocksize is rounded up to the next multiple of 512.
The former is similar to GNU's du(1) --apparent-size. The latter is
different from what GNU's du(1) -B does, which is equivalent to setting
BLOCKSIZE in our implementation and is rather pointless as it doesn't add
any real value (i.e. you can achieve the same with a simple awk-script).
No change in the normal output or processing.
Reviewed by: keramida@, Peter French
Otherwise silience from: freebsd-hackers@
-rw-r--r-- | usr.bin/du/du.1 | 39 | ||||
-rw-r--r-- | usr.bin/du/du.c | 81 |
2 files changed, 85 insertions, 35 deletions
diff --git a/usr.bin/du/du.1 b/usr.bin/du/du.1 index 60264cd..af2ff84 100644 --- a/usr.bin/du/du.1 +++ b/usr.bin/du/du.1 @@ -32,7 +32,7 @@ .\" @(#)du.1 8.2 (Berkeley) 4/1/94 .\" $FreeBSD$ .\" -.Dd February 25, 2008 +.Dd November 6, 2008 .Dt DU 1 .Os .Sh NAME @@ -40,11 +40,12 @@ .Nd display disk usage statistics .Sh SYNOPSIS .Nm +.Op Fl A .Op Fl H | L | P .Op Fl a | s | d Ar depth .Op Fl c .Op Fl l -.Op Fl h | k | m +.Op Fl h | k | m | B Ar blocksize .Op Fl n .Op Fl x .Op Fl I Ar mask @@ -60,6 +61,25 @@ the current directory is displayed. .Pp The options are as follows: .Bl -tag -width indent +.It Fl A +Display the apparent size instead of the disk usage. +This can be helpful when operating on compressed volumes or sparse files. +.It Fl B Ar blocksize +Calculate block counts in +.Ar blocksize +byte blocks. +This is different from the +.Fl k, m +options or setting +.Ev BLOCKSIZE +and gives an estimate of how much space the examined file hierachy would +require on a filesystem with the given +.Ar blocksize . +Unless in +.Fl A +mode, +.Ar blocksize +is rounded up to the next multiple of 512. .It Fl H Symbolic links on the command line are followed, symbolic links in file hierarchies are not followed. @@ -136,14 +156,19 @@ followed is not counted or displayed. If the environment variable .Ev BLOCKSIZE is set, and the -.Fl k -option is not specified, the block counts will be displayed in units of that -size block. +.Fl k, m +or +.Fl h +options are not specified, the block counts will be displayed in units of +that block size. If .Ev BLOCKSIZE is not set, and the -.Fl k -option is not specified, the block counts will be displayed in 512-byte blocks. +.Fl k, m +or +.Fl h +options are not specified, the block counts will be displayed in 512-byte +blocks. .El .Sh SEE ALSO .Xr df 1 , diff --git a/usr.bin/du/du.c b/usr.bin/du/du.c index 7887a3a..8a112bb 100644 --- a/usr.bin/du/du.c +++ b/usr.bin/du/du.c @@ -79,14 +79,15 @@ static void ignoreclean(void); static int ignorep(FTSENT *); static int nodumpflag = 0; +static int Aflag; +static long blocksize, cblocksize; int main(int argc, char *argv[]) { FTS *fts; FTSENT *p; - off_t savednumber; - long blocksize; + off_t savednumber, curblocks; int ftsoptions; int listall; int depth; @@ -98,16 +99,30 @@ main(int argc, char *argv[]) setlocale(LC_ALL, ""); Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag = - lflag = 0; + lflag = Aflag = 0; save = argv; ftsoptions = 0; savednumber = 0; + cblocksize = DEV_BSIZE; + blocksize = 0; depth = INT_MAX; SLIST_INIT(&ignores); - while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1) + while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrx")) != -1) switch (ch) { + case 'A': + Aflag = 1; + break; + case 'B': + errno = 0; + cblocksize = atoi(optarg); + if (errno == ERANGE || cblocksize <= 0) { + warnx("invalid argument to option B: %s", + optarg); + usage(); + } + break; case 'H': Hflag = 1; break; @@ -144,22 +159,18 @@ main(int argc, char *argv[]) cflag = 1; break; case 'h': - if (setenv("BLOCKSIZE", "512", 1) == -1) - warn("setenv: cannot set BLOCKSIZE=512"); hflag = 1; break; case 'k': hflag = 0; - if (setenv("BLOCKSIZE", "1024", 1) == -1) - warn("setenv: cannot set BLOCKSIZE=1024"); + blocksize = 1024; break; case 'l': lflag = 1; break; case 'm': hflag = 0; - if (setenv("BLOCKSIZE", "1048576", 1) == -1) - warn("setenv: cannot set BLOCKSIZE=1048576"); + blocksize = 1048576; break; case 'n': nodumpflag = 1; @@ -206,6 +217,9 @@ main(int argc, char *argv[]) if (Pflag) ftsoptions |= FTS_PHYSICAL; + if (!Aflag && (cblocksize % DEV_BSIZE) != 0) + cblocksize = howmany(cblocksize, DEV_BSIZE) * DEV_BSIZE; + listall = 0; if (aflag) { @@ -224,8 +238,13 @@ main(int argc, char *argv[]) argv[1] = NULL; } - (void)getbsize(¬used, &blocksize); - blocksize /= 512; + if (blocksize == 0) + (void)getbsize(¬used, &blocksize); + + if (!Aflag) { + cblocksize /= DEV_BSIZE; + blocksize /= DEV_BSIZE; + } rval = 0; @@ -242,17 +261,19 @@ main(int argc, char *argv[]) if (ignorep(p)) break; + curblocks = Aflag ? + howmany(p->fts_statp->st_size, cblocksize) : + howmany(p->fts_statp->st_blocks, cblocksize); p->fts_parent->fts_bignum += p->fts_bignum += - p->fts_statp->st_blocks; + curblocks; if (p->fts_level <= depth) { if (hflag) { - prthumanval(howmany(p->fts_bignum, - blocksize)); + prthumanval(p->fts_bignum); (void)printf("\t%s\n", p->fts_path); } else { (void)printf("%jd\t%s\n", - (intmax_t)howmany(p->fts_bignum, + howmany(p->fts_bignum * cblocksize, blocksize), p->fts_path); } } @@ -273,21 +294,22 @@ main(int argc, char *argv[]) linkchk(p)) break; + curblocks = Aflag ? + howmany(p->fts_statp->st_size, cblocksize) : + howmany(p->fts_statp->st_blocks, cblocksize); + if (listall || p->fts_level == 0) { if (hflag) { - prthumanval(howmany( - p->fts_statp->st_blocks, - blocksize)); + prthumanval(curblocks); (void)printf("\t%s\n", p->fts_path); } else { (void)printf("%jd\t%s\n", - (intmax_t)howmany( - p->fts_statp->st_blocks, - blocksize), p->fts_path); + howmany(curblocks * cblocksize, + blocksize), p->fts_path); } } - p->fts_parent->fts_bignum += p->fts_statp->st_blocks; + p->fts_parent->fts_bignum += curblocks; } savednumber = p->fts_parent->fts_bignum; } @@ -297,11 +319,11 @@ main(int argc, char *argv[]) if (cflag) { if (hflag) { - prthumanval(howmany(savednumber, blocksize)); + prthumanval(savednumber); (void)printf("\ttotal\n"); } else { (void)printf("%jd\ttotal\n", (intmax_t)howmany( - savednumber, blocksize)); + savednumber * cblocksize, blocksize)); } } @@ -448,7 +470,9 @@ prthumanval(int64_t bytes) { char buf[5]; - bytes *= DEV_BSIZE; + bytes *= cblocksize; + if (!Aflag) + bytes *= DEV_BSIZE; humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); @@ -460,8 +484,9 @@ static void usage(void) { (void)fprintf(stderr, - "usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] " - "[-l] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n"); + "usage: du [-A] [-H | -L | -P] [-a | -s | -d depth] [-c] " + "[-l] [-h | -k | -m | -B bsize] [-n] [-x] [-I mask] " + "[file ...]\n"); exit(EX_USAGE); } |