find missing parameter

View: New views
3 Messages — Rating Filter:   Alert me  

find missing parameter

by prz :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I have a small problem with find command
whenever I specify the -exec option this error is displayed

/cygdrive/c/workdir: find  . -name "db*" -mtime +2 -type f -exec /bin/rm {}
find: missing argument to `-exec'

tried quotes - single double ... with/without path to rm or any other command (ls)
removing the exec returns the correct file
Best Regards, Guy Przytula

Re: find missing parameter

by Brian Dessent :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

prz wrote:

> I have a small problem with find command
> whenever I specify the -exec option this error is displayed
>
> /cygdrive/c/workdir: find  . -name "db*" -mtime +2 -type f -exec /bin/rm {}
> find: missing argument to `-exec'
>
> tried quotes - single double ... with/without path to rm or any other
> command (ls)
> removing the exec returns the correct file

None of this is Cygwin-specific.

First, -exec is a bad way to do this.  It will have to fork/exec a copy
of rm once for each file to be deleted, which is extraordinarily slow
under Cygwin.  Use xargs instead:

find . -name db\* -mtime +2 -type f -print0 | xargs -0 rm

This will result in rm being called only once with all the filenames to
delete as arguments (unless the total length is too great to fit on one
command line, in which case rm will be called as many times as
necessary, but still much less than once per file.)

If you really want to use -exec even though it's horribly slow, then
re-read the find manpage, as you are missing the trailing semicolon that
tells -exec when the argments end.  This makes it possible to include
further 'find' options after -exec without them being treated as
arguments to -exec, for example: find . -type f -exec cmd {} \; -print

Note that semicolon is a shell special character so you have to quote it
if you want to pass a literal semicolon to find, just as you have to do
with * in -name.

Brian

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Re: find missing parameter

by Owen Rees :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

--On 30 June 2006 02:42 -0700 Brian Dessent wrote:

> First, -exec is a bad way to do this.  It will have to fork/exec a copy
> of rm once for each file to be deleted, which is extraordinarily slow
> under Cygwin.  Use xargs instead:
>
> find . -name db\* -mtime +2 -type f -print0 | xargs -0 rm
>
> This will result in rm being called only once with all the filenames to
> delete as arguments (unless the total length is too great to fit on one
> command line, in which case rm will be called as many times as
> necessary, but still much less than once per file.)

Provided that your version of cygwin (specifically findutils) is reasonable
recent, you can use

find  . -name "db*" -mtime +2 -type f -exec /bin/rm {} +

to do more or less the same as with xargs.

--
Owen Rees
Hewlett Packard Laboratories, Bristol, UK



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/