[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