Using sh -c with find


I'm sure everyone reading here has used "-exec" with "find"; for example:

find . -name core -exec rm {} \;

When I want to do something more complex to each found file, I usually pass the name to another script:

find . -exec my shellscript {} \;

The "myshellscript" gets the filename as $1 and you go from there. There is another way to do it, though. Consider this silly example:

find . -exec sh -c '
file=`echo $1 | tr 'c' 'C'`
echo $file' foobah {} \;

The "foobah" is just a convenient way to pass "{}" to the commands. Why wouldn't you just do this?

find . -exec sh -c '
file=`echo $0 | tr 'c' 'C'`
echo $file' {} \;

Well, that wouldn't bother "find" any, but if any of your found files were executable, "find" is going to run them.. so if you happened to have a file named "rm", find would call the real "rm" to remove it. The "foobah" example is really no different: "find" will attempt to run "foobah" for every file found. If you don't know for sure that "foobah" doesn't exist or don't want to chance it, use ":"

find . -exec sh -c '
file=`echo $1 | tr 'c' 'C'`
echo $file' : {} \;

Duh.. what was I thinking? The above is totally wrong: yes, {} gets passed as $1, but it wouldn't be executed. Nor would "foobah" or anything else!

Personally, I find this type of thing more confusing and prefer a separate script.

Got something to add? Send me email.

(OLDER) <- More Stuff -> (NEWER)    (NEWEST)   

Printer Friendly Version

-> -> Using sh -c with find

Increase ad revenue 50-250% with Ezoic

More Articles by

Find me on Google+

© Anthony Lawrence

Kerio Samepage

Have you tried Searching this site?

Support Rates

This is a Unix/Linux resource website. It contains technical articles about Unix, Linux and general computing related subjects, opinion, news, help files, how-to's, tutorials and more.

Contact us

privacy policy