Copying Directory Trees with (tar | tar)

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? Figure 18.2 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 -)


CAUTION: At least one tar version has a v (verbose) option that writes the verbose text to standard output instead of standard error ! () If your tar does that, don't use v on the reading-tar (the tar that feeds the pipe)-use v on the writing-tar.

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

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

Figure 18.2

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


- JP