[PATCH] Support for thresholds in du(1)
Gleb Kurtsou
gleb.kurtsou at gmail.com
Thu Feb 4 11:55:14 UTC 2010
On (25/02/2009 17:24), Mel wrote:
> Hi,
>
> attached is a small patch to add threshold support to du(1). I've been using
> it on 7-STABLE machines for a while, cause I got tired of the noise I get
> when sorting and then reformatting to human-readable. Especially since
> sorting isn't part of the equasion "I'd like to see all dirs exceeding a
> given size".
> I've not updated the manpage on -STABLE yet, should be the same as HEAD.
>
> Example usage:
> # du -xht 20m .
> 29M ./contrib/binutils
> 52M ./contrib/gcc
> 237M ./contrib
> 35M ./crypto
> 28M ./lib
> 20M ./share
> 55M ./sys/dev
> 139M ./sys
> 545M .
>
> I'll file a PR for it, if there's no objections to this feature /
> implementation, the style(9) or the usage of -t.
> --
> Mel
Hi,
I've cleaned up original patch:
* fixed style and some bugs
* as suggested changed it to use expand_number
* implemented support for negative threshold values
I find the patch very useful. Does it look ok to be commited, or should
I file a PR so it won't get lost once again.
Example usage:
src/sys/crypto % du -ht 100k
137K ./des
482K .
src/sys/crypto % du -A -ht +100k
129K ./des
446K .
src/sys/crypto % du -ht -100k
56K ./camellia
11K ./salsa20
38K ./sha2
9.0K ./rc4
68K ./des/arch/i386
70K ./des/arch
88K ./rijndael
37K ./via
8.0K ./hmac
36K ./blowfish/arch/i386
37K ./blowfish/arch
85K ./blowfish
-------------- next part --------------
diff --git a/usr.bin/du/du.1 b/usr.bin/du/du.1
index af2ff84..b0e1748 100644
--- a/usr.bin/du/du.1
+++ b/usr.bin/du/du.1
@@ -42,7 +42,7 @@
.Nm
.Op Fl A
.Op Fl H | L | P
-.Op Fl a | s | d Ar depth
+.Op Fl a | s | d Ar depth | t Ar threshold
.Op Fl c
.Op Fl l
.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.
(Equivalent to
.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 then absolute
+value of
+.Ar threshold .
.It Fl d Ar depth
Display an entry for all files and directories
.Ar depth
diff --git a/usr.bin/du/du.c b/usr.bin/du/du.c
index 63677f5..ff62c5b 100644
--- a/usr.bin/du/du.c
+++ b/usr.bin/du/du.c
@@ -90,6 +90,7 @@ main(int argc, char *argv[])
FTS *fts;
FTSENT *p;
off_t savednumber, curblocks;
+ int64_t threshold, threshold_sign;
int ftsoptions;
int listall;
int depth;
@@ -106,12 +107,14 @@ main(int argc, char *argv[])
save = argv;
ftsoptions = 0;
savednumber = 0;
+ threshold = 0;
+ threshold_sign = 1;
cblocksize = DEV_BSIZE;
blocksize = 0;
depth = INT_MAX;
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) {
case 'A':
Aflag = 1;
@@ -179,6 +182,14 @@ main(int argc, char *argv[])
break;
case 'r': /* Compatibility. */
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':
ftsoptions |= FTS_XDEV;
break;
@@ -248,6 +259,10 @@ main(int argc, char *argv[])
blocksize /= DEV_BSIZE;
}
+ if (threshold != 0)
+ threshold = howmany(threshold / DEV_BSIZE * cblocksize,
+ blocksize);
+
rval = 0;
(void)signal(SIGINFO, siginfo);
@@ -271,7 +286,9 @@ main(int argc, char *argv[])
p->fts_parent->fts_bignum += p->fts_bignum +=
curblocks;
- if (p->fts_level <= depth) {
+ if (p->fts_level <= depth && threshold <=
+ threshold_sign * howmany(p->fts_bignum *
+ cblocksize, blocksize)) {
if (hflag) {
prthumanval(p->fts_bignum);
(void)printf("\t%s\n", p->fts_path);
More information about the freebsd-hackers
mailing list