GNU bug report logs -
#24011
parallel find error
Previous Next
Reported by: jklowden <jklowden <at> schemamania.org>
Date: Sat, 16 Jul 2016 23:07:01 UTC
Severity: normal
Tags: notabug
Done: Assaf Gordon <assafgordon <at> gmail.com>
Bug is archived. No further changes may be made.
Full log
Message #8 received at 24011 <at> debbugs.gnu.org (full text, mbox):
tag 24011 notabug
close 24011
stop
Hello,
> On Jul 16, 2016, at 15:42, jklowden <jklowden <at> schemamania.org> wrote:
>
> There appears to be an error in the parallel execution of find. I
> created a minimal example below.
>
> [...]
>
> $ find .. -type f -name lx[tr]\*.1 -exec basename {} +
> basename: extra operand ‘../appl/fsgmatch/lxtransduce.1’
> Try 'basename --help' for more information.
There are several issues here, though none of them are bugs.
First,
The difference between "find -exec basename {} \;" and "find -exec basename {} +" :
The former will execute the program 'basename' once per file,
and the latter will execute it fewer times with multiple files as parameters.
The following will demonstrate:
$ mkdir c
$ touch c/1 c/2 c/3 c/4
$ find c -type f
c/1
c/2
c/3
c/4
Compare:
$ find c -type f -exec echo basename {} \;
basename c/1
basename c/2
basename c/3
basename c/4
$ find c -type f -exec echo basename {} +
basename c/1 c/2 c/3 c/4
Second,
the "basename" command by default accepts a single parameter (pathname) or two parameters (pathname and optional extension).
Running it with three or more parameters will cause the error you were experiencing:
$ basename c/a.txt
a.txt
$ basename c/a.txt .txt
a
$ basename c/a.txt .txt c
basename: extra operand ‘c’
Try 'basename --help' for more information.
That explains your error: using the "+" syntax, "find" executed 'basename' with multiple filenames, and basename rejected it as invalid syntax.
However,
basename from coreutils version 8.16 and newer (released in 2012) supports the "-a" option (gnu extension) that handles multiple filenames on the same command line.
Compare:
$ basename c/a.txt c/b.txt c/c.txt
basename: extra operand ‘c/c.txt’
Try 'basename --help' for more information.
$ basename -a c/a.txt c/b.txt c/c.txt
a.txt
b.txt
c.txt
Continuing the example above, the following syntax should work and do what you wanted:
$ find c -type f -exec basename -a {} +
1
2
3
4
As such, I'm closing this bug, but discussion can continue by replying to this thread.
regards,
- assaf
This bug report was last modified 6 years and 209 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.