The correct line would be:
find -name "*.c" -exec ls -l \{\} \;
or
find -name "*.c" -exec ls -l '{}' ';'
or
find -name "*.c" -exec ls -l '{}' \;
...
You see the pattern?
Reasoning?
- the shell splits the command line into chunks (1st chunk is the command, the rest are the individual arguments to the command)
- since the shell is a language in it self, it has some relevant punctuation and operator symbols - among others, { } and ; have a meaning to the shell
- since the find command also needs for some operations the {} and ; as own arguments, one must make sure that the {} and the ; are not interpreted by the shell, but are rather passed to the find command. There are two possibilities to achieve that: escaping or placing into a literal string.
- escaping is placing a \ before one character - the character then is not interpreted by the shell and is passed as-is (without leading \)
- '...' strings are passed as-is, after stripping off the leading and trailing single quote
- "..." strings get evaluated by the shell for variable substitution and other functions and only then are taken (by stripping off the quotes)
Note: If you want a text be passed unchanged to a command, use single quoted string ('...'). If you would place the {} or the ; into "{}" ";", they are interpreted by the shell and thus might not be passed unchanged to the find command.