"Andreas R." <[EMAIL PROTECTED]> wrote:
> find dir1 -type f -exec sh -c 'echo "{}" dir2/"`basename "{}"`"' \;
> it works, but I still don't understand completely why it works.
Actually, it still won't work in some cases. If a filename contains a
double quote, like 'foo" "bar', the shell will see this command for
-c:
echo "foo" "bar" dir2/"`basename "foo" "bar"`"
which isn't what you want. This will handle any flename properly:
find dir1 -exec sh -c 'diff -q "$0" dir2/"`basename "$0"`"' {} \;
The difference here is that {} is substituted by find, before sh is
invoked, so if {} appears within the -c command, sh will interpret any
special characters in the filename as shell syntax, not as part of the
filename. Keeping {} as a separate argument to sh, and referring to
it as a variable from within the command, prevents any such problems.
> And where do you learn such tricks from? :)
Experience, mostly.
paul