Ok.

I implemented the multiple argument feature for dirname too. I will provide
the patch soon.

Jérémy
Le 7 mars 2012 03:02, "Pádraig Brady" <[email protected]> a écrit :

> On 03/04/2012 07:09 PM, Jérémy Compostella wrote:
> >> [...]
> >> I just logged onto an OS X box there and you're right:
> >>
> >> $ printf "%s\n" 1/1 2/2 | xargs basename
> >> 1
> >>
> >> $ printf "%s\n" 1/1 2/2 3/3| xargs basename
> >> 1
> >> 2
> >> 3
> >>
> >> However I think it's dangerous to do that.
> >> If I was writing a script I would probably test with
> >> 1 or 3 or more arguments. But the script would then fail if
> >> given 2 args based on transient conditions.
> >> I would not emulate that "feature".
> > I do agree it's dangerous. I removed this "feature".
> >
> >>> [...]
> >>> Eric Blake said:
> >>>> It's been brought up before, and the consensus has always been that if
> >>>> someone would write the patches, it would be worthwhile.  We do need
> >>>> support for a -0 or some other way to do NUL-terminated filtering,
> >>>> though.
> >>> which conflict with the idea that this feature is not really worth. I'm
> >>> a bit confused now ...
> >>
> >> Yes, I agreed with Eric that -0 was useful,
> >> but on consideration if not processing stdin,
> >> then I don't think it's of use.
> > OK.
> >
> > I attached the patch. Feel free to comment.
>
> Thanks again for doing that.
> I've made the following tweaks and will push early tomorrow.
>
> cheers,
> Pádraig.
>
> diff --git a/NEWS b/NEWS
> index 082c5ec..2289d53 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -16,7 +16,9 @@ GNU coreutils NEWS
>  -*- outl
>   split now accepts the --additional-suffix option, to append an
>   additional static suffix to output file names.
>
> -  basename now supports the -a and -s BSD options.
> +  basename now supports the -a and -s options, which allow
> +  processing more than one argument at a time.  Also the complementary
> +  -z option was added to delimit output items with the NUL character.
>
>  ** Bug fixes
>
> diff --git a/doc/coreutils.texi b/doc/coreutils.texi
> index d513c25..1c50764 100644
> --- a/doc/coreutils.texi
> +++ b/doc/coreutils.texi
> @@ -12422,7 +12422,7 @@ This section describes commands that manipulate
> file nam
>
>  @example
>  basename @var{name} [@var{suffix}]
> -basename [@var{option}]... [@var{name}]...
> +basename @var{option}... @var{name}...
>  @end example
>
>  If @var{suffix} is specified and is identical to the end of @var{name},
> @@ -12455,15 +12455,14 @@ Options must precede operands.
>  @itemx --multiple
>  @opindex -a
>  @opindex --multiple
> -Treat every argument as a @var{name} as if @command{basename} were
> -invoked with just one argument.
> +Support more than one argument.  Treat every argument as a @var{name},
> +with a @var{suffix} needing to be specified using the @option{-s} option.
>
>  @item -s @var{suffix}
> -@itemx --sufix=@var{suffix}
> +@itemx --suffix=@var{suffix}
>  @opindex -s
>  @opindex --suffix
> -Remove a trailing @var{suffix}. If @samp{-s} is specified,
> -@command{basename} acts as if @samp{-a} was specified too.
> +Remove a trailing @var{suffix}.  @option{-s} implies @option{-a}.
>
>  @end table
>
> diff --git a/src/basename.c b/src/basename.c
> index a1d28da..158ac7b 100644
> --- a/src/basename.c
> +++ b/src/basename.c
> @@ -32,6 +32,7 @@ static struct option const longopts[] =
>  {
>   {"multiple", no_argument, NULL, 'a'},
>   {"suffix", required_argument, NULL, 's'},
> +  {"zero", no_argument, NULL, 'z'},
>   {GETOPT_HELP_OPTION_DECL},
>   {GETOPT_VERSION_OPTION_DECL},
>   {NULL, 0, NULL, 0}
> @@ -46,7 +47,7 @@ usage (int status)
>     {
>       printf (_("\
>  Usage: %s NAME [SUFFIX]\n\
> -  or:  %s [OPTION]... [NAME]...\n\
> +  or:  %s OPTION... NAME...\n\
>  "),
>               program_name, program_name);
>       fputs (_("\
> @@ -56,20 +57,19 @@ If specified, also remove a trailing SUFFIX.\n\
>  "), stdout);
>
>       fputs (_("\
> -  -a, --multiple  treat every argument as a NAME as if basename were\n\
> -                  invoked with just one argument.\n\
> -  -s, --suffix=SUFFIX  remove a trailing SUFFIX.\n\
> +  -a, --multiple       support multiple arguments and treat each as a
> NAME\n\
> +  -s, --suffix=SUFFIX  remove a trailing SUFFIX\n\
> +  -z, --zero           separate output with NUL rather than newline\n\
>  "), stdout);
>       fputs (HELP_OPTION_DESCRIPTION, stdout);
>       fputs (VERSION_OPTION_DESCRIPTION, stdout);
>       printf (_("\
>  \n\
>  Examples:\n\
> -  %s /usr/bin/sort       Output \"sort\".\n\
> -  %s include/stdio.h .h  Output \"stdio\".\n\
> -  %s -s .h include/stdio.h  Output \"stdio\".\n\
> -  %s -a -s .h include/stdio.h include/stdlib.h  Output \"stdio\" followed
> by\
> - \"stdlib\".\n\
> +  %s /usr/bin/sort          -> \"sort\"\n\
> +  %s include/stdio.h .h     -> \"stdio\"\n\
> +  %s -s .h include/stdio.h  -> \"stdio\"\n\
> +  %s -a any/str1 any/str2   -> \"str1\" followed by \"str2\"\n\
>  "),
>               program_name, program_name, program_name, program_name);
>       emit_ancillary_info ();
> @@ -97,10 +97,10 @@ remove_suffix (char *name, const char *suffix)
>  }
>
>  /* Perform the basename operation on STRING.  If SUFFIX is non-NULL,
> remove
> -   the trailing suffix SUFFIX. Finally, output the result string.  */
> +   the trailing SUFFIX.  Finally, output the result string.  */
>
>  static void
> -perform_basename (const char *string, const char *suffix)
> +perform_basename (const char *string, const char *suffix, bool use_nuls)
>  {
>   char *name = base_name (string);
>   strip_trailing_slashes (name);
> @@ -114,14 +114,16 @@ perform_basename (const char *string, const char
> *suffix)
>   if (suffix && IS_RELATIVE_FILE_NAME (name) && ! FILE_SYSTEM_PREFIX_LEN
> (name)
>     remove_suffix (name, suffix);
>
> -  puts (name);
> +  fputs (name, stdout);
> +  putchar (use_nuls ? '\0' : '\n');
>   free (name);
>  }
>
>  int
>  main (int argc, char **argv)
>  {
> -  unsigned char multiple_names = 0;
> +  bool multiple_names = false;
> +  bool use_nuls = false;
>   const char *suffix = NULL;
>
>   initialize_main (&argc, &argv);
> @@ -134,7 +136,7 @@ main (int argc, char **argv)
>
>   while (true)
>     {
> -      int c = getopt_long (argc, argv, "as:", longopts, NULL);
> +      int c = getopt_long (argc, argv, "as:z", longopts, NULL);
>
>       if (c == -1)
>         break;
> @@ -145,7 +147,11 @@ main (int argc, char **argv)
>           suffix = optarg;
>
>         case 'a':
> -          multiple_names = 1;
> +          multiple_names = true;
> +          break;
> +
> +        case 'z':
> +          use_nuls = true;
>           break;
>
>         case_GETOPT_HELP_CHAR;
> @@ -169,11 +175,13 @@ main (int argc, char **argv)
>     }
>
>   if (multiple_names)
> -    for (; optind < argc; optind++)
> -      perform_basename (argv[optind], suffix);
> +    {
> +      for (; optind < argc; optind++)
> +        perform_basename (argv[optind], suffix, use_nuls);
> +    }
>   else
>     perform_basename (argv[optind],
> -                      optind + 2 == argc ? argv[optind + 1] : NULL);
> +                      optind + 2 == argc ? argv[optind + 1] : NULL,
> use_nuls);
>
>   exit (EXIT_SUCCESS);
>  }
>

Reply via email to