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