APLawrence.com -  Resources for Unix and Linux Systems, Bloggers and the self-employed

Using sh -c with find


2007/01/02

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?

Unix/Linux/Mac OS X support by phone, email or on-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





Securing a computer system has traditionally been a battle of wits: the penetrator tries to find the holes, and the designer tries to close them. (Gosser)

Perl: The only language that looks the same before and after RSA encryption. (Keith Bostic)







This post tagged: