From owner-freebsd-hackers@FreeBSD.ORG Thu Feb 26 02:24:41 2009 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C8524106566C for ; Thu, 26 Feb 2009 02:24:41 +0000 (UTC) (envelope-from fbsd.hackers@rachie.is-a-geek.net) Received: from mail.rachie.is-a-geek.net (rachie.is-a-geek.net [66.230.99.27]) by mx1.freebsd.org (Postfix) with ESMTP id 717918FC14 for ; Thu, 26 Feb 2009 02:24:41 +0000 (UTC) (envelope-from fbsd.hackers@rachie.is-a-geek.net) Received: from localhost (mail.lan.rachie.is-a-geek.net [192.168.2.101]) by mail.rachie.is-a-geek.net (Postfix) with ESMTP id C8A95AFC1FF for ; Wed, 25 Feb 2009 17:24:40 -0900 (AKST) From: Mel To: freebsd-hackers@freebsd.org Date: Wed, 25 Feb 2009 17:24:40 -0900 User-Agent: KMail/1.9.10 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_o1fpJvCx4PioHXE" Message-Id: <200902251724.40212.fbsd.hackers@rachie.is-a-geek.net> Subject: [PATCH] Support for thresholds in du(1) X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 02:24:42 -0000 --Boundary-00=_o1fpJvCx4PioHXE Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 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 --Boundary-00=_o1fpJvCx4PioHXE Content-Type: text/x-diff; charset="iso 8859-15"; name="du.HEAD.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="du.HEAD.diff" Index: usr.bin/du/du.1 =================================================================== RCS file: /home/ncvs/src/usr.bin/du/du.1,v retrieving revision 1.34 diff -u -r1.34 du.1 --- usr.bin/du/du.1 6 Nov 2008 16:30:38 -0000 1.34 +++ usr.bin/du/du.1 26 Feb 2009 01:58:25 -0000 @@ -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 @@ -106,6 +106,13 @@ .It Fl s Display an entry for each specified file. (Equivalent to +.It Fl t Ar threshold +Display only entries for which the size exceeds +.Ar threshold +, which can be given in bytes (default), kB, MB or GB, by appending k, m, +or g respectively. +.Ar threshold +cannot exceeds the platform's OFF_MAX. .Fl d Li 0 ) .It Fl d Ar depth Display an entry for all files and directories Index: usr.bin/du/du.c =================================================================== RCS file: /home/ncvs/src/usr.bin/du/du.c,v retrieving revision 1.49 diff -u -r1.49 du.c --- usr.bin/du/du.c 6 Nov 2008 23:55:28 -0000 1.49 +++ usr.bin/du/du.c 26 Feb 2009 02:03:48 -0000 @@ -87,7 +87,7 @@ { FTS *fts; FTSENT *p; - off_t savednumber, curblocks; + off_t savednumber, curblocks, threshold; int ftsoptions; int listall; int depth; @@ -95,6 +95,8 @@ int hflag, lflag, ch, notused, rval; char **save; static char dot[] = "."; + char last; + int multi = 1; setlocale(LC_ALL, ""); @@ -103,13 +105,13 @@ save = argv; ftsoptions = 0; - savednumber = 0; + savednumber = threshold = 0; 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; @@ -177,6 +179,40 @@ break; case 'r': /* Compatibility. */ break; + case 't' : + last = optarg[strlen(optarg)-1]; + switch(last) + { + case 'k' : + case 'K' : + multi = 1024; + break; + case 'm' : + case 'M' : + multi = 1024*1024; + break; + case 'G' : + case 'g' : + multi = 1024*1024*1024; + break; + default : + break; + } + if( multi > 1 ) + optarg[strlen(optarg)-1] = '\0'; + threshold = (off_t)strtoll(optarg, NULL, 10); + if( errno == ERANGE || threshold < 0 ) + { + warn("Invalid threshold: %s", optarg); + usage(); + } + if( threshold > OFF_MAX / multi ) + { + warnx("Threshold too large"); + usage(); + } + threshold *= multi; + break; case 'x': ftsoptions |= FTS_XDEV; break; @@ -267,7 +303,8 @@ p->fts_parent->fts_bignum += p->fts_bignum += curblocks; - if (p->fts_level <= depth) { + if (p->fts_level <= depth && threshold < howmany(p->fts_bignum * + cblocksize, blocksize)) { if (hflag) { prthumanval(p->fts_bignum); (void)printf("\t%s\n", p->fts_path); --Boundary-00=_o1fpJvCx4PioHXE Content-Type: text/x-diff; charset="iso 8859-15"; name="du.RELENG_7.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="du.RELENG_7.diff" Index: usr.bin/du/du.c =================================================================== RCS file: /home/ncvs/src/usr.bin/du/du.c,v retrieving revision 1.42.2.1 diff -u -r1.42.2.1 du.c --- usr.bin/du/du.c 15 Jan 2009 03:48:49 -0000 1.42.2.1 +++ usr.bin/du/du.c 26 Feb 2009 02:02:49 -0000 @@ -86,6 +86,7 @@ FTS *fts; FTSENT *p; off_t savednumber = 0; + off_t threshold = 0; long blocksize; int ftsoptions; int listall; @@ -94,6 +95,8 @@ int hflag, lflag, ch, notused, rval; char **save; static char dot[] = "."; + char last; + int multi = 1; setlocale(LC_ALL, ""); @@ -105,7 +108,7 @@ depth = INT_MAX; SLIST_INIT(&ignores); - while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1) + while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrt:x")) != -1) switch (ch) { case 'H': Hflag = 1; @@ -161,6 +164,40 @@ break; case 'r': /* Compatibility. */ break; + case 't' : + last = optarg[strlen(optarg)-1]; + switch(last) + { + case 'k' : + case 'K' : + multi = 1024; + break; + case 'm' : + case 'M' : + multi = 1024*1024; + break; + case 'G' : + case 'g' : + multi = 1024*1024*1024; + break; + default : + break; + } + if( multi > 1 ) + optarg[strlen(optarg)-1] = '\0'; + threshold = (off_t)strtoll(optarg, NULL, 10); + if( errno == ERANGE || threshold < 0 ) + { + warn("Invalid threshold: %s", optarg); + usage(); + } + if( threshold > OFF_MAX / multi ) + { + warnx("Threshold too large"); + usage(); + } + threshold *= multi; + break; case 'x': ftsoptions |= FTS_XDEV; break; @@ -239,7 +276,7 @@ p->fts_parent->fts_bignum += p->fts_bignum += p->fts_statp->st_blocks; - if (p->fts_level <= depth) { + if (p->fts_level <= depth && threshold < howmany(p->fts_bignum * DEV_BSIZE, blocksize)) { if (hflag) { (void) prthumanval(howmany(p->fts_bignum, blocksize)); (void) printf("\t%s\n", p->fts_path); --Boundary-00=_o1fpJvCx4PioHXE--