My apologies. The same patch as generated by git format-patch rather than just git diff.
On 29 November 2013 00:49, Hal Ashburner <[email protected]> wrote: > ls filters by filename - leading dot -a -A or --ignore pattern > I have shell script that just shows directories by interposing `test` > between two calls to ls in a pipeline to give me ls like behavior. Ls > actually knows the filetype so I thought why not just filter on it in ls > given filtering is something ls does? I noted this was not a rejected > feature request and thought it might go well as a request accompanied by a > patch. > > --just > was the best switch I could think of to achieve this end. I could easily > be convinced there exists a better one. (--show-only? --showing?) > > examples: > just list the block device files > > > ./ls --just b /dev > loop0 loop3 loop6 ram1 ram12 ram15 ram4 ram7 sda sda3 > sda6 sda9 > loop1 loop4 loop7 ram10 ram13 ram2 ram5 ram8 sda1 sda4 > sda7 sdb > loop2 loop5 ram0 ram11 ram14 ram3 ram6 ram9 sda2 sda5 sda8 > > ./ls --just=normal > ABOUT-NLS config.log NEWS > aclocal.m4 config.status README > AUTHORS configure README-hacking > bootstrap configure.ac README-package-renamed-to-coreutils > bootstrap.conf COPYING README-prereq > cfg.mk dist-check.mk README-release > ChangeLog HACKING README-valgrind > ChangeLog-2005 init.cfg thanks-gen > ChangeLog-2006 Makefile THANKS.in > ChangeLog-2007 Makefile.am THANKStt.in > ChangeLog-2008 Makefile.in TODO > > can filter on two types by applying the switch twice. > > ./src/ls --just=normal --just=symbolic-links -l test > total 0 > lrwxrwxrwx 1 hal hal 13 Nov 29 00:20 link-to-somefile -> test/somefile > -rw-rw-r-- 1 hal hal 0 Nov 29 00:20 somefile > > > Why might rejection of this feature and patch be a good idea? > You can get this kind of thing done (sort of) with > $ find . -type d --maxdepth=1 -ls > or shell globbing abuse eg > $ ls -d */ > but obviously such things are not ls and lose the familiar and consistent > ls options such as find displaying a differing long format, no colored > output, sorting, control of display of dotfiles etc. However all of these > alternatives' shortcomings can be alleviated with fairly ordinary shell > pipelines involving sed and/or test at the cost of a simple, robust and > convenient user interface as provided by ls. > > Shortcomings/BUGS/Possible future enhancements : > 1) doesn't work with -R for anything except directories > 2) Doesn't have a mode to filter based on permissions (eg show only > executables or setuid etc). > 3) Doesn't follow symbolic links and then filter them based on the type of > file they are pointing at and I haven't yet worked out how to add the > command interface for "including symlinks to" in a way that is not too ugly. > 4) Others that exist of which I haven't considered. > > On the off chance that there does happen to be interest in this feature > and patch by coreutils hackers, I am more than happy to assign the > copyright to GNU on the understanding it will be published under the > appropriate version of the GPL for coreutils. > The patch should apply cleanly to the current default git checkout. I'm > subscribed to the list and interested in any and all feedback. > > Thank you for taking the time to give this request an appropriate level of > consideration. > > Kind regards, > Hal Ashburner > > >
From f9dfe902cf3169aeee5c74b41b63e6acda31f4bb Mon Sep 17 00:00:00 2001 From: Hal Ashburner <[email protected]> Date: Fri, 29 Nov 2013 01:03:07 +1100 Subject: [PATCH] :"just" option to ls. List only files of filetype --- src/ls.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/ls.c b/src/ls.c index e7d1d93..b14b1cf 100644 --- a/src/ls.c +++ b/src/ls.c @@ -252,6 +252,7 @@ static bool print_color_indicator (const struct fileinfo *f, bool symlink_target); static void put_indicator (const struct bin_str *ind); static void add_ignore_pattern (const char *pattern); +static void do_not_ignore_filetype (const enum filetype f); static void attach (char *dest, const char *dirname, const char *name); static void clear_files (void); static void extract_dirs_from_files (char const *dirname, @@ -666,6 +667,9 @@ static struct ignore_pattern *ignore_patterns; variable itself to be ignored. */ static struct ignore_pattern *hide_patterns; +static bool ignore_filetypes; +static bool filetype_ignored[arg_directory + 1]; + /* True means output nongraphic chars in file names as '?'. (-q, --hide-control-chars) qmark_funny_chars and the quoting style (-Q, --quoting-style=WORD) are @@ -789,6 +793,7 @@ enum FULL_TIME_OPTION, GROUP_DIRECTORIES_FIRST_OPTION, HIDE_OPTION, + JUST_FILETYPE_OPTION, INDICATOR_STYLE_OPTION, QUOTING_STYLE_OPTION, SHOW_CONTROL_CHARS_OPTION, @@ -826,6 +831,7 @@ static struct option const long_options[] = DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION}, {"hide", required_argument, NULL, HIDE_OPTION}, {"ignore", required_argument, NULL, 'I'}, + {"just", required_argument, NULL, JUST_FILETYPE_OPTION}, {"indicator-style", required_argument, NULL, INDICATOR_STYLE_OPTION}, {"dereference", no_argument, NULL, 'L'}, {"literal", no_argument, NULL, 'N'}, @@ -894,6 +900,33 @@ static enum color_type const color_types[] = }; ARGMATCH_VERIFY (color_args, color_types); +static char const *const just_filetype_args[] = +{ + "f", "fifos", + "c", "character-devices", + "d", "directories", + "b", "block-devices", + "n", "normal", + "l", "symbolic-links", + "s", "sockets", + "w", "whiteouts", + "a", "arg-directories", + NULL +}; +static enum filetype const just_filetype_types[] = +{ + fifo, fifo, + chardev, chardev, + directory, directory, + blockdev, blockdev, + normal, normal, + symbolic_link, symbolic_link, + sock, sock, + whiteout, whiteout, + arg_directory, arg_directory +}; +ARGMATCH_VERIFY (just_filetype_args, just_filetype_types); + /* Information about filling a column. */ struct column_info { @@ -1640,6 +1673,14 @@ decode_switches (int argc, char **argv) } } } + { + ignore_filetypes = false; + int i; + for (i = 0; i != arg_directory + 1; ++i) + { + filetype_ignored[i] = true; + } + } while (true) { @@ -1865,6 +1906,15 @@ decode_switches (int argc, char **argv) } break; + case JUST_FILETYPE_OPTION: + { + enum filetype just_filetype = XARGMATCH ("--just", optarg, + just_filetype_args, + just_filetype_types); + do_not_ignore_filetype(just_filetype); + } + break; + case SORT_OPTION: sort_type = XARGMATCH ("--sort", optarg, sort_args, sort_types); sort_type_specified = true; @@ -2503,6 +2553,23 @@ queue_directory (char const *name, char const *realname, bool command_line_arg) pending_dirs = new; } +/* set this filetype to be paid attention to */ +static void +do_not_ignore_filetype(const enum filetype ftype) +{ + ignore_filetypes = true; + filetype_ignored[ftype] = false; +} + +/* Return true if this filetype should be ignored. */ +static bool +is_filetype_ignored(enum filetype ftype) +{ + return ignore_filetypes && filetype_ignored[ftype]; +} + + + /* Read directory NAME, and list the files in it. If REALNAME is nonzero, print its name instead of NAME; this is used for symbolic links to directories. @@ -2598,6 +2665,10 @@ print_dir (char const *name, char const *realname, bool command_line_arg) case DT_WHT: type = whiteout; break; # endif } + if (is_filetype_ignored(type)) + { + continue; + } #endif total_blocks += gobble_file (next->d_name, type, RELIABLE_D_INO (next), @@ -4816,6 +4887,11 @@ Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.\n\ -i, --inode print the index number of each file\n\ -I, --ignore=PATTERN do not list implied entries matching shell PATTERN\ \n\ + --just=FILETYPE only list implied entries of FILETYPE, filetyes:\n\ + arg-directories block-devices character-devices\n\ + directories fifos normal symbolic-links sockets\n\ + whiteouts\n\ +\n\ -k, --kibibytes default to 1024-byte blocks for disk usage\n\ "), stdout); fputs (_("\ -- 1.8.1.2
