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.
-