The 
find
 operator 
{}
, used with the 
-exec
 (
17.10
)
 operator, only works when it's separated from other arguments by white space. So, for example, the following command will 
not
 do what you thought it would:
%find . -type d -exec mkdir /usr/project/{} \;
You might have thought this command would make a duplicate set of  - pty) directories, from the current directory and down, starting at the directory 
/usr/project
. For instance, when the 
find
 command finds the directory 
./adir
, you would have it execute 
mkdir
 
/usr/project/./adir
 
(ignore the dot; the result is 
/usr/project/adir
) (
1.21
)
.
That doesn't work because 
find
 doesn't recognize the 
{}
 in the pathname. The trick is to pass the directory names to  
sed
 (
34.24
)
, which substitutes in the leading pathname:
%find . -type d -print | sed 's@^@/usr/project/@' | xargs mkdir%find . -type d -print | sed 's@^@mkdir @' | (cd /usr/project; sh)
Let's start with the first example. Given a list of directory names, 
sed
 substitutes the desired path to that directory at the beginning of the line before passing the completed filenames to  
xargs
 (
9.21
)
 and 
mkdir
. An 
@
 is used as a 
sed
 delimiter (
34.7
)
 because slashes (/) are needed in the actual text of the substitution. If you don't have 
xargs
, try the second example. It uses 
sed
 to insert the 
mkdir
 command, then changes to the target directory in a 
subshell (
13.7
)
 where the 
mkdir
 commands will actually be executed.
-