[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: DRAFT: PROPOSAL: Add option 'piped-list' to read file list from stdi
From: |
arnold |
Subject: |
Re: DRAFT: PROPOSAL: Add option 'piped-list' to read file list from stdin |
Date: |
Tue, 26 Apr 2022 08:32:30 -0600 |
User-agent: |
Heirloom mailx 12.5 7/5/10 |
Just use xargs .... :-)
Arnold
José Bollo <jobol@nonadev.net> wrote:
> This is just an idea. Why is it not possible to get the list of file
> from stdin? Why is it not already in grep? It seems so obvious and
> useful that is was maybe withdrawn before (for some good reason).
>
> I was doing a script with
>
> file . [condition] -exec grep -q EXPR {} ; -print
>
> but it could also be written
>
> file . [condition] | grep -pl EXPR
>
> if the proposal is accepted.
>
> With the two BIG advantages are:
> - there is only 2 processes, not 1 + the count of files
> - there is no need to check limit on size of arguments of a command
>
> Here below the patch (not tested, just an idea here). More advanced
> usage could read from a file instead of stdin but it is of less
> importance IMHO.
>
> Best regards
> José Bollo
>
> diff --git a/src/grep.c b/src/grep.c
> index 4109ae4..98ffd84 100644
> --- a/src/grep.c
> +++ b/src/grep.c
> @@ -555,6 +555,7 @@ static struct option const long_options[] =
> {"version", no_argument, NULL, 'V'},
> {"with-filename", no_argument, NULL, 'H'},
> {"word-regexp", no_argument, NULL, 'w'},
> + {"piped-list", no_argument, NULL, 'p'},
> {0, 0, 0, 0}
> };
>
> @@ -1089,6 +1090,7 @@ static intmax_t max_count; /* Max number
> of selected lines from an input file. */
> static bool line_buffered; /* Use line buffering. */
> static char *label = NULL; /* Fake filename for stdin */
> +static bool piped_list; /* Read file list from stdin */
>
>
> /* Internal variables to keep track of byte count, context, etc. */
> @@ -2000,6 +2002,7 @@ Pattern selection and interpretation:\n"),
> getprogname ());
> printf (_("\
> \n\
> Miscellaneous:\n\
> + -p, --piped-list get file list from stdin\n\
> -s, --no-messages suppress error messages\n\
> -v, --invert-match select non-matching lines\n\
> -V, --version display version information and exit\n\
> @@ -2698,6 +2701,10 @@ main (int argc, char **argv)
> only_matching = true;
> break;
>
> + case 'p':
> + piped_list = true;
> + break;
> +
> case 'q':
> exit_on_match = true;
> exit_failure = 0;
> @@ -2986,27 +2993,49 @@ main (int argc, char **argv)
> if (fts_options & FTS_LOGICAL && devices ==
> READ_COMMAND_LINE_DEVICES) devices = READ_DEVICES;
>
> - char *const *files;
> - if (0 < num_operands)
> - {
> - files = argv + optind;
> - }
> - else if (directories == RECURSE_DIRECTORIES && 0 < last_recursive)
> + bool status = true;
> + if (piped_list)
> {
> - static char *const cwd_only[] = { (char *) ".", NULL };
> - files = cwd_only;
> - omit_dot_slash = true;
> + size_t size = 0;
> + char *file = NULL;
> + ssize_t rsize;
> + out_file = true;
> + while ((rsize = readline(&file, &size, stdin)) > 0)
> + {
> + if(file[rsize - 1] == '\n')
> + {
> + file[--rsize] = 0;
> + }
> + if (rsize > 0)
> + {
> + status &= grep_command_line_arg (file);
> + }
> + }
> + free(file);
> }
> else
> {
> - static char *const stdin_only[] = { (char *) "-", NULL };
> - files = stdin_only;
> - }
> + char *const *files;
> + if (0 < num_operands)
> + {
> + files = argv + optind;
> + }
> + else if (directories == RECURSE_DIRECTORIES && 0 <
> last_recursive)
> + {
> + static char *const cwd_only[] = { (char *) ".", NULL };
> + files = cwd_only;
> + omit_dot_slash = true;
> + }
> + else
> + {
> + static char *const stdin_only[] = { (char *) "-", NULL };
> + files = stdin_only;
> + }
>
> - bool status = true;
> - do
> - status &= grep_command_line_arg (*files++);
> - while (*files != NULL);
> + do
> + status &= grep_command_line_arg (*files++);
> + while (*files != NULL);
> + }
>
> return errseen ? EXIT_TROUBLE : status;
> }
>
>
>