Linux DevCenter    
 Published on Linux DevCenter (
 See this if you're having trouble printing code examples

Unix Power Tools
Copying Directory Trees with (tar | tar)

by Jerry Peek

The tar command isn't just for tape archives. It can copy files from disk to disk, too. And even if your computer has cp -r there are advantages to using tar.

The obvious way to copy directories with tar is to write them onto a tape archive with relative pathnames -- then read back the tape and write it somewhere else on the disk. But tar can also write to a UNIX pipe -- and read from a pipe. This looks like:

% reading-tar | writing-tar

with one trick: the writing-tar process has a different current directory (the place where you want the copy made) than the reading-tar. To do that, run the writing-tar in a subshell.

The argument(s) to the reading-tar can be directory(s) or file(s). Just be sure to use relative pathnames that don't start with a slash -- otherwise, the writing-tar will write the copies in the same place the originals came from!

"How about an example," you ask? The figure below has one. It copies from the directory /home/jane, with all its files and subdirectories. The copy is made in the directory /work/bkup/jane:

% mkdir /work/bkup/jane
% cd /home/jane
% tar cf - . | (cd /work/bkup/jane && tar xBf -)

The && operator tells the shell to start tar xBf only if the previous command (the cd) succeeded. That prevents tar writing files into the same directory it's reading from -- if the destination directory isn't accessible or you flub its pathname. If your tar has a B (reblocking) option, use it to help be sure that the copy is made correctly. If your tar doesn't have a reblocking option, you can use this trick suggested by Chris Torek:

% tar cf - . | cat | (cd /work/backup/jane && tar xbf 1 -)

You can use other options that your tar might have, like excluding files or directories, on the reading-tar, too. Some gotchas:

Figure: Copying /home/jane to /work/bkup with tar

Figure of copying directories with tar

If your system has rsh, you can run the writing-tar on a remote system. For example, to copy a directory to the computer named kumquat:

% rsh kumquat mkdir /work/bkup/jane
% tar cf - . | rsh kumquat 'cd /work/bkup/jane && tar xBf -'

Back More Unix Power Tools


Copyright © 2009 O'Reilly Media, Inc.