## 38.6. Restoring Files from Tape with tar

When you create an archive, there are several ways to specify the directory. If the directory is under the current directory, you could type:

>     % tar c project

A similar way to specify the same directory is:

>     % tar c ./project

If you are currently in the directory you want archived, you can type:

>     % tar c .

Another way to archive the current directory is to type:

>     % tar c *

Here, the shell expands the asterisk (`*`) to the files in the current directory. However, it does not match files starting with a dot (.), which is why the previous technique is preferred.

This causes a problem when restoring a directory from a tar archive. You may not know whether an archive was created using . or the directory name.

I always check the names of the files before restoring an archive:

>     % tar t

If the archive loads the files into the current directory, I create a new directory, change to it, and extract the files.

If the archive restores the directory by name, then I restore the files into the current directory.

### 38.6.1. Restoring a Few Files

If you want to restore a single file, get the pathname of the file as tar knows it, using the t flag. You must specify the exact filename, because filename and ./filename are not the same to tar. You can combine these two steps into one command by using:

>     % tar xvf /dev/rst0 `tar tf /dev/rst0 | grep filename`

Note that this may run very slowly, though, as the entire tar file has to be read once (and the tape rewound) before any restoration can happen. Be careful: you may also get a lot more than you expected; for example, if you're looking for README using this technique, you'd also get README.Solaris and everything in the doc/READMEs directory, possibly overwriting files you wanted to keep.

Whenever you use tar to restore a directory, you must always specify some filename. If none is specified, no files are restored.

There is still the problem of restoring a directory whose pathname starts with a slash (`/`). Because tar restores a file to the pathname specified in the archive, you cannot change where the file will be restored. The danger is that either you may overwrite some existing files or you will not be able to restore the files because you don't have permission.

You can ask the system administrator to rename a directory and temporarily create a symbolic link pointing to a directory where you can restore the files. Other solutions exist, including editing the tar archive and creating a new directory structure with a C program executing the chroot(2) system call. Another solution is to use GNU tar (Section 39.3), which allows you to remap pathnames starting with slash (`/`). It also allows you to create archives that are too large for a single tape, incremental archives, and a dozen other advantages.

But the best solution is never to create an archive of a directory that starts with slash (`/`) or tilde (`~`) (Section 31.11) (since the shell will expand `~` into an absolute path that starts with a `/`).

### 38.6.2. Remote Restoring

To restore a directory from a remote host, use the following command:

`rsh` Section 1.21

>     % rsh -n host dd if=/dev/rst0 bs=20b | tar xvBfb - 20 files

This runs dd on the remote host, reading from /dev/rst0 with a blocksize of twenty blocks, and pipes it to a local tar. It is difficult to read fixed-size blocks over a network. This is why tar uses the B flag to force it to read from the pipe until a block is completely filled. Some versions of tar, including GNU tar, handle remote drives automatically (Section 38.8).

-- BB

Copyright © 2003 O'Reilly & Associates. All rights reserved.