Implement from scratch a -l option for du(1), to match the same option
of the GNU utility. The default behavior of our original `du' is to count hardlinked files only once for each invocation of the utility. With the new -l option they count towards the final size every time they are found. PR: bin/117944 Submitted by: keramida Reviewed by: des, obrien MFC after: 2 weeks
This commit is contained in:
parent
5b62538f7f
commit
fe5628d3c1
@ -32,7 +32,7 @@
|
||||
.\" @(#)du.1 8.2 (Berkeley) 4/1/94
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 6, 2006
|
||||
.Dd February 25, 2008
|
||||
.Dt DU 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -43,6 +43,7 @@
|
||||
.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 n
|
||||
.Op Fl x
|
||||
@ -94,6 +95,15 @@ directories deep.
|
||||
Display a grand total.
|
||||
.It Fl k
|
||||
Display block counts in 1024-byte (1-Kbyte) blocks.
|
||||
.It Fl l
|
||||
If a file has multiple hard links, count its size many times.
|
||||
The default behavior of
|
||||
.Nm
|
||||
is to count files with multiple hard links only once.
|
||||
When the
|
||||
.Fl l
|
||||
option is specified, the hard link checks are disabled, and these files
|
||||
are counted (and displayed) as many times as they are found.
|
||||
.It Fl m
|
||||
Display block counts in 1048576-byte (1-Mbyte) blocks.
|
||||
.It Fl n
|
||||
@ -120,11 +130,6 @@ or
|
||||
.Fl L
|
||||
options are specified, storage used by any symbolic links which are
|
||||
followed is not counted or displayed.
|
||||
.Pp
|
||||
Files having multiple hard links are counted (and displayed) a single
|
||||
time per
|
||||
.Nm
|
||||
execution.
|
||||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width BLOCKSIZE
|
||||
.It Ev BLOCKSIZE
|
||||
|
@ -90,20 +90,22 @@ main(int argc, char *argv[])
|
||||
int ftsoptions;
|
||||
int listall;
|
||||
int depth;
|
||||
int Hflag, Lflag, Pflag, aflag, sflag, dflag, cflag, hflag, ch, notused, rval;
|
||||
int Hflag, Lflag, Pflag, aflag, sflag, dflag, cflag;
|
||||
int hflag, lflag, ch, notused, rval;
|
||||
char **save;
|
||||
static char dot[] = ".";
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag = 0;
|
||||
Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag =
|
||||
lflag = 0;
|
||||
|
||||
save = argv;
|
||||
ftsoptions = 0;
|
||||
depth = INT_MAX;
|
||||
SLIST_INIT(&ignores);
|
||||
|
||||
while ((ch = getopt(argc, argv, "HI:LPasd:chkmnrx")) != -1)
|
||||
while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1)
|
||||
switch (ch) {
|
||||
case 'H':
|
||||
Hflag = 1;
|
||||
@ -150,6 +152,9 @@ main(int argc, char *argv[])
|
||||
if (setenv("BLOCKSIZE", "1024", 1) == -1)
|
||||
warn("setenv: cannot set BLOCKSIZE=1024");
|
||||
break;
|
||||
case 'l':
|
||||
lflag = 1;
|
||||
break;
|
||||
case 'm':
|
||||
hflag = 0;
|
||||
if (setenv("BLOCKSIZE", "1048576", 1) == -1)
|
||||
@ -261,7 +266,8 @@ main(int argc, char *argv[])
|
||||
if (ignorep(p))
|
||||
break;
|
||||
|
||||
if (p->fts_statp->st_nlink > 1 && linkchk(p))
|
||||
if (lflag == 0 &&
|
||||
p->fts_statp->st_nlink > 1 && linkchk(p))
|
||||
break;
|
||||
|
||||
if (listall || p->fts_level == 0) {
|
||||
@ -447,7 +453,8 @@ static void
|
||||
usage(void)
|
||||
{
|
||||
(void)fprintf(stderr,
|
||||
"usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n");
|
||||
"usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] "
|
||||
"[-l] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n");
|
||||
exit(EX_USAGE);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user