What's the missing argument to -exec?
The user in that post may said that the +
sign at the end of a -exec
command is faster, but not why.
Lets assume the find
command return the following files:
/path/to/file1
/path/to/file2
/path/to/file3
The normal -exec
command (-exec command {} \;
) runs once for each matching file. For example:
find ... -exec mv {} /target/ \;
Executes:
mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/
If you use the +
sign (-exec command {} +
) the command is build by adding multiple matched files at the end of the command. For example:
find ... -exec mv -t /target/ {} +
Executes:
mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3
To use the +
flag correctly the argument to process must be at the end of the command, not in the middle. That's why find
trows missing argument to '-exec'
in your example; it misses the closing {}
.
The user explained their edit....
...using this link. I think basically instead of using multiple commands, it sends all the filenames to one command instance, to speed things up. Here is a example from here:
Using -exec with a semicolon (
find . -exec ls '{}' \;
), will executels file1 ls file2 ls file3
But if you use a plus sign instead (
find . -exec ls '{}' \+
), all filenames will be passed as arguments to a single command:ls file1 file2 file3
There are other forms available using ;
and +
as well (from here:)
Therefore the following example syntax is allowed for find command:
find . -exec echo {} \; find . -exec echo {} ';' find . -exec echo {} ";" find . -exec echo {} \+ find . -exec echo {} +
HOWEVER, I'm not sure this will work with the move command anyway, as it's syntax is mv [OPTION]... SOURCE DEST
, unless the -t
option or similar is used. However it should work with ls
with no extra options etc as they can understand when multiple filenames are given. The +
may also need to be escaped (i.e. \+
)