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:
parent
5b62538f7f
commit
fe5628d3c1
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=176561
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user