The tar ( 19.5 ) command isn't just for tape archives. It can copy files from disk to disk, too. And even if your computer has cp -r ( 18.15 ) , 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 (
38.3
, 
38.4
)
 (the place where you want the copy made) than the 
reading-tar
. To do that, run the 
writing-tar
 in a 
subshell (
13.7
)
.
The argument(s) to the 
reading-tar
 can be directory(s) or file(s). Just be sure to use 
relative pathnames (
14.2
)
 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 (
44.9
)
 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 ! ( 19.8 ) If your tar does that, don't use v on the
reading-tar(the tar that feeds the pipe)-use v on thewriting-tar.
You can use other options that your 
tar
 might have-like 
excluding files or directories (
20.8
)
- on the 
reading-tar
, too. Some gotchas:
Symbolic links ( 18.4 ) will be copied exactly. If they point to relative pathnames, the copied links might point to locations that don't exist. You can search for these symbolic links with find -type l ( 17.13 ) or oldlinks ( 16.28 ) .
A hard link ( 18.4 ) will be copied as a file. If there are more hard links to that file in the files you're copying, they will be linked to the copy of the first link. That can be good because the destination might be on a different filesystem (a hard link to the original file can't work then). It can be bad if the link pointed to a really big file; the copy can take a lot of disk space. You can search for these hard links by:
Searching the directory from which you're copying with find -links +1 -type f ( 17.5 ) to find all files that have more than one link, and
Running the 
reading-tar
 with its 
l
 (lowercase letter L) option  to complain if it didn't copy all links to a file.

If your system has 
rsh
 (
1.33
)
, 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 -'
-