UNIX Power Tools

UNIX Power ToolsSearch this book
Previous: 17.16 Searching by Owner and Group Chapter 17
Finding Files with find
Next: 17.18 Using "Fast find"
 

17.17 Duplicating a Directory Tree (No Pathnames with find {} Operator)

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.

- JP


Previous: 17.16 Searching by Owner and Group UNIX Power ToolsNext: 17.18 Using "Fast find"
17.16 Searching by Owner and Group Book Index17.18 Using "Fast find"

The UNIX CD Bookshelf NavigationThe UNIX CD BookshelfUNIX Power ToolsUNIX in a NutshellLearning the vi Editorsed & awkLearning the Korn ShellLearning the UNIX Operating System