On Tue, Oct 11, 2011 at 4:55 PM, Voelker, Bernhard <[email protected]> wrote: > > Jakob Truelsen wrote: > >> On Tue, Oct 11, 2011 at 4:19 PM, Voelker, Bernhard >> <[email protected]> wrote: >> > Jakob Truelsen wrote: >> > >> >> I often find myself using sed to filter out only large entries in the >> >> output of du, this patch adds a --min-size option to du to do this in >> >> a more pratical way. >> >> >> >> commit 3ce873cddcd608a654750ffa67d070c1ce82b036 >> >> Author: Jakob Truelsen <[email protected]> >> >> Date: Tue Oct 11 15:28:26 2011 +0200 >> >> >> >> Add min-size option to du to only show information about large >> >> entities >> > >> > why not use e.g. find -size? >> >> Primarily because I also want folders with lots of medium sized files >> to show up, I have not found a way to do this with find > > good point ... although you could use 'sort -h' for filtering, e.g. > > du -ah | sort -hr | head -n 10 > > Your --min-size option is not a bad thing, however, maybe it's worth > turning it into --size as in 'find' so that people could also filter > files/directories smaller than a certain size. > > Berny
That is a good idea, here is a revised patch implementing that commit 07ff6682a842717b08d983a9150ba2c48adbd169 Author: Jakob Truelsen <[email protected]> Date: Tue Oct 11 15:28:26 2011 +0200 Add size option to du to only show information about large or small entries diff --git a/src/du.c b/src/du.c index fba7f7d..576e76e 100644 --- a/src/du.c +++ b/src/du.c @@ -141,6 +141,9 @@ static bool opt_separate_dirs = false; is at level 0, so `du --max-depth=0' is equivalent to `du -s'. */ static size_t max_depth = SIZE_MAX; +/* Only output entries with at least this size if positive, at most if negative */ +static intmax_t size = 0; + /* Human-readable options for output. */ static int human_output_opts; @@ -187,7 +190,8 @@ enum HUMAN_SI_OPTION, FTS_DEBUG, TIME_OPTION, - TIME_STYLE_OPTION + TIME_STYLE_OPTION, + SIZE_OPTION }; static struct option const long_options[] = @@ -206,6 +210,7 @@ static struct option const long_options[] = {"human-readable", no_argument, NULL, 'h'}, {"si", no_argument, NULL, HUMAN_SI_OPTION}, {"max-depth", required_argument, NULL, 'd'}, + {"size", required_argument, NULL, SIZE_OPTION}, {"null", no_argument, NULL, '0'}, {"no-dereference", no_argument, NULL, 'P'}, {"one-file-system", no_argument, NULL, 'x'}, @@ -314,6 +319,10 @@ Mandatory arguments to long options are mandatory for short options too.\n\ only if it is N or fewer levels below the command\n\ line argument; --max-depth=0 is the same as\n\ --summarize\n\ + --size=SIZE if positive only output entries of size at least SIZE.\n\ + If negative only output entries of size at most SIZE.\n\ + Suffixes k, M and G may be used for Kilobytes, Megabytes\n\ + and Gigabytes respectively.\n\ "), stdout); fputs (_("\ --time show time of the last modification of any file in the\n\ @@ -554,8 +563,9 @@ process_file (FTS *fts, FTSENT *ent) do let its size contribute to the total. */ duinfo_add (&tot_dui, &dui); - if ((IS_DIR_TYPE (info) && level <= max_depth) - || ((opt_all && level <= max_depth) || level == 0)) + if ( (size < 0?dui_to_print.size <= -size:dui_to_print.size >= size) && + ((IS_DIR_TYPE (info) && level <= max_depth) + || ((opt_all && level <= max_depth) || level == 0))) print_size (&dui_to_print, file); return ok; @@ -787,6 +797,15 @@ main (int argc, char **argv) time_style = optarg; break; + case SIZE_OPTION: + { + char *ptr; + enum strtol_error e = xstrtoimax (optarg, &ptr, 0, &size, "eEgGkKmMpPtTyYzZ0"); + if (e != LONGINT_OK) + xstrtol_fatal (e, oi, c, long_options, optarg); + } + break; + case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
