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.
Increase ad revenue 50-250% with Ezoic
Inexpensive and informative Apple related e-books:
iOS 8: A Take Control Crash Course
Take Control of Upgrading to El Capitan
Take Control of Apple Mail, Third Edition
Yosemite Crash Course
Take Control of iCloud, Fifth Edition
More Articles by Anthony Lawrence
Find me on Google+
© 2010-10-27 Anthony Lawrence
Printer Friendly Version
Using sh -c with find Copyright © January 2007 Tony Lawrence
Have you tried Searching this site?
Support RatesThis 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
Printer Friendly Version