home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  

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 Tools Next: 17.18 Using "Fast find"
17.16 Searching by Owner and Group Book Index 17.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