Unix Power Tools
by Jerry Peek
Copying Directory Trees with (tar | tar)
tar command isn't just for tape archives.
It can copy files from disk to disk, too.
And even if your computer has
there are advantages to using
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
process has a different current directory (the place where you want
the copy made) than the
reading-tar. To do that,
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
tells the shell to start
tar xBf only if the previous command
tar writing files into the same
directory it's reading
from -- if the destination directory isn't accessible or you flub its pathname.
tar has a
B (reblocking) option, use it to
help be sure that the copy is made correctly.
tar doesn't have a reblocking option, you can use this
trick suggested by Chris Torek:
You can use other options that your
tar might have, like excluding files or directories,
reading-tar, too. Some gotchas:
Symbolic links 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.
A hard link 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 fto find all files that have more than one link, and
l(lowercase letter L) option to complain if it didn't copy all links to a file.
Figure: Copying /home/jane to /work/bkup with tar
If your system has
you can run the
writing-tar on a remote system.
For example, to copy a directory to the computer named