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:
with one trick:
(the place where you want the copy made) than the
To do that, run the
writing-tar in a
The argument(s) to the
reading-tar can be directory(s) or file(s).
Just be sure to use
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:
tar cf - . | (cd /work/bkup/jane && tar xBf -)
tar xBf only if the previous command
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
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
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 or .
Awill 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 withto find all files that have more than one link, and
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
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 -'