Unix Power Tools
by Jerry Peek
Telling tar Which Files to Exclude or Include
On some systems,
creates filenames starting with a
to keep track of dependencies.
Various editors create backup files whose names end with a
percent sign (%)
I often keep the original copy of a program with the
extension and old versions with a
I often don't want to save these files on my backups. There may be some binary files that I don't want to archive, but don't want to delete either.
A solution is to use the
tar manual page for the
FF options, too.
- JIK ]
This flag specifies that the matching argument to
is the name of a file that lists files to exclude from the archive.
Here is an example:
In this example,
find lists all files in the
directories, but does not print the directory names explicitly. If
you have a directory name in an excluded list, it will also exclude
all the files inside the directory.
egrep is then used
as a filter to exclude certain files from the archive. Here,
egrep is given several regular expressions to match
certain files. This expression seems complex but is simple once you
understand a few special characters:
A breakdown of the patterns and examples of the files that match these patterns is given here:
Instead of specifying which files are to be excluded, you can
specify which files to archive using the
- I option. As
with the exclude flag, specifying a directory tells
to include (or exclude) the entire directory. You should also note
that the syntax of the
- I option is different from the
tar flag. The next example archives all C files
and makefiles. It uses
egrep's () grouping operators to make the $ anchor character apply to all patterns inside
I suggest using
find to create the include or exclude
file. You can edit it afterward, if you wish. One caution: extra
spaces at the end of any line will cause that file to be ignored.
One way to debug the output of the
find command is to
/dev/null as the output file:
Including Other Directories
There are times when you want to make an archive of several
directories. You may want to archive a source directory and another
/usr/local. The natural, but wrong, way
to do this is to use the command:
The proper way to handle the incorrect example above is to use the
- C flag:
This will archive
Type Pathnames Exactly
For the above options to work when you extract files from an archive, the pathname given in the include or exclude file must exactly match the pathname on the tape.
Here's a sample run.
I'm extracting from a file named
Of course, this example applies to tapes, too:
Next, I create an exclude file, named
contains the lines:
Now, I run the following
Exclude the Archive File!
If you're archiving the current directory (.) instead of starting at a subdirectory,
remember to start with two pathnames in the
the archive that
tar creates and the
file itself. That keeps
tar from trying to archive its
In that example, we used
cat > to create the file
quickly; you could use a text editor instead. Notice that the
pathnames in the
Exclude file start with ./; that's what the
expects when you tell it to archive the current directory (.). The long
egrep command line uses the
>> operator to add other pathnames to the end of
Or, instead of adding the archive and exclude file's pathnames to the
exclude file, you can move those two files somewhere out of the
directory tree that
tar will read.