This appendix provides several recipes for performing common tasks using GNUTAR.

Copying directory hierarchies
=============================

This is a traditional way to copy a directory hierarchy preserving the dates, modes, owners and link-structure of all the files therein. It was used back when the cp command lacked the -a option:

     $ (cd sourcedir; tar -cf - .) | (cd targetdir; tar -xf -)

You can avoid subshells by using -C option:

     $ tar -C sourcedir -cf - . | tar -C targetdir -xf -

The same command using long option forms:

     $ (cd sourcedir; tar --create --file=- . ) \
            | (cd targetdir; tar --extract --file=-)

or

     $ tar --directory sourcedir --create --file=- . \
            | tar --directory targetdir --extract --file=-

Restoring Intermediate Directories
==================================

A common concern is how to extract permissions and ownerships of intermediate directories when extracting only selected members from the archive.  To illustrate this, consider the following archive:

     # tar tvf A.tar
     drwxr-xr-x root/root         0 2017-11-16 14:39 foo/
     dr-xr-x--- gray/user         0 2017-11-16 14:39 foo/bar/
     -rw-r--r-- gray/user        10 2017-11-16 14:40 foo/bar/file

Suppose you extract only the file foo/bar/file, while being root:

     # tar xvf A.tar foo/bar/file
     foo/bar/file

Now, let's inspect the content of the created directories:

     # find foo -ls
     427257    0 drwxr-xr-x   3 root     root    16 Nov 17 16:10 foo
     427258    0 drwxr-xr-x   2 root     root    17 Nov 17 16:10 foo/bar
     427259    0 -rw-r--r--   1 gray     user    10 Nov  6 14:40 foo/bar/file

The requested file is restored, including its ownership and permissions. The intermediate directories, however, are created with the default permissions, current timestamp and owned by the current user. This is because by the time tar has reached the requested file, it had already skipped the entries for its parent directories, so it has no iformation about their ownership and modes.

To restore meta information about the intermediate directories, you'll need to specify them explicitly in the command line and use the --no-recursive option (see recurse) to avoid extracting their content.

To automate this process, Neal P. Murphy proposed the following shell script (The original version of the script can be seen at http://lists.gnu.org/archive/html/bug-tar/2016-11/msg00024.html):

     #! /bin/sh
     (while read path
      do
        path=`dirname $path`
        while [ -n "$path" -a "$path" != "." ]
        do
          echo $path
          path=`dirname $path`
        done
      done < $2 | sort | uniq) |
      tar -x --no-recursion -v -f $1 -T - -T $2

The script takes two arguments: the name of the archive file, and the name of the file list file.

To complete our example, the file list will contain single line:

     foo/bar/file

Supposing its name is file.list and the script is named restore.sh, you can invoke it as follows:

     # sh restore.sh A.tar file.list