With this set of commands, what are the {} and \; characters for?
find . -name '*.clj' -exec grep -r resources {} \; With this set of commands, what are the {} and \; characters for?
find . -name '*.clj' -exec grep -r resources {} \; See man find. (particular the part about -exec)
When using -exec to run a command on each of the files found, the {} is replaced with the name of each file found, and the command is terminated by \;
In your example, all files found under the current directory (.), matching the name *.clj will have the command grep -r resources run on them (to find the string resources if it exists in each of those files).
It's actually somewhat redundant, since -r is for recursively searching subdirectories, and that's what find is already doing.
man find because it doesn't look like it's part of the find command, any more than a shell expansion, pipe, or other redirect operator is part of the command it's found next to. I assumed it was some shell syntax magic which I wouldn't be able to identify without already knowing the name of it.Consider this alternative command which I find easier to understand:
find . -name *.clj | xargs grep -r resources The string {} in find is replaced by the pathname of the current file.
The semicolon is used for terminating the shell command invoked by find utility.
It needs to be escaped, or quoted, so it won't be interpreted by the shell, because ; is one of the special characters used by shell (list operators).
See also: Why are the backslash and semicolon required with the find command's -exec option?