1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-20 02:38:43 +00:00

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:
Giorgos Keramidas 2008-02-25 19:06:43 +00:00
parent 5b62538f7f
commit fe5628d3c1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=176561
2 changed files with 23 additions and 11 deletions

View File

@ -32,7 +32,7 @@
.\" @(#)du.1 8.2 (Berkeley) 4/1/94 .\" @(#)du.1 8.2 (Berkeley) 4/1/94
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd May 6, 2006 .Dd February 25, 2008
.Dt DU 1 .Dt DU 1
.Os .Os
.Sh NAME .Sh NAME
@ -43,6 +43,7 @@
.Op Fl H | L | P .Op Fl H | L | P
.Op Fl a | s | d Ar depth .Op Fl a | s | d Ar depth
.Op Fl c .Op Fl c
.Op Fl l
.Op Fl h | k | m .Op Fl h | k | m
.Op Fl n .Op Fl n
.Op Fl x .Op Fl x
@ -94,6 +95,15 @@ directories deep.
Display a grand total. Display a grand total.
.It Fl k .It Fl k
Display block counts in 1024-byte (1-Kbyte) blocks. 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 .It Fl m
Display block counts in 1048576-byte (1-Mbyte) blocks. Display block counts in 1048576-byte (1-Mbyte) blocks.
.It Fl n .It Fl n
@ -120,11 +130,6 @@ or
.Fl L .Fl L
options are specified, storage used by any symbolic links which are options are specified, storage used by any symbolic links which are
followed is not counted or displayed. followed is not counted or displayed.
.Pp
Files having multiple hard links are counted (and displayed) a single
time per
.Nm
execution.
.Sh ENVIRONMENT .Sh ENVIRONMENT
.Bl -tag -width BLOCKSIZE .Bl -tag -width BLOCKSIZE
.It Ev BLOCKSIZE .It Ev BLOCKSIZE

View File

@ -90,20 +90,22 @@ main(int argc, char *argv[])
int ftsoptions; int ftsoptions;
int listall; int listall;
int depth; 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; char **save;
static char dot[] = "."; static char dot[] = ".";
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag = 0; Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag =
lflag = 0;
save = argv; save = argv;
ftsoptions = 0; ftsoptions = 0;
depth = INT_MAX; depth = INT_MAX;
SLIST_INIT(&ignores); SLIST_INIT(&ignores);
while ((ch = getopt(argc, argv, "HI:LPasd:chkmnrx")) != -1) while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1)
switch (ch) { switch (ch) {
case 'H': case 'H':
Hflag = 1; Hflag = 1;
@ -150,6 +152,9 @@ main(int argc, char *argv[])
if (setenv("BLOCKSIZE", "1024", 1) == -1) if (setenv("BLOCKSIZE", "1024", 1) == -1)
warn("setenv: cannot set BLOCKSIZE=1024"); warn("setenv: cannot set BLOCKSIZE=1024");
break; break;
case 'l':
lflag = 1;
break;
case 'm': case 'm':
hflag = 0; hflag = 0;
if (setenv("BLOCKSIZE", "1048576", 1) == -1) if (setenv("BLOCKSIZE", "1048576", 1) == -1)
@ -261,7 +266,8 @@ main(int argc, char *argv[])
if (ignorep(p)) if (ignorep(p))
break; break;
if (p->fts_statp->st_nlink > 1 && linkchk(p)) if (lflag == 0 &&
p->fts_statp->st_nlink > 1 && linkchk(p))
break; break;
if (listall || p->fts_level == 0) { if (listall || p->fts_level == 0) {
@ -447,7 +453,8 @@ static void
usage(void) usage(void)
{ {
(void)fprintf(stderr, (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); exit(EX_USAGE);
} }