Add a -t switch for masking output that's above or below certain thresholds.

This switch makes it a lot easier to locate problem areas when a process
is threatening to consume all of your disk space.

PR:		144192
Submitted by:	gk
MFC after:	3 weeks
This commit is contained in:
Brian Somers 2010-06-20 08:27:03 +00:00
parent 7100efb738
commit f0cc075c4f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=209362
2 changed files with 28 additions and 3 deletions

View File

@ -42,7 +42,7 @@
.Nm .Nm
.Op Fl A .Op Fl A
.Op Fl H | L | P .Op Fl H | L | P
.Op Fl a | s | d Ar depth .Op Fl a | s | d Ar depth | Fl t Ar threshold
.Op Fl c .Op Fl c
.Op Fl l .Op Fl l
.Op Fl h | k | m | B Ar blocksize .Op Fl h | k | m | B Ar blocksize
@ -107,6 +107,14 @@ This option exists solely for conformance with
Display an entry for each specified file. Display an entry for each specified file.
(Equivalent to (Equivalent to
.Fl d Li 0 ) .Fl d Li 0 )
.It Fl t Ar threshold
Display only entries for which size exceeds
.Ar threshold .
If
.Ar threshold
is negative, display only entries for which size is less than the absolute
value of
.Ar threshold .
.It Fl d Ar depth .It Fl d Ar depth
Display an entry for all files and directories Display an entry for all files and directories
.Ar depth .Ar depth

View File

@ -90,6 +90,7 @@ main(int argc, char *argv[])
FTS *fts; FTS *fts;
FTSENT *p; FTSENT *p;
off_t savednumber, curblocks; off_t savednumber, curblocks;
off_t threshold, threshold_sign;
int ftsoptions; int ftsoptions;
int listall; int listall;
int depth; int depth;
@ -106,12 +107,14 @@ main(int argc, char *argv[])
save = argv; save = argv;
ftsoptions = 0; ftsoptions = 0;
savednumber = 0; savednumber = 0;
threshold = 0;
threshold_sign = 1;
cblocksize = DEV_BSIZE; cblocksize = DEV_BSIZE;
blocksize = 0; blocksize = 0;
depth = INT_MAX; depth = INT_MAX;
SLIST_INIT(&ignores); SLIST_INIT(&ignores);
while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrx")) != -1) while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrt:x")) != -1)
switch (ch) { switch (ch) {
case 'A': case 'A':
Aflag = 1; Aflag = 1;
@ -179,6 +182,14 @@ main(int argc, char *argv[])
break; break;
case 'r': /* Compatibility. */ case 'r': /* Compatibility. */
break; break;
case 't' :
if (expand_number(optarg, &threshold) != 0 ||
threshold == 0) {
warnx("invalid threshold: %s", optarg);
usage();
} else if (threshold < 0)
threshold_sign = -1;
break;
case 'x': case 'x':
ftsoptions |= FTS_XDEV; ftsoptions |= FTS_XDEV;
break; break;
@ -248,6 +259,10 @@ main(int argc, char *argv[])
blocksize /= DEV_BSIZE; blocksize /= DEV_BSIZE;
} }
if (threshold != 0)
threshold = howmany(threshold / DEV_BSIZE * cblocksize,
blocksize);
rval = 0; rval = 0;
(void)signal(SIGINFO, siginfo); (void)signal(SIGINFO, siginfo);
@ -271,7 +286,9 @@ main(int argc, char *argv[])
p->fts_parent->fts_bignum += p->fts_bignum += p->fts_parent->fts_bignum += p->fts_bignum +=
curblocks; curblocks;
if (p->fts_level <= depth) { if (p->fts_level <= depth && threshold <=
threshold_sign * howmany(p->fts_bignum *
cblocksize, blocksize)) {
if (hflag) { if (hflag) {
prthumanval(p->fts_bignum); prthumanval(p->fts_bignum);
(void)printf("\t%s\n", p->fts_path); (void)printf("\t%s\n", p->fts_path);