3962 lines
144 KiB
Plaintext
3962 lines
144 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
|
@c %**start of header
|
|
@setfilename tar.info
|
|
@settitle The Tar Manual: DRAFT
|
|
@setchapternewpage odd
|
|
@c %**end of header
|
|
|
|
@c Note: the edition number and date is listed in *two* places; please update.
|
|
@c subtitle and top node; search for !!set
|
|
|
|
@c Search for comments marked with !! or <<< (or >>>)
|
|
|
|
@c <<< CONVENTIONS: this manual refers to "ordinary files" , "directory
|
|
files" (or "directories"), "archive files", "archive members", and
|
|
various I/O devices (which have names and file names).>>>
|
|
|
|
@c <<< it's "file name" (not filename) unless we are talking about an
|
|
argument, ie. @var{file-name}. also, you "use" a "file-name argument"
|
|
to "specify" a "file".>>>
|
|
|
|
@c <<< @code{tar} is always lower case, in bold. >>>
|
|
|
|
@c <<< it's "operations of tar", "options to tar" also, it's " @samp{tar
|
|
+foo}" or "the @samp{+foo} operation". MIB doesn't like using
|
|
operations and options as separate concepts. I disagree --- would be a
|
|
mess to explain otherwise
|
|
|
|
@c <<< (don't forget to comment these out in final draft) -ringo
|
|
|
|
@c <<< please dont' change this without sending me e-mail. some things
|
|
@c are in progress or waiting to be edited in hardcopy. -ringo
|
|
@c smallbook
|
|
|
|
@iftex
|
|
@c finalout
|
|
@end iftex
|
|
|
|
@ifinfo
|
|
This file documents @code{tar}, a utility used to store, backup, and
|
|
transport files.
|
|
|
|
Copyright (C) 1992 Free Software Foundation, Inc. DRAFT!
|
|
@c Need to put distribution information here when ready.
|
|
@end ifinfo
|
|
|
|
@c !!set edition number and date here
|
|
@titlepage
|
|
@title @code{tar}
|
|
@subtitle The GNU Tape Archiver
|
|
@subtitle Edition 0.01, for @code{tar} Version 1.10
|
|
@subtitle @today{}
|
|
@c remove preceding today line when ready
|
|
@sp 1
|
|
@subtitle DRAFT
|
|
@c subtitle insert month here when ready
|
|
|
|
@author Amy Gorin and Jay Fenlason
|
|
@c <<<best to have hack read this over and see if anything is left he
|
|
@c wrote. I don't think so. -ringo>>>>
|
|
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
Copyright @copyright{} 1992 Free Software Foundation, Inc.
|
|
|
|
@sp 2
|
|
This draft is not yet ready for distribution.
|
|
@end titlepage
|
|
|
|
@ifinfo
|
|
@node Top, Introduction, (dir), (dir)
|
|
@top @code{tar}
|
|
|
|
This file documents @code{tar}, a utility used to store, backup, and
|
|
transport files.
|
|
|
|
@c !!set edition number and date here
|
|
This is DRAFT Edition 0.01 of the @code{tar} documentation, @today{}, for @code{tar}
|
|
version 1.12.
|
|
@end ifinfo
|
|
|
|
@c <<< The menus need to be gone over, and node names fixed.
|
|
@menu
|
|
* Introduction:: @code{tar}: The GNU Tape Archiver
|
|
* Invoking @code{tar}:: How to invoke @code{tar}
|
|
* Tutorial:: Getting started
|
|
* Wizardry:: Some More Advanced Uses for @code{tar}
|
|
* Archive Structure:: The structure of an archive
|
|
* Reading and Writing:: Reading and writing archives
|
|
* Insuring Accuracy:: How to insure the accuracy of an archive
|
|
* Selecting Archive Members:: How to select archive members
|
|
* User Interaction:: How @code{tar} interacts with people.
|
|
* Backups and Restoration:: How to restore files and perform backups
|
|
* Media:: Using tapes and other archive media
|
|
* Quick Reference:: A quick reference guide to
|
|
@code{tar} operations and options
|
|
* Data Format Details:: Details of the archive data format
|
|
* Concept Index:: Concept Index
|
|
@end menu
|
|
|
|
@node Introduction, Invoking @code{tar}, Top, Top
|
|
@chapter @code{tar}: The GNU Tape Archiver
|
|
|
|
You can use @code{tar} to create an @dfn{archive}---a single file
|
|
which contains other file's contents as well as a listing of those
|
|
files' characteristics. You can also use @code{tar} to read, add to,
|
|
or manipulate already existing archives. Because an archive created
|
|
by @code{tar} is capable of preserving file information and directory
|
|
structure, @code{tar} is ideal for performing full and incremental
|
|
backups, as well as for transferring groups of files between disks and
|
|
over networks.
|
|
|
|
Despite the utility's name, which comes from the words @samp{T(ape)}
|
|
@samp{AR(chiver)}, @code{tar}'s output can be directed to any
|
|
available device. For instance, @code{tar} archives can be stored in
|
|
a file or sent to another program via a pipe.
|
|
|
|
@c <<< this menu will conflict with menu above in info mode. -ringo
|
|
@menu
|
|
* Invoking @code{tar}:: How to invoke @code{tar} and specify arguments.
|
|
* Tutorial:: An introduction to @code{tar}.
|
|
* Operations:: What you can use @code{tar} to do.
|
|
* Options:: How to change the way @code{tar} behaves.
|
|
* Problems:: Common problems with @code{tar}.
|
|
@end menu
|
|
|
|
@node Invoking @code{tar}, Tutorial, Introduction, Top
|
|
@chapter How To Invoke @code{tar}
|
|
|
|
You can use @code{tar} to store files in an archive, to extract them
|
|
from an archive, and to do other types of archive manipulation. The
|
|
primary argument to @code{tar}, which is called the @dfn{operation},
|
|
specifies which action to take. The other arguments to @code{tar} are
|
|
either @dfn{options}, which change the way @code{tar} performs an
|
|
operation, or @dfn{file-names}, which specify the files @code{tar} is
|
|
to act on. The typical @code{tar} command line syntax is:
|
|
|
|
@example
|
|
@code{tar} @var{operation} [@var{options}...] [@var{file-names}...]
|
|
@end example
|
|
|
|
Note: You can actually type in arguments in any order. In this manual
|
|
the operation is always first, the options second and the file-name
|
|
arguments last, to make examples easier to understand.
|
|
|
|
@menu
|
|
* Argument Functions:: The Functions of Arguments
|
|
* Argument Form:: The Forms of Arguments
|
|
* Old Syntax for Commands:: An Old, but Still Supported, Syntax
|
|
for @code{tar} Commands
|
|
@end menu
|
|
|
|
@node Argument Functions, Argument Form, Invoking @code{tar}, Invoking @code{tar}
|
|
@section The Functions of Arguments
|
|
|
|
The primary argument to @code{tar} is the @dfn{operation}, which
|
|
specifies what @code{tar} does. @code{tar} can be used to:
|
|
|
|
@itemize
|
|
@item
|
|
Add files to an existing archive (@samp{+add-file}, @samp+{append} or
|
|
@samp{-r})
|
|
|
|
@item
|
|
Compare files in an archive with files in the file system
|
|
(@samp{+compare}, @samp{+diff} or @samp{-d})
|
|
@c !!! is diff still working?? --- yes -ringo
|
|
|
|
@item
|
|
Add archives to another archive (@samp{+add-archive}, @samp{+catenate}
|
|
or @samp{-A})
|
|
@c was +concatenate. -ringo
|
|
|
|
@item
|
|
Create an archive (@samp{+create} or @samp{-c})
|
|
|
|
@item
|
|
Delete files from an archive (@samp{+delete})
|
|
@c -D should have been removed -ringo
|
|
|
|
@item
|
|
Extract files from an archive (@samp{+extract}, @samp{+get} or @samp{-x})
|
|
|
|
@item
|
|
List the files in an archive (@samp{+list} or @samp{-t})
|
|
|
|
@item
|
|
Update an archive by appending newer versions of already stored files
|
|
(@samp{+update} or @samp{-u})
|
|
@end itemize
|
|
|
|
@xref{Reading and Writing}, for more information about these
|
|
operations.
|
|
|
|
@dfn{Option} arguments to @code{tar} change details of the operation,
|
|
such as archive format, archive name, or level of user interaction.
|
|
You can specify more than one option. All options are optional.
|
|
|
|
@dfn{File-name} arguments specify which files (including directory
|
|
files) to archive, extract, delete or otherwise operate on.
|
|
|
|
If you don't use any file-name arguments, @samp{+add-file},
|
|
@samp{+update} and @samp{+delete} will do nothing. The other
|
|
operations of @code{tar} will act on defaults.
|
|
|
|
When you use a file-name argument to specify a directory file,
|
|
@code{tar} acts on all the files in that directory, including
|
|
sub-directories.
|
|
|
|
@node Argument Form, Old Syntax for Commands, Argument Functions, Invoking @code{tar}
|
|
@section The Forms of Arguments
|
|
|
|
Most operations of @code{tar} have a single letter form (a single
|
|
letter preceded by a @samp{-}), and at least one mnemonic form (a
|
|
word or abbreviation preceded by a @samp{+}). The forms are
|
|
identical in function. For example, you can use either @samp{tar -t}
|
|
or @samp{tar +list} to list the contents of an archive
|
|
|
|
Options, like operations, have both single letter and mnemonic forms.
|
|
Options, however, may also incorporate an argument. Single letter
|
|
options are separated from their arguments by a space. Mnemonic
|
|
options are separated from their arguments by an @samp{=} sign. For
|
|
example, to create an an archive file named @file{george}, use either
|
|
@samp{tar +create +file=george} or @samp{tar +create -f george}. Both
|
|
@samp{+file=@var{archive-name}} and @samp{-f @var{archive-name}}
|
|
denote the option to give the archive a non-default name, which in the
|
|
example is @samp{george}.
|
|
|
|
You can mix single letter and mnemonic forms in the same command. You
|
|
could type the above example as @samp{tar -c +file=george} or
|
|
@samp{tar +create -f george}. However, @code{tar} operations and
|
|
options are case sensitive. You would not type the above example as
|
|
@samp{tar -C +file=george}, because @samp{-C} is an option that causes
|
|
@code{tar} to change directories, not an operation that creates an
|
|
archive.
|
|
|
|
File-name arguments are the names of files (including directories).
|
|
These names can be specified on the command line or read from a text
|
|
file in the file system (using the @samp{+files-from} option). Files
|
|
stored in an archive are called @dfn{archive members}. The operations
|
|
@samp{+delete}, @samp{+extract}, @samp{+list}, @samp{+compare} and
|
|
@samp{+update} take the names of archive members as file-name
|
|
arguments. The other operations take the names of files in the file
|
|
system.
|
|
|
|
@code{tar} interprets relative file names as being relative to the
|
|
working directory. @code{tar} will make all file names relative (by
|
|
removing leading @samp{/}s when archiving or restoring files), unless
|
|
you specify otherwise (using the @samp{+absolute-paths} option).
|
|
@xref{File Name Interpretation}, for more information about
|
|
@samp{+absolute-paths}.
|
|
@c >>> yet another node name that is probably wrong.
|
|
|
|
@node Old Syntax for Commands, , Argument Form, Invoking @code{tar}
|
|
@section An Old, but Still Supported, Syntax for @code{tar} Commands
|
|
|
|
For historical reasons, GNU @code{tar} also accepts a syntax for
|
|
commands which splits options that include arguments into two parts.
|
|
That syntax is of the form:
|
|
|
|
@example
|
|
@code{tar} @var{operation}[@var{option-letters}...] [@var{option-arguments}...] [@var{file-names}...]@refill
|
|
@end example
|
|
|
|
@noindent
|
|
where arguments to the options appear in the same order as the letters
|
|
to which they correspond, and the operation and all the option letters
|
|
appear as a single argument, without separating spaces.
|
|
|
|
This command syntax is useful because it lets you type the single
|
|
letter forms of the operation and options as a single argument to
|
|
@code{tar}, without writing preceding @samp{-}s or inserting spaces
|
|
between letters. @samp{tar cv} or @samp{tar -cv} are equivalent to
|
|
@samp{tar -c -v}.
|
|
|
|
This old style syntax makes it difficult to match option letters with
|
|
their corresponding arguments, and is often confusing. In the command
|
|
@samp{tar cvbf 20 /dev/rmt0}, for example, @samp{20} is the argument
|
|
for @samp{-b}, @samp{/dev/rmt0} is the argument for @samp{-f}, and
|
|
@samp{-v} does not have a corresponding argument. The modern
|
|
syntax---@samp{tar -c -v -b 20 -f /dev/rmt0}---is clearer.
|
|
|
|
@node Tutorial, Wizardry, Invoking @code{tar}, Top
|
|
@chapter Getting Started With @code{tar}
|
|
|
|
This chapter guides you through some basic examples of @code{tar}
|
|
operations. In the examples, the lines you should type are preceded
|
|
by a @samp{%}, which is a typical shell prompt. We use mnemonic forms
|
|
of operations and options in the examples, and in discussions in the
|
|
text, but short forms produce the same result.
|
|
|
|
@menu
|
|
* Creating Archives:: Creating Archives
|
|
* Extracting Files:: Extracting Files from an Archive
|
|
* Listing Archive Contents:: Listing the Contents of an Archive
|
|
* Comparing Files:: Comparing Archives with the File System
|
|
* Adding to Archives:: Adding Files to Existing Archives
|
|
* Concatenate:: Concatenating Archives
|
|
* Deleting Files:: Deleting Files From an Archive
|
|
@end menu
|
|
|
|
@node Creating Archives, Listing Archive Contents, Tutorial, Tutorial
|
|
@section Creating Archives
|
|
|
|
To create a new archive, use @code{tar +create} (or @code{tar -c}).
|
|
You can use options to specify the name and format of the archive (as
|
|
well as other characteristics), and you can use file-name arguments to
|
|
specify which files to put in the archive. If you don't use any
|
|
options or file-name arguments, @code{tar} will use default values.
|
|
@xref{Creating Example}, for more information about the @samp{+create}
|
|
operation.
|
|
|
|
@menu
|
|
* Creating Example:: Creating Archives of Files
|
|
* Subdirectory:: Creating an Archive of a Subdirectory
|
|
@end menu
|
|
|
|
@node Creating Example, Subdirectory, Creating Archives, Creating Archives
|
|
@subsection Creating Archives of Files
|
|
|
|
This example shows you how to create an archive file in the working
|
|
directory containing other files in the working directory. The three
|
|
files you archive in this example are called @file{blues},
|
|
@file{folk}, and @file{jazz}. The archive file is called
|
|
@file{records}. While the archive in this example is written to the
|
|
file system, it could also be written to any other device.
|
|
|
|
(If you want to follow along with this and future examples, create a
|
|
directory called @file{practice} containing files called @file{blues},
|
|
@file{folk} and @file{jazz}. To create the directory, type
|
|
@samp{mkdir practice} at the system prompt. It will probably be
|
|
easiest to create the files using a text editor, such as Emacs.)
|
|
|
|
First, change into the directory containing the files you want to
|
|
archive:
|
|
|
|
@example
|
|
% cd practice
|
|
@end example
|
|
|
|
@noindent
|
|
@file{~/practice} is now your working directory.
|
|
|
|
Then, check that the files to be archived do in fact exist in the
|
|
working directory, and make sure there isn't already a file in the
|
|
working directory with the archive name you intend to use. If you
|
|
specify an archive file name that is already in use, @code{tar} will
|
|
overwrite the old file and its contents will be lost.
|
|
|
|
To list the names of files in the working directory, type:
|
|
|
|
@example
|
|
% ls
|
|
@end example
|
|
|
|
The system responds:
|
|
|
|
@example
|
|
blues folk jazz
|
|
%
|
|
@end example
|
|
|
|
@noindent
|
|
Then,
|
|
@itemize @bullet
|
|
@item
|
|
Create a new archive (@samp{tar -c} or @samp{tar +create})
|
|
|
|
@item
|
|
Explicitly name the archive file being created (@samp{-f
|
|
@var{archive-name}} or @samp{+file=@var{archive-name}}). If you don't
|
|
use this option @code{tar} will write the archive to the default
|
|
storage device, which varies from system to system.
|
|
@c <<< this syntax may change. OK now---check before printing -ringo
|
|
|
|
@code{tar} interprets archive file names relative to the working
|
|
directory. Make sure you have write access to the working directory
|
|
before using @code{tar}.
|
|
|
|
@item
|
|
Specify which files to put into the archive (@code{tar} interprets
|
|
file names relative to the working directory). If you don't use any
|
|
@var{file-name} arguments, @code{tar} will archive everything in the
|
|
working directory.
|
|
@end itemize
|
|
|
|
@noindent
|
|
Type:
|
|
@example
|
|
% tar +create +file=records blues folk jazz
|
|
@end example
|
|
|
|
@noindent
|
|
If you now list the contents of the working directory (@samp{ls}), you
|
|
will find the archive file listed as well as the files you saw
|
|
previously.
|
|
|
|
@example
|
|
% ls
|
|
blues folk jazz records
|
|
%
|
|
@end example
|
|
|
|
@menu
|
|
* Listing Files:: Listing files in an archive
|
|
* Verbose:: Using @code{tar} in Verbose Mode
|
|
@end menu
|
|
|
|
@node Listing Files, Verbose, Creating Example, Creating Example
|
|
@subsubsection Listing files in an archive
|
|
|
|
You can list the contents of an archive with another operation of
|
|
@code{tar}---@samp{+list} or @samp{-l}. To list the contents of the
|
|
archive you just created, type:
|
|
|
|
@example
|
|
% tar +list +file=records
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} will respond:
|
|
|
|
@example
|
|
blues folk jazz
|
|
@end example
|
|
|
|
@xref{Listing Archive Contents}, for a more detailed tutorial of the
|
|
@samp{+list} operation. @xref{Listing Contents}, for more information
|
|
about the @samp{+list} operation.
|
|
|
|
@node Verbose, , Listing Files, Creating Example
|
|
@subsubsection Using @code{tar} in Verbose Mode
|
|
|
|
If you include the @samp{+verbose} or @samp{-v} option on the command
|
|
line, @code{tar} will list the files it is acting on as it is working.
|
|
In verbose mode, the creation example above would appear as:
|
|
@cindex Verbose mode example
|
|
@findex -v (verbose mode example)
|
|
|
|
@example
|
|
% tar +create +file=records +verbose blues folk jazz
|
|
blues
|
|
folk
|
|
jazz
|
|
@end example
|
|
|
|
@noindent
|
|
The first line is the command typed in by the user. The remaining
|
|
lines are generated by @code{tar}. In the following examples we
|
|
usually use verbose mode, though it is almost never required.
|
|
|
|
@node Subdirectory, Changing, Creating Example, Creating Archives
|
|
@subsection Creating an Archive of a Subdirectory
|
|
|
|
You can store a directory in an archive by using the directory name as
|
|
a file-name argument to @code{tar}. When you specify a directory
|
|
file, @code{tar} archives the directory file and all the files it
|
|
contains. The names of the directory and the files it contains are
|
|
stored in the archive relative to the current working directory---when
|
|
the directory is extracted they will be written into the file system
|
|
relative to the working directory at that time.
|
|
@c <<< add an xref to +absolute-paths -ringo
|
|
|
|
To archive a directory, first move to its superior directory. If you
|
|
have been following the tutorial, you should type:
|
|
|
|
@example
|
|
% cd ..
|
|
%
|
|
@end example
|
|
|
|
Once in the superior directory, specify the subdirectory using a
|
|
file-name argument. To store the directory file @file{~/practice} in
|
|
the archive file @file{music}, type:
|
|
|
|
@example
|
|
% tar +create +verbose +file=music practice
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} should respond:
|
|
|
|
@example
|
|
practice/
|
|
practice/blues
|
|
practice/folk
|
|
practice/jazz
|
|
practice/records
|
|
@end example
|
|
|
|
Note that @file{~/practice/records}, another archive file, has
|
|
itself been archived. @code{tar} will accept any file as a file to be
|
|
archived, even an archive file.
|
|
|
|
@c >>> symbolic links and changing directories are now in main body, not in
|
|
@c >>> tutorial. -ringo
|
|
|
|
@node Extracting Files
|
|
@section Extracting Files from an Archive
|
|
|
|
Creating an archive is only half the job---there would be no point in
|
|
storing files in an archive if you couldn't retrieve them. To extract
|
|
files from an archive, use the @samp{+extract} or @samp{-x} operation.
|
|
|
|
To extract specific files, use their names as file-name arguments. If
|
|
you use a directory name as a file-name argument, @code{tar} extracts
|
|
all the files (including subdirectories) in that directory. If you
|
|
don't use any file-name arguments, @code{tar} extracts all the files
|
|
in the archive.
|
|
|
|
Note: @code{tar} will extract an archive member into the file system
|
|
without checking to see if there is already a file with the archive
|
|
member's file name. If there is a file with that name, @code{tar}
|
|
will @strong{overwrite} that file and its contents will be lost.
|
|
@c <<<xref keep-old -ringo
|
|
|
|
@node Extracting Specific Files, , ,
|
|
@subsection Extracting Specific Files
|
|
|
|
To extract specific files, specify them using file-name arguments.
|
|
|
|
In an example above, you created the archive file
|
|
@file{~/practice/records}, which contained the files @file{blues},
|
|
@file{folk} and @file{jazz} in the @file{practice} directory. If, for
|
|
some reason, you were to lose one of those text files (@samp{rm
|
|
~/practice/blues}), you could extract it from the archive file.
|
|
|
|
First, change into the @file{practice} directory. Then,
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Invoke @code{tar} and specify the @samp{+extract} operation
|
|
(@samp{+extract}, @samp{+get} or @samp{-x})
|
|
|
|
@item
|
|
Specify the archive that the files will be extracted from
|
|
(@samp{+file=@var{archive-name}} or @samp{-f @var{archive-name}})
|
|
|
|
@item
|
|
Specify the files to extract, using file-name arguments (if you don't
|
|
specify any files, @code{tar} extracts all the archive members)
|
|
@end itemize
|
|
|
|
@example
|
|
% tar +extract +file=records blues
|
|
@end example
|
|
|
|
If you list the contents of the directory, you will see that
|
|
@file{blues} is back:
|
|
|
|
@example
|
|
% ls
|
|
folk
|
|
jazz
|
|
records
|
|
blues
|
|
@end example
|
|
|
|
@node Extracting Directories, , ,
|
|
@subsection Extracting Directories
|
|
|
|
To extract a directory and all the files it contains, use the
|
|
directory's name as a file-name argument in conjunction with @samp{tar
|
|
+extract}. Remember---@code{tar} stores and extracts file names
|
|
relative to the working directory.
|
|
|
|
In a previous example you stored the directory @file{~/practice} in
|
|
the archive file @file{~/music}. If you delete the contents of
|
|
@file{practice}, you can restore them using @code{tar}.
|
|
|
|
First, change into the @file{practice} subdirectory (@samp{cd
|
|
~/practice}). Then, remove all the files in @samp{~/practice}
|
|
(@samp{rm *}). If you list the contents of the directory, you should
|
|
now see that it is empty:
|
|
|
|
@example
|
|
%ls
|
|
%
|
|
@end example
|
|
|
|
@noindent Let's try to restore the contents of @file{practice} by extracting
|
|
them from the archive file @file{~/music}:
|
|
|
|
@example
|
|
tar +extract +file=~/music practice
|
|
@end example
|
|
|
|
@noindent Now, list the contents of @file{practice} again:
|
|
|
|
@example
|
|
%ls
|
|
practice
|
|
@end example
|
|
|
|
What happened to the files? When you created @file{~/music}, your
|
|
working directory was your home directory. When you extracted
|
|
@file{~/music}, your working directory was @file{~/practice}.
|
|
@code{tar} stored the files in @file{practice} relative to your home
|
|
directory, and then extracted them relative to @file{~/practice}. The
|
|
files are now in a new subdirectory, called
|
|
@file{~/practice/practice}.
|
|
|
|
To restore your files to their old positions, delete the new directory
|
|
and its contents, and then redo the example above with your home
|
|
directory as the working directory:
|
|
|
|
@example
|
|
% rm ~/practice/practice/*
|
|
% rmdir practice
|
|
% cd ..
|
|
% tar +extract +file=music practice
|
|
@end example
|
|
|
|
@noindent (@code{tar} will report that it is unable to create the
|
|
directory @file{~/practice} because it already exists. This will not
|
|
effect the extraction of the other archive members.)
|
|
|
|
@node Listing Archive Contents, Adding to Archives, Creating Archives, Tutorial
|
|
@section Listing the Contents of an Archive
|
|
|
|
Use @samp{+list} or @samp{-t} to print the names of files stored in an
|
|
archive. If you use file-name arguments with this operation,
|
|
@code{tar} prints the names of the specified files if they are stored
|
|
in the archive. If you use a directory name as a file-name argument,
|
|
@code{tar} also prints the names of all underlying files, including
|
|
sub-directories. If you use no file-name arguments, @code{tar} prints
|
|
the names of all the archive members.
|
|
|
|
You can use @samp{+list} with the @samp{+verbose} option to print
|
|
archive members' attributes (owner, size, etc.).
|
|
|
|
@menu
|
|
* Listing names:: Listing the names of stored files
|
|
* Additional File Info:: Getting Additional File Information
|
|
* Specific File:: List A Specific File in an Archive
|
|
* Listing Directories:: Listing the Contents of a Stored Directory
|
|
@end menu
|
|
|
|
@node Listing names, Additional File Info, Listing Archive Contents, Listing Archive Contents
|
|
@subsection Listing the names of stored files
|
|
|
|
To list the names of files stored in an archive, use the @samp{+list}
|
|
operation of @code{tar}.
|
|
|
|
In a previous example, you created the archive @file{~/music}. To
|
|
list the contents of @file{music}, while in your home directory:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
List the contents of an archive (@samp{tar -t} or @samp{tar +list})
|
|
|
|
@item
|
|
Specify the archive to be listed (@samp{-f @var{archive-name}} or
|
|
@samp{+file=@var{archive-name}}) @refill
|
|
@end itemize
|
|
|
|
Thus:
|
|
|
|
@example
|
|
% tar +list +file=music
|
|
practice/
|
|
practice/blues
|
|
practice/folk
|
|
practice/jazz
|
|
practice/records
|
|
@end example
|
|
|
|
@node Additional File Info, Specific File, Listing names, Listing Archive Contents
|
|
@subsection Listing Additional File Information
|
|
|
|
To get more information when you list the names of files stored in an
|
|
archive, specify the @samp{+verbose} option in conjunction with
|
|
@samp{tar +list}. @code{tar} will print archive member's file
|
|
protection, owner and group ID, size, and date and time of creation.
|
|
|
|
For example:
|
|
|
|
@example
|
|
% tar +list +verbose +file=music
|
|
drwxrwxrwx myself/user 0 May 31 21:49 1990 practice/
|
|
-rw-rw-rw- myself/user 42 May 21 13:29 1990 practice/blues
|
|
-rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk
|
|
-rw-rw-rw- myself/user 40 May 21 13:30 1990 practice/jazz
|
|
-rw-rw-rw- myself/user 10240 May 31 21:49 1990 practice/records
|
|
%
|
|
@end example
|
|
|
|
Note that when you use @samp{+verbose} with @samp{+list}, @code{tar}
|
|
doesn't print the names of files as they are being acted on, though
|
|
the @samp{+verbose} option will have this effect when used with all
|
|
other operations.
|
|
|
|
@node Specific File, Comparing Files, Additional File Info, Listing Archive Contents
|
|
@subsection List A Specific File in an Archive
|
|
|
|
To to see if a particular file is in an archive, use the name of the
|
|
file in question as a file-name argument while specifying the
|
|
@samp{+list} operation. For example, to see whether the file
|
|
@file{folk} is in the archive file @file{music}, do the following:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Invoke @code{tar}, and specify the @samp{+list} operation
|
|
(@samp{+list} or @samp{-t}).
|
|
|
|
@item
|
|
Specify the archive file to be acted on (@samp{+file
|
|
@var{archive-name}} or @samp{-f @var{archive-name}}).
|
|
|
|
@item
|
|
Specify the files to look for, by typing their names as file-name
|
|
arguments. You have to type the file name as it appears in the
|
|
archive (normally, as it is relative to the relative to the directory
|
|
from which the archive was created). <<< xref absolute-paths -ringo
|
|
@end itemize
|
|
|
|
Type:
|
|
|
|
@example
|
|
% tar +list +file=music practice/folk
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} responds:
|
|
|
|
@example
|
|
practice/folk
|
|
@end example
|
|
|
|
@noindent
|
|
If the file were not stored in the archive (for example, the file
|
|
@file{practice/rock}), the example above would look like:
|
|
|
|
@example
|
|
% tar +list +file=music practice/rock
|
|
tar: practice/rock not found in archive
|
|
@end example
|
|
|
|
@noindent
|
|
If you had used @samp{+verbose} mode, the example above would look
|
|
like:
|
|
|
|
@example
|
|
% tar +list +file=music practice/folk
|
|
-rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk
|
|
@end example
|
|
|
|
@node Listing Directories, , ,
|
|
@subsection Listing the Contents of a Stored Directory
|
|
|
|
To get information about the contents of an archived directory, use
|
|
the directory name as a file-name argument in conjunction with
|
|
@samp{+list}. To find out file attributes, include the
|
|
@samp{+verbose} option.
|
|
|
|
For example, to find out about files in the directory @file{practice},
|
|
in the archive file @file{music}, type:
|
|
|
|
@example
|
|
% tar +list +file=music practice
|
|
@end example
|
|
|
|
@noindent @code{tar} responds:
|
|
|
|
@example
|
|
drwxrwxrwx myself/user 0 May 31 21:49 1990 practice/
|
|
-rw-rw-rw- myself/user 42 May 21 13:29 1990 practice/blues
|
|
-rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk
|
|
-rw-rw-rw- myself/user 40 May 21 13:30 1990 practice/jazz
|
|
-rw-rw-rw- myself/user 10240 May 31 21:49 1990 practice/records
|
|
@end example
|
|
|
|
When you use a directory name as a file-name argument, @code{tar} acts
|
|
on all the files (including sub-directories) in that directory.
|
|
|
|
@node Comparing Files, , ,
|
|
@section Comparing Files in an Archive with Files in the File System
|
|
|
|
To compare the attributes of archive members with the attributes of
|
|
their counterparts in the file system, use the @samp{+compare},
|
|
@samp{+diff}, or @samp{-d}) operation. While you could use
|
|
@samp{+list +verbose} to manually compare some file attributes, it is
|
|
simpler to have @code{tar} itself compare file attributes and report
|
|
back on file differences.
|
|
@c <<<"manually"? suggestions? -ringo
|
|
|
|
The @samp{+compare} operation, as its name implies, compares archive
|
|
members with files of the same name in the file system, and reports
|
|
back differences in file size, mode, owner and modification date.
|
|
@samp{tar +compare} acts only on archive members---it ignores files in
|
|
the file system that are not stored in the archive. If you give
|
|
@samp{tar +compare} a file-name argument that does not correspond to
|
|
the name of an archive member, @code{tar} responds with an error
|
|
message.
|
|
|
|
To compare archive members in the archive file @file{records} with
|
|
files in the @file{~/practice} directory, first change into the
|
|
@file{practice} directory. Then:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Invoke @code{tar} and specify the @samp{+compare} operation.
|
|
(@samp{+compare}, @samp{+diff}, or @samp{-d}).
|
|
|
|
@item
|
|
Specify the archive where the files to be compared are stored
|
|
(@samp{+file=@var{archive-name}} or @samp{-f @var{archive-name}})
|
|
|
|
@item
|
|
Specify the archive members to be compared. (In this example you are
|
|
comparing all the archive members in the archive. Since this is the
|
|
default, you don't need to use any file-name arguments).
|
|
@end itemize
|
|
|
|
@example
|
|
% tar +compare +file=records
|
|
%
|
|
@end example
|
|
|
|
@noindent
|
|
While it looks like nothing has happened, @code{tar} has, in fact,
|
|
done the comparison---and found nothing to report.
|
|
|
|
Use the @samp{+verbose} option to list the names of archive members as
|
|
they are being compared with their counterparts of the same name in
|
|
the file system:
|
|
|
|
@example
|
|
% tar +compare +verbose +file=records
|
|
blues
|
|
folk
|
|
jazz
|
|
%
|
|
@end example
|
|
|
|
@noindent
|
|
If @code{tar} had had anything to report, it would have done so as it
|
|
was comparing each file.
|
|
|
|
If you remove the file @file{jazz} from the file system (@samp{rm
|
|
jazz}), and modify the file @file{blues} (for instance, by adding text
|
|
to it with an editor such as Emacs), the above example would look
|
|
like:
|
|
|
|
@example
|
|
% tar +compare +verbose +file=records
|
|
blues
|
|
blues: mod time differs
|
|
blues: size differs
|
|
folk
|
|
jazz
|
|
jazz: does not exist
|
|
%
|
|
@end example
|
|
|
|
Note again that while @samp{tar +compare} reports the names of archive
|
|
members that do not have counterparts in the file system, @samp{tar
|
|
+compare} ignores files in the file system that do not have
|
|
counterparts in the archive. To demonstrate this, create a file in
|
|
the @file{practice} directory called @file{rock} (using any text
|
|
editor). The new file appears when you list the directory's contents:
|
|
|
|
@example
|
|
% ls
|
|
blues folk records rock
|
|
@end example
|
|
|
|
@noindent
|
|
If you type the @samp{+compare} example again, @code{tar} prints the
|
|
following:
|
|
|
|
@example
|
|
% tar +compare +verbose +file=records
|
|
blues
|
|
blues: mod time differs
|
|
blues: size differs
|
|
folk
|
|
jazz
|
|
jazz: does not exist
|
|
%
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} ignores the file @file{rock} because @code{tar} is
|
|
comparing archive members to files in the file system, not vice versa.
|
|
|
|
If you specify @file{rock} explicitly (using a file-name argument),
|
|
@code{tar} prints an error message:
|
|
|
|
@example
|
|
% tar +compare +verbose +file=records rock
|
|
tar: rock not found in archive
|
|
%
|
|
@end example
|
|
|
|
@menu
|
|
* Comparing Directories:: Using Compare on Directories
|
|
@end menu
|
|
|
|
@node Comparing Directories, , ,
|
|
@subsubsection Using Compare on Directories
|
|
|
|
In addition to using @samp{+compare} to compare text files, you can
|
|
use @samp{+compare} to compare directories. To illustrate this,
|
|
re-create the examples above using your home directory as the working
|
|
directory, and using the archive file @file{~/music} instead of the
|
|
archive file @file{~/practice/records}.
|
|
|
|
First, change into your home directory (@samp{cd ~}). Then, try the
|
|
above example using @file{music} as the specified archive file, and
|
|
@file{practice} as a file-name argument.
|
|
|
|
@example
|
|
% tar +compare +verbose +file=music practice
|
|
@end example
|
|
|
|
@noindent
|
|
If you have been following along with the tutorial, @code{tar} will
|
|
respond:
|
|
|
|
@example
|
|
practice
|
|
practice/blues
|
|
practice/blues: mod time differs
|
|
practice/blues: size differs
|
|
practice/folk
|
|
practice/jazz
|
|
practice/jazz: does not exist
|
|
practice/records
|
|
@end example
|
|
|
|
@node Adding to Archives, Concatenate, Listing Archive Contents, Tutorial
|
|
@section Adding Files to Existing Archives
|
|
|
|
@c >>> we want people to use the script for backups, so I an not going to
|
|
@c >>> use backups as an explanation in the tutorial. (people can still
|
|
@c >>> do it if they really want to) -ringo
|
|
|
|
While you can use @code{tar} to create a new archive every time you
|
|
want to store a file, it is more sometimes efficient to add files to
|
|
an existing archive.
|
|
|
|
To add new files to an existing archive, use the @samp{+add-file},
|
|
@samp{+append} or @samp{-r} operation. To add newer versions of
|
|
archive members to an archive, use the @samp{+update} or @samp{-u}
|
|
operation.
|
|
|
|
@menu
|
|
* Append:: Appending Files to an Archive
|
|
* Update:: Updating Files in an Archive
|
|
@end menu
|
|
|
|
@node Append, Update, Adding to Archives, Adding to Archives
|
|
@subsection Appending Files to an Archive
|
|
|
|
The simplest method of adding a file to an existing archive is the
|
|
@samp{+add-file}, @samp{-r} or @samp{+append} operation, which writes
|
|
files into the archive without regard to whether or not they are
|
|
already archive members. When you use @samp{+add-file} you must use
|
|
file-name arguments; there is no default. If you specify a file that
|
|
is already stored in the archive, @code{tar} adds another copy of the
|
|
file to the archive.
|
|
|
|
If you have been following the previous examples, you should have a
|
|
text file called @file{~/practice/rock} which has not been stored in
|
|
either the archive file @file{~/practice/records}, or the archive file
|
|
@file{~/music}. To add @file{rock} to @file{records}, first make
|
|
@file{practice} the working directory (@samp{cd practice}). Then:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Invoke @code{tar} and specify the @samp{+add-file} operation
|
|
(@samp{+add-file}, @samp{-r} or @samp{+append})
|
|
|
|
@item
|
|
Specify the archive to which the file will be added
|
|
(@samp{+file=@var{archive-name}} or @samp{-f @var{archive-name}})
|
|
|
|
@item
|
|
Specify the files to be added to the archive, using file-name
|
|
arguments
|
|
@end itemize
|
|
|
|
@noindent
|
|
For example:
|
|
|
|
@example
|
|
% tar +add-file +file=records rock
|
|
@end example
|
|
|
|
@noindent
|
|
If you list the archive members in @file{records}, you will see that
|
|
@file{rock} has been added to the archive:
|
|
|
|
@example
|
|
% tar +list +file=records
|
|
blues
|
|
folk
|
|
jazz
|
|
rock
|
|
@end example
|
|
|
|
@c <<< this should be some kind of node.
|
|
|
|
You can use @samp{+add-file} to keep archive members current with
|
|
active files. Because @samp{+add-file} stores a file whether or not
|
|
there is already an archive member with the same file name, you can
|
|
use @samp{+add-file} to add newer versions of archive members to an
|
|
archive. When you extract the file, only the version stored last will
|
|
wind up in the file system. Because @samp{tar +extract} extracts
|
|
files from an archive in sequence, and overwrites files with the same
|
|
name in the file system, if a file name appears more than once in an
|
|
archive the last version of the file will overwrite the previous
|
|
versions which have just been extracted.
|
|
|
|
If you recall from the examples using @samp{+compare} above,
|
|
@file{blues} was changed after the archive @file{records} was created.
|
|
It is simple, however, to use @samp{+add-file} to add the new version
|
|
of @file{blues} to @file{records}:
|
|
|
|
@example
|
|
% tar +add-file +verbose +file=records blues
|
|
blues
|
|
@end example
|
|
|
|
@noindent
|
|
If you now list the contents of the archive, you will obtain the following:
|
|
|
|
@example
|
|
% tar +list -f records
|
|
blues
|
|
folk
|
|
jazz
|
|
rock
|
|
blues
|
|
@end example
|
|
|
|
@noindent
|
|
The newest version of @file{blues} is at the end of the archive. When
|
|
the files in @file{records} are extracted, the newer version of
|
|
@file{blues} (which has the same name as the older) will overwrite the
|
|
version stored first. When @samp{tar +extract} is finished, only the
|
|
newer version of @file{blues} is in the file system. <<<xref
|
|
keep-old-files>>>
|
|
|
|
@node Update, , Append, Adding to Archives
|
|
@subsection Updating Files in an Archive
|
|
|
|
To keep archive members up to date with their counterparts of the same
|
|
name in the file system, use the @samp{+update} or @samp{-u}
|
|
operation. @samp{tar +update} adds a specified file to an archive if
|
|
no file of that name is already stored in the archive. If there is
|
|
already an archive member with the same name, @code{tar} checks the
|
|
modification date of the archive member, and adds the file only if its
|
|
modification date is later. If a file is stored in the archive but no
|
|
longer exists under the same name in the active file system,
|
|
@code{tar} reports an error.
|
|
|
|
You could use the @samp{+add-file} option to keep an archive current,
|
|
but do so you would either have to use the @samp{+compare} and
|
|
@samp{+list} options to determine what files needed to be re-archived
|
|
(which could waste a lot of time), or you would have to be willing to
|
|
add identical copies of already archived files to the archive (which
|
|
could waste a lot of space).
|
|
|
|
You must use file-name arguments with the @samp{+update}
|
|
operation---if you don't specify any files, @code{tar} won't act on
|
|
any files.
|
|
|
|
To see the @samp{+update} option at work, create a new file,
|
|
@file{~/practice/classical}, and modify the file
|
|
@file{~/practice/blues} (you can use a text editor, such as Emacs, to
|
|
do both these things). Then, with @file{practice} as your working
|
|
directory, invoke @samp{tar +update} using the names of all the files
|
|
in the practice directory as file-name arguments, and specifying the
|
|
@samp{+verbose} option:
|
|
|
|
@example
|
|
% tar +update +verbose +file=records blues folk rock classical
|
|
blues
|
|
classical
|
|
%
|
|
@end example
|
|
|
|
@noindent
|
|
Because you specified verbose mode, @code{tar} printed out the names
|
|
of the files it acted on. If you now list the archive members of the
|
|
archive, (@samp{tar +list +file=records}), you will see that the file
|
|
@file{classical} and another version of the file @file{blues} have
|
|
been added to @file{records}.
|
|
|
|
Note: When you update an archive, @code{tar} does not overwrite old
|
|
archive members when it stores newer versions of a file. This is
|
|
because archive members appear in an archive in the order in which
|
|
they are stored, and some archive devices do not allow writing in the
|
|
middle of an archive.
|
|
|
|
@node Concatenate, Extracting Files Example, Adding to Archives, Tutorial
|
|
@comment node-name, next, previous, up
|
|
@section Concatenating Archives
|
|
|
|
To concatenate archive files, use @samp{tar +concatenate} or @samp{tar
|
|
-A}. This operation adds other archives to the end of an archive.
|
|
While it may seem intuitive to concatenate archives using @code{cat},
|
|
the utility for adding files together, archive files which have been
|
|
"catted" together cannot be read properly by @code{tar}. Archive
|
|
files incorporate an end of file marker---if archives are concatenated
|
|
using @code{cat}, this marker will appear before the end of the new
|
|
archive. This will interfere with operations on that archive.
|
|
@c <<<xref ignore-zeros>>>
|
|
|
|
In earlier examples, you stored the @file{~/practice} directory in an
|
|
archive file, @file{~/music}. If you have been following the
|
|
examples, you have since changed the contents of the @file{~/practice}
|
|
directory. There is a current version of the files in the
|
|
@file{practice} directory, however, stored in the archive file
|
|
@file{~/practice/records}.
|
|
|
|
To store current versions of the files in @file{practice} in the
|
|
archive file @file{music}, you can use @samp{tar +concatenate} to add
|
|
the archive file @file{~/practice/records} to @file{music}. First,
|
|
make sure you are in your home directory (@samp{cd ~}). Then:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Invoke @code{tar}, and specify the @samp{+concatenate} operation
|
|
(@samp{-A} or @samp{+concatenate})
|
|
|
|
@item
|
|
Specify the archive file to be added to
|
|
(@samp{+file=@var{archive-name}} or @samp{-f @var{archive-name}})
|
|
|
|
@item
|
|
Specify the archives to be added, using file-name arguments. In this
|
|
case, the file-name arguments are, unusually, the names of archive
|
|
files. (Remember to include the path in the archive name, if the
|
|
archive file is not in your working directory.)
|
|
@end itemize
|
|
|
|
@example
|
|
% cd ~
|
|
% tar +concatenate +file=music practice/records
|
|
@end example
|
|
|
|
If you now list the contents of the @file{music}, you see it now
|
|
contains the archive members of @file{practice/records}:
|
|
|
|
@example
|
|
%tar +list +file=music
|
|
blues
|
|
folk
|
|
jazz
|
|
rock
|
|
blues
|
|
practice/blues
|
|
practice/folk
|
|
practice/jazz
|
|
practice/rock
|
|
practice/blues
|
|
practice/classical
|
|
@end example
|
|
|
|
@node Deleting Files, , , Tutorial
|
|
@comment node-name, next, previous, up
|
|
@section Deleting Files From an Archive
|
|
|
|
In some instances, you may want to remove some files from an archive
|
|
stored on disk
|
|
|
|
@quotation
|
|
@emph{Caution:} you should never delete files from an archive stored
|
|
on tape---because of the linear nature of tape storage, doing this is
|
|
likely to scramble the archive.
|
|
@end quotation
|
|
|
|
To remove archive members from an archive, use the @samp{+delete}
|
|
operation. You must specify the names of files to be removed as
|
|
file-name arguments. All versions of the named file are removed from
|
|
the archive.
|
|
|
|
Execution of the @samp{+delete} operation can be very slow.
|
|
|
|
To delete all versions of the file @file{blues} from the archive
|
|
@file{records} in the @file{practice} directory, make sure you are in
|
|
that directory, and then:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
List the contents of the archive file @file{records} (see above for
|
|
the steps involved) to insure that the file(s) you wish to delete are
|
|
stored in the archive. (This step is optional)
|
|
|
|
@item
|
|
Invoke @code{tar} and specify the @samp{+delete} operation
|
|
(@samp{+delete}).
|
|
|
|
@item
|
|
Specify the name of the archive file that the file(s) will be deleted
|
|
from (@samp{+file=@var{archive-name}} or @samp{-f @var{archive-name}})
|
|
|
|
@item
|
|
Specify the files to be deleted, using file-name arguments.
|
|
|
|
@item
|
|
List the contents of the archive file again---note that the files have
|
|
been removed. (this step is also optional)
|
|
@end itemize
|
|
|
|
@example
|
|
% tar +list +file=records
|
|
blues
|
|
folk
|
|
jazz
|
|
% tar +delete +file=records blues
|
|
% tar +list +file=records
|
|
folk
|
|
jazz
|
|
%
|
|
@end example
|
|
|
|
@node Wizardry, Archive Structure, Tutorial, Top
|
|
@chapter Wizardry
|
|
|
|
<<<This section needs to be written -ringo
|
|
|
|
@strong{To come:} using Unix file linking capability to recreate directory
|
|
structures---linking files into one subdirectory and then tarring that
|
|
directory.
|
|
|
|
@strong{to come:} nice hairy example using absolute-paths, newer, etc.
|
|
|
|
|
|
Piping one @code{tar} to another is an easy way to copy a directory's
|
|
contents from one disk to another, while preserving the dates, modes, owners
|
|
and link-structure of all the files therein.
|
|
|
|
@example
|
|
cd sourcedirectory; tar cf - . | (cd targetdir; tar xf -)
|
|
@end example
|
|
|
|
@noindent
|
|
or
|
|
|
|
<<< the following using standard input/output correct??
|
|
@example
|
|
cd sourcedirectory; tar +create +file=- . | (cd targetdir; tar +extract +file=-)
|
|
@end example
|
|
|
|
@noindent
|
|
|
|
Archive files can be used for transporting a group of files from one system
|
|
to another: put all relevant files into an archive on one computer system,
|
|
transfer the archive to another, and extract the contents there. The basic
|
|
transfer medium might be magnetic tape, Internet FTP, or even electronic
|
|
mail (though you must encode the archive with @code{uuencode} in order to
|
|
transport it properly by mail). Both machines do not have to use the same
|
|
operating system, as long as they both support the @code{tar} program.
|
|
@findex uuencode
|
|
<<< mention uuencode on a paragraph of its own
|
|
|
|
<<<<<end construction>>>>>
|
|
|
|
@node Archive Structure, Reading and Writing, Wizardry, Top
|
|
@chapter The Structure of an Archive
|
|
|
|
While an archive may contain many files, the archive itself is a
|
|
single ordinary file. Like any other file, an archive file can be
|
|
written to a storage device such as a tape or disk, sent through a
|
|
pipe or over a network, saved on the active file system, or even
|
|
stored in another archive. An archive file is not easy to read or
|
|
manipulate without using the @code{tar} utility or Tar mode in Emacs.
|
|
|
|
|
|
Physically, an archive consists of a series of file entries terminated
|
|
by an end-of-archive entry, which consists of 512 zero bytes. A file
|
|
entry usually describes one of the files in the archive (an
|
|
@dfn{archive member}), and consists of a file header and the contents
|
|
of the file. File headers contain file names and statistics, checksum
|
|
information which @code{tar} uses to detect file corruption, and
|
|
information about file types.
|
|
|
|
More than archive member can have the same file name. One way this
|
|
situation can occur is if more than one version of a file has been
|
|
stored in the archive. For information about adding new versions of a
|
|
file to an archive, @pxref{Modifying}.
|
|
|
|
In addition to entries describing archive members, an archive may contain
|
|
entries which @code{tar} itself uses to store information.
|
|
@xref{Archive Label}, for an example of such an archive entry.
|
|
|
|
@menu
|
|
* Old Style File Information:: Old Style File Information
|
|
* Archive Label::
|
|
* Format Variations::
|
|
@end menu
|
|
|
|
@node Old Style File Information, Archive Label, Archive Structure, Archive Structure
|
|
@section Old Style File Information
|
|
@cindex Format, old style
|
|
@cindex Old style format
|
|
@cindex Old style archives
|
|
|
|
Archives record not only an archive member's contents, but also its
|
|
file name or names, its access permissions, user and group, size in
|
|
bytes, and last modification time. Some archives also record the file
|
|
names in each archived directory, as well as other file and directory
|
|
information.
|
|
|
|
Certain old versions of @code{tar} cannot handle additional
|
|
information recorded by newer @code{tar} programs. To create an
|
|
archive which can be read by these old versions, specify the
|
|
@samp{+old-archive} option in conjunction with the @samp{tar +create}
|
|
operation. When you specify this option, @code{tar} leaves out
|
|
information about directories, pipes, fifos, contiguous files, and
|
|
device files, and specifies file ownership by group and user ids
|
|
instead of names.
|
|
|
|
The @samp{+old-archive} option is needed only if the archive must be
|
|
readable by an older tape archive program which cannot handle the new format.
|
|
Most @code{tar} programs do not have this limitation, so this option
|
|
is seldom needed.
|
|
|
|
@table @samp
|
|
@item +old-archive
|
|
@itemx -o
|
|
@itemx +old
|
|
@itemx +portable
|
|
@c has portability been changed to portable?
|
|
Creates an archive that can be read by an old @code{tar} program.
|
|
Used in conjunction with the @samp{tar +create} operation.
|
|
@end table
|
|
|
|
@node Archive Label, Format Variations, Old Style File Information, Archive Structure
|
|
@section Including a Label in the Archive
|
|
@cindex Labeling an archive
|
|
@cindex Labels on the archive media
|
|
|
|
@c !! Should the arg to +label be a quoted string?? no - ringo
|
|
To avoid problems caused by misplaced paper labels on the archive
|
|
media, you can include a @dfn{label} entry---an archive member which
|
|
contains the name of the archive---in the archive itself. Use the
|
|
@samp{+label=@var{archive-label}} option in conjunction with the
|
|
@samp{+create} operation to include a label entry in the archive as it
|
|
is being created.
|
|
|
|
If you create an archive using both @samp{+label=@var{archive-label}}
|
|
and @samp{+multi-volume}, each volume of the archive will have an
|
|
archive label of the form @samp{@var{archive-label} Volume @var{n}},
|
|
where @var{n} is 1 for the first volume, 2 for the next, and so on.
|
|
@xref{Multi-Volume Archives}, for information on creating multiple
|
|
volume archives.
|
|
|
|
If you extract an archive using @samp{+label=@var{archive-label}},
|
|
@code{tar} will print an error if the archive label doesn't match the
|
|
@var{archive-label} specified, and will then not extract the archive.
|
|
You can include a regular expression in @var{archive-label}, in this
|
|
case only.
|
|
@c >>> why is a reg. exp. useful here? (to limit extraction to a
|
|
@c >>>specific group? ie for multi-volume??? -ringo
|
|
|
|
To find out an archive's label entry (or to find out if an archive has
|
|
a label at all), use @samp{tar +list +verbose}. @code{tar} will print the
|
|
label first, and then print archive member information, as in the
|
|
example below:
|
|
|
|
@example
|
|
% tar +verbose +list +file=iamanarchive
|
|
V--------- 0/0 0 Mar 7 12:01 1992 iamalabel--Volume Header--
|
|
-rw-rw-rw- ringo/user 40 May 21 13:30 1990 iamafilename
|
|
@end example
|
|
|
|
@table @samp
|
|
@item +label=@var{archive-label}
|
|
@itemx -V @var{archive-label}
|
|
Includes an @dfn{archive-label} at the beginning of the archive when
|
|
the archive is being created (when used in conjunction with the
|
|
@samp{tar +create} operation). Checks to make sure the archive label
|
|
matches the one specified (when used in conjunction with the @samp{tar
|
|
+extract} operation.
|
|
@end table
|
|
@c was +volume
|
|
|
|
@node Format Variations, , Archive Label, Archive Structure
|
|
@section Format Variations
|
|
@cindex Format Parameters
|
|
@cindex Format Options
|
|
@cindex Options to specify archive format.
|
|
|
|
Format parameters specify how an archive is written on the archive
|
|
media. The best choice of format parameters will vary depending on
|
|
the type and number of files being archived, and on the media used to
|
|
store the archive.
|
|
|
|
To specify format parameters when accessing or creating an archive,
|
|
you can use the options described in the following sections. If you
|
|
do not specify any format parameters, @code{tar} uses default
|
|
parameters. You cannot modify a compressed archive. If you create an
|
|
archive with the @samp{+block-size} option specified (@pxref{Blocking
|
|
Factor}), you must specify that block-size when operating on the
|
|
archive. @xref{Matching Format Parameters}, for other examples of
|
|
format parameter considerations.
|
|
|
|
|
|
@menu
|
|
* Multi-Volume Archives::
|
|
* Sparse Files::
|
|
* Blocking Factor::
|
|
* Compressed Archives::
|
|
@end menu
|
|
|
|
@node Multi-Volume Archives, Sparse Files, Format Variations, Format Variations
|
|
@subsection Archives Longer than One Tape or Disk
|
|
@cindex Multi-volume archives
|
|
|
|
To create an archive that is larger than will fit on a single unit of
|
|
the media, use the @samp{+multi-volume} option in conjunction with the
|
|
@samp{tar +create} operation (@pxref{Creating Archives}). A
|
|
@dfn{multi-volume} archive can be manipulated like any other archive
|
|
(provided the @samp{+multi-volume} option is specified), but is stored
|
|
on more than one tape or disk.
|
|
|
|
When you specify @samp{+multi-volume}, @code{tar} does not report an
|
|
error when it comes to the end of an archive volume (when reading), or
|
|
the end of the media (when writing). Instead, it prompts you to load
|
|
a new storage volume. If the archive is on a magnetic tape, you
|
|
should change tapes when you see the prompt; if the archive is on a
|
|
floppy disk, you should change disks; etc.
|
|
|
|
You can read each individual volume of a multi-volume archive as if it
|
|
were an archive by itself. For example, to list the contents of one
|
|
volume, use @samp{tar +list}, without @samp{+multi-volume} specified.
|
|
To extract an archive member from one volume (assuming it is described
|
|
that volume), use @samp{tar +extract}, again without
|
|
@samp{+multi-volume}.
|
|
|
|
If an archive member is split across volumes (ie. its entry begins on
|
|
one volume of the media and ends on another), you need to specify
|
|
@samp{+multi-volume} to extract it successfully. In this case, you
|
|
should load the volume where the archive member starts, and use
|
|
@samp{tar +extract +multi-volume}---@code{tar} will prompt for later
|
|
volumes as it needs them. @xref{Extracting From Archives} for more
|
|
information about extracting archives.
|
|
|
|
@samp{+info-script=@var{program-file}} is like @samp{+multi-volume},
|
|
except that @code{tar} does not prompt you directly to change media
|
|
volumes when a volume is full---instead, @code{tar} runs commands you
|
|
have stored in @var{program-file}. This option can be used to
|
|
broadcast messages such as @samp{someone please come change my tape}
|
|
when performing unattended backups. When @var{program-file} is done,
|
|
@code{tar} will assume that the media has been changed.
|
|
|
|
|
|
<<< There should be a sample program here, including an exit before
|
|
<<< end.
|
|
|
|
@table @samp
|
|
@item +multi-volume
|
|
@itemx -M
|
|
Creates a multi-volume archive, when used in conjunction with
|
|
@samp{tar +create}. To perform any other operation on a multi-volume
|
|
archive, specify @samp{+multi-volume} in conjunction with that
|
|
operation.
|
|
|
|
@item +info-script=@var{program-file}
|
|
@itemx -F @var{program-file}
|
|
Creates a multi-volume archive via a script. Used in conjunction with
|
|
@samp{tar +create}.
|
|
@end table
|
|
|
|
@node Sparse Files, Blocking Factor, Multi-Volume Archives, Format Variations
|
|
@subsection Archiving Sparse Files
|
|
@cindex Sparse Files
|
|
|
|
A file is sparse if it contains blocks of zeros whose existance is
|
|
recorded, but that have no space allocated on disk. When you specify
|
|
the @samp{+sparse} option in conjunction with the @samp{+create}
|
|
operation, @code{tar} tests all files for sparseness while archiving.
|
|
If @code{tar} finds a file to be sparse, it uses a sparse
|
|
representation of the file in the archive. @xref{Creating Archives},
|
|
for more information about creating archives.
|
|
|
|
@samp{+sparse} is useful when archiving files, such as dbm files,
|
|
likely to contain many nulls. This option dramatically
|
|
decreases the amount of space needed to store such an archive.
|
|
|
|
@quotation
|
|
@strong{Please Note:} Always use @samp{+sparse} when performing file
|
|
system backups, to avoid archiving the expanded forms of files stored
|
|
sparsely in the system.@refill
|
|
|
|
Even if your system has no no sparse files currently, some may be
|
|
created in the future. If you use @samp{+sparse} while making file
|
|
system backups as a matter of course, you can be assured the archive
|
|
will always take no more space on the media than the files take on
|
|
disk (otherwise, archiving a disk filled with sparse files might take
|
|
hundreds of tapes).@refill
|
|
<<< xref incremental when node name is set.
|
|
@end quotation
|
|
|
|
@code{tar} ignores the @samp{+sparse} option when reading an archive.
|
|
|
|
@table @samp
|
|
@item +sparse
|
|
@itemx -S
|
|
Files stored sparsely in the file system are represented sparsely in
|
|
the archive. Use in conjunction with write operations.
|
|
@end table
|
|
|
|
@node Blocking Factor, Compressed Archives, Sparse Files, Format Variations
|
|
@subsection The Blocking Factor of an Archive
|
|
@cindex Blocking Factor
|
|
@cindex Block Size
|
|
@cindex Number of records per block
|
|
@cindex Number of bytes per block
|
|
@cindex Bytes per block
|
|
@cindex Records per block
|
|
|
|
The data in an archive is grouped into records, which are 512 bytes.
|
|
Records are read and written in whole number multiples called
|
|
@dfn{blocks}. The number of records in a block (ie. the size of a
|
|
block in units of 512 bytes) is called the @dfn{blocking factor}. The
|
|
@samp{+block-size=@var{number}} option specifies the blocking factor
|
|
of an archive. The default blocking factor is typically 20 (ie.@:
|
|
10240 bytes), but can be specified at installation. To find out the
|
|
blocking factor of an existing archive, use @samp {tar +list
|
|
+file=@var{archive-name}}. This may not work on some devices.
|
|
|
|
Blocks are seperated by gaps, which waste space on the archive media.
|
|
If you are archiving on magnetic tape, using a larger blocking factor
|
|
(and therefore larger blocks) provides faster throughput and allows
|
|
you to fit more data on a tape (because there are fewer gaps). If you
|
|
are archiving on cartridge, a very large blocking factor (say 126 or
|
|
more) greatly increases performance. A
|
|
smaller blocking factor, on the other hand, may be usefull when
|
|
archiving small files, to avoid archiving lots of nulls as @code{tar}
|
|
fills out the archive to the end of the block. In general, the ideal block size
|
|
depends on the size of the inter-block gaps on the tape you are using,
|
|
and the average size of the files you are archiving. @xref{Creating
|
|
Archives}, for information on writing archives.
|
|
|
|
Archives with blocking factors larger than 20 cannot be read by very
|
|
old versions of @code{tar}, or by some newer versions of @code{tar}
|
|
running on old machines with small address spaces. With GNU
|
|
@code{tar}, the blocking factor of an archive is limited only by the
|
|
maximum block size of the device containing the archive, or by the
|
|
amount of available virtual memory.
|
|
|
|
If you use a non-default blocking factor when you create an archive,
|
|
you must specify the same blocking factor when you modify that
|
|
archive. Some archive devices will also require you to specify the
|
|
blocking factor when reading that archive, however this is not
|
|
typically the case. Usually, you can use @samp{tar +list} without
|
|
specifying a blocking factor---@code{tar} reports a non-default block
|
|
size and then lists the archive members as it would normally. To
|
|
extract files from an archive with a non-standard blocking factor
|
|
(particularly if you're not sure what the blocking factor is), you can
|
|
usually use the {+read-full-blocks} option while specifying a blocking
|
|
factor larger then the blocking factor of the archive (ie. @samp{tar
|
|
+extract +read-full-blocks +block-size=300}. @xref{Listing Contents}
|
|
for more information on the @samp{+list} operation.
|
|
@xref{read-full-blocks} for a more detailed explanation of that
|
|
option.
|
|
|
|
@table @samp
|
|
@item +block-size=@var{number}
|
|
@itemx -b @var{number}
|
|
Specifies the blocking factor of an archive. Can be used with any
|
|
operation, but is usually not necessary with @samp{tar +list}.
|
|
@end table
|
|
|
|
@node Compressed Archives, , Blocking Factor, Format Variations
|
|
@subsection Creating and Reading Compressed Archives
|
|
@cindex Compressed archives
|
|
@cindex Storing archives in compressed format
|
|
|
|
@samp{+compress} indicates an archive stored in compressed format.
|
|
The @samp{+compress} option is useful in saving time over networks and
|
|
space in pipes, and when storage space is at a premium.
|
|
@samp{+compress} causes @code{tar} to compress when writing the
|
|
archive, or to uncompress when reading the archive.
|
|
|
|
To perform compression and uncompression on the archive, @code{tar}
|
|
runs the @code{compress} utility. @code{tar} uses the default
|
|
compression parameters; if you need to override them, avoid the
|
|
@samp{+compress} option and run the @code{compress} utility
|
|
explicitly. It is useful to be able to call the @code{compress}
|
|
utility from within @code{tar} because the @code{compress} utility by
|
|
itself cannot access remote tape drives.
|
|
|
|
The @samp{+compress} option will not work in conjunction with the
|
|
@samp{+multi-volume} option or the @samp{+add-file}, @samp{+update},
|
|
@samp{+add-file} and @samp{+delete} operations. @xref{Modifying}, for
|
|
more information on these operations.
|
|
|
|
If there is no compress utility available, @code{tar} will report an
|
|
error.
|
|
|
|
@samp{+compress-block} is like @samp{+compress}, but when used in
|
|
conjunction with @samp{+create} also causes @code{tar} to pad the last
|
|
block of the archive out to the next block boundary as it is written.
|
|
This is useful with certain devices which require all write operations
|
|
be a multiple of a specific size.
|
|
|
|
@quotation
|
|
@strong{Please Note:} The @code{compress} program may be covered by a patent,
|
|
and therefore we recommend you stop using it. We hope to have a
|
|
different compress program in the future. We may change the name of
|
|
this option at that time.
|
|
@end quotation
|
|
|
|
@table @samp
|
|
@item +compress
|
|
@itemx +uncompress
|
|
@itemx -z
|
|
@itemx -Z
|
|
When this option is specified, @code{tar} will compress (when writing
|
|
an archive), or uncompress (when reading an archive). Used in
|
|
conjunction with the @samp{+create}, @samp{+extract}, @samp{+list} and
|
|
@samp{+compare} operations.
|
|
|
|
@item +compress-block
|
|
@itemx -z -z
|
|
Acts like @samp{+compress}, but pads the archive out to the next block
|
|
boundary as it is written when used in conjunction with the
|
|
@samp{+create} operation.
|
|
@end table
|
|
|
|
@c >>> MIB -- why not use -Z instead of -z -z ? -ringo
|
|
|
|
@node Reading and Writing, Insuring Accuracy, Archive Structure, Top
|
|
@chapter Reading and Writing Archives
|
|
|
|
The @samp{+create} operation writes a new archive, and the
|
|
@samp{+extract} operation reads files from an archive and writes them
|
|
into the file system. You can use other @code{tar} operations to
|
|
write new information into an existing archive (adding files to it,
|
|
adding another archive to it, or deleting files from it), and you can
|
|
read a list of the files in an archive without extracting it using the
|
|
@samp{+list} operation.
|
|
|
|
@menu
|
|
* Archive Name:: The name of an archive
|
|
* Creating in Detail:: Creating in detail
|
|
* Modifying:: Modifying archives
|
|
* Listing Contents:: Listing the contents of an archive
|
|
* Extracting From Archives:: Extracting files from an archive
|
|
@end menu
|
|
|
|
@node Archive Name, Creating in Detail, Reading and Writing, Reading and Writing
|
|
@section The Name of an Archive
|
|
@cindex Naming an archive
|
|
@cindex Archive Name
|
|
@cindex Directing output
|
|
@cindex Where is the archive?
|
|
|
|
An archive can be saved as a file in the file system, sent through a
|
|
pipe or over a network, or written to an I/O device such as a tape or
|
|
disk drive. To specify the name of the archive, use the
|
|
@samp{+file=@var{archive-name}} option.
|
|
|
|
An archive name can be the name of an ordinary file or the name of an
|
|
I/O device. @code{tar} always needs an archive name---if you do not
|
|
specify an archive name, the archive name comes from the environment
|
|
variable @code{TAPE} or, if that variable is not specified, a default
|
|
archive name, which is usually the name of tape unit zero (ie.
|
|
/dev/tu00).
|
|
|
|
If you use @file{-} as an @var{archive-name}, @code{tar} reads the
|
|
archive from standard input (when listing or extracting files), or
|
|
writes it to standard output (when creating an archive). If you use
|
|
@file{-} as an @var{archive-name} when modifying an archive,
|
|
@code{tar} reads the original archive from its standard input and
|
|
writes the entire new archive to its standard output.
|
|
|
|
@c >>> MIB--does standard input and output redirection work with all
|
|
@c >>> operations?
|
|
@c >>> need example for standard input and output (screen and keyboard?)
|
|
|
|
@cindex Standard input and output
|
|
@cindex tar to standard input and output
|
|
|
|
To specify an archive file on a device attached to a remote machine,
|
|
use the following:
|
|
|
|
@example
|
|
+file=@var{hostname}:/@var{dev}/@var{file name}
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} will complete the remote connection, if possible, and
|
|
prompt you for a username and password. If you use
|
|
@samp{+file=@@@var{hostname}:/@var{dev}/@var{file-name}}, @code{tar}
|
|
will complete the remote connection, if possible, using your username
|
|
as the username on the remote machine.
|
|
|
|
@c >>>MIB --- is this clear?
|
|
|
|
@table @samp
|
|
@item +file=@var{archive-name}
|
|
@itemx -f @var{archive-name}
|
|
Names the archive to create or operate on. Use in conjunction with
|
|
any operation.
|
|
@end table
|
|
|
|
@node Creating in Detail, Modifying, Archive Name, Reading and Writing
|
|
@section Creating in Detail
|
|
@c operations should probably have examples, not tables.
|
|
@cindex Writing new archives
|
|
@cindex Archive creation
|
|
|
|
To create an archive, use @samp{tar +create}. To name the archive,
|
|
use @samp{+file=@var{archive-name}} in conjunction with the
|
|
@samp{+create} operation (@pxref{Archive Name}). If you do not name
|
|
the archive, @code{tar} uses the value of the environment variable
|
|
@code{TAPE} as the file name for the archive, or, if that is not
|
|
available, @code{tar} uses a default archive name, usually that for tape
|
|
unit zero. @xref{Archive Name}, for more information about specifying
|
|
an archive name.
|
|
|
|
The following example creates an archive named @file{stooges},
|
|
containing the files @file{larry}, @file{moe} and @file{curley}:
|
|
|
|
@example
|
|
tar +create +file=stooges larry moe curley
|
|
@end example
|
|
|
|
If you specify a directory name as a file-name argument, @code{tar}
|
|
will archive all the files in that directory. The following example
|
|
creates an archive named @file{hail/hail/fredonia}, containing the
|
|
contents of the directory @file{marx}:
|
|
|
|
@example
|
|
tar +create +file=hail/hail/fredonia marx
|
|
@end example
|
|
|
|
If you don't specify files to put in the archive, @code{tar} archives
|
|
all the files in the working directory. The following example creates
|
|
an archive named @file{home} containing all the files in the working
|
|
directory:
|
|
|
|
@example
|
|
tar +create +file=home
|
|
@end example
|
|
|
|
@xref{File Name Lists}, for other ways to specify files to archive.
|
|
|
|
Note: In the example above, an archive containing all the files in the
|
|
working directory is being written to the working directory. GNU
|
|
@code{tar} stores files in the working directory in an archive which
|
|
is itself in the working directory without falling into an infinite
|
|
loop. Other versions of @code{tar} may fall into this trap.
|
|
|
|
@node Modifying, Listing Contents, Creating in Detail, Reading and Writing
|
|
@section Modifying Archives
|
|
@cindex Modifying archives
|
|
|
|
Once an archive is created, you can add new archive members to it, add
|
|
the contents of another archive, add newer versions of members already
|
|
stored, or delete archive members already stored.
|
|
|
|
To find out what files are already stored in an archive, use @samp{tar
|
|
+list +file=@var{archive-name}}. @xref{Listing Contents}.
|
|
|
|
@menu
|
|
* Adding Files::
|
|
* Appending Archives::
|
|
* Deleting Archive Files:: Deleting Files From an Archive
|
|
* Matching Format Parameters::
|
|
@end menu
|
|
|
|
@node Adding Files, Appending Archives, Modifying, Modifying
|
|
@subsection Adding Files to an Archive
|
|
@cindex Adding files to an archive
|
|
@cindex Updating an archive
|
|
|
|
To add files to an archive, use @samp{tar +add-file}. The archive to
|
|
be added to must already exist and be in proper archive format (which
|
|
normally means it was created previously using @code{tar}). If the
|
|
archive was created with a different block size than now specified,
|
|
@code{tar} will report an error (@pxref{Blocking Factor}). If the
|
|
archive is not a valid @code{tar} archive, the results will be
|
|
unpredictable. You cannot add files to a compressed archive, however
|
|
you can add files to the last volume of a multi-volume archive.
|
|
@xref{Matching Format Parameters}.
|
|
|
|
The following example adds the file @file{shemp} to the archive
|
|
@file{stooges} created above:
|
|
|
|
@example
|
|
tar +add-file +file=stooges shemp
|
|
@end example
|
|
|
|
You must specify the files to be added; there is no default.
|
|
|
|
@samp{tar +update} acts like @samp{tar +add-file}, but does not add
|
|
files to the archive if there is already a file entry with that name
|
|
in the archive that has the same modification time.
|
|
|
|
Both @samp{+update} and @samp{+add-file} work by adding to the end of
|
|
the archive. When you extract a file from the archive, only the
|
|
version stored last will wind up in the file system. Because
|
|
@samp{tar +extract} extracts files from an archive in sequence, and
|
|
overwrites files with the same name in the file system, if a file name
|
|
appears more than once in an archive the last version of the file will
|
|
overwrite the previous versions which have just been extracted. You
|
|
should avoid storing older versions of a file later in the archive.
|
|
|
|
Note: @samp{+update} is not suitable for performing backups, because
|
|
it doesn't change directory content entries, and because it lengthens
|
|
the archive every time it is used.
|
|
@c <<< xref to scripted backup, listed incremental, for info on backups.
|
|
|
|
@node Appending Archives, Deleting Archive Files, Adding Files, Modifying
|
|
@subsection Appending One Archive's Contents to Another Archive
|
|
@cindex Adding archives to an archive
|
|
@cindex Concatenating Archives
|
|
|
|
To append copies of an archive or archives to the end of another
|
|
archive, use @samp{tar +add-archive}. The source and target archives
|
|
must already exist and have been created using compatable format
|
|
parameters (@pxref{Matching Format Parameters}).
|
|
|
|
@code{tar} will stop reading an archive if it encounters an
|
|
end-of-archive marker. The @code{cat} utility does not remove
|
|
end-of-archive markers, and is therefore unsuitable for concatenating
|
|
archives. @samp{tar +add-archive} removes the end-of-archive marker
|
|
from the target archive before each new archive is appended.
|
|
@c <<< xref ignore-zeros
|
|
|
|
You must specify the source archives using
|
|
@samp{+file=@var{archive-name}} (@pxref{Archive Name}). If you do not
|
|
specify the target archive , @code{tar} uses the value of the
|
|
environment variable @code{TAPE}, or, if this has not been set, the
|
|
default archive name.
|
|
|
|
The following example adds the contents of the archive
|
|
@file{hail/hail/fredonia} to the archive @file{stooges} (both archives
|
|
were created in examples above):
|
|
|
|
@example
|
|
tar +add-archive +file=stooges hail/hail/fredonia
|
|
@end example
|
|
|
|
If you need to retrieve files from an archive that was added to using
|
|
the @code{cat} utility, use the @samp{+ignore-zeros} option
|
|
(@pxref{Archive Reading Options}).
|
|
|
|
@node Deleting Archive Files, Matching Format Parameters, Appending Archives, Modifying
|
|
@subsection Deleting Files From an Archive
|
|
@cindex Deleting files from an archive
|
|
@cindex Removing files from an archive
|
|
|
|
To delete archive members from an archive, use @samp{tar +delete}.
|
|
You must specify the file names of the members to be deleted. All
|
|
archive members with the specified file names will be removed from the
|
|
archive.
|
|
|
|
The following example removes the file @file{curley} from the archive
|
|
@file{stooges}:
|
|
|
|
@example
|
|
tar +delete +file=stooges curley
|
|
@end example
|
|
|
|
You can only use @samp{tar +delete} on an archive if the archive
|
|
device allows you to write to any point on the media.
|
|
|
|
@quotation
|
|
@strong{Warning:} Don't try to delete an archive member from a
|
|
magnetic tape, lest you scramble the archive. There is no safe way
|
|
(except by completely re-writing the archive) to delete files from
|
|
most kinds of magnetic tape.
|
|
@end quotation
|
|
|
|
@c <<< MIB -- how about automatic detection of archive media? give error
|
|
@c <<< unless the archive device is either an ordinary file or different
|
|
@c <<< input and output (+file=-).
|
|
|
|
@node Matching Format Parameters, , Deleting Archive Files, Modifying
|
|
@subsection Matching the Format Parameters
|
|
|
|
Some format parameters must be taken into consideration when modifying
|
|
an archive:
|
|
|
|
Compressed archives cannot be modified.
|
|
|
|
You have to specify the block size of the archive when modifying an
|
|
archive with a non-default block size.
|
|
|
|
Multi-volume archives can be modified like any other archive. To add
|
|
files to a multi-volume archive, you need to only mount the last
|
|
volume of the archive media (and new volumes, if needed). For all
|
|
other operations, you need to use the entire archive.
|
|
|
|
If a multi-volume archive was labeled using @samp{+label}
|
|
(@pxref{Archive Label}) when it was created, @code{tar} will not
|
|
automatically label volumes which are added later. To label
|
|
subsequent volumes, specify @samp{+label=@var{archive-label}} again in
|
|
conjunction with the @samp{+add-file}, @samp{+update} or
|
|
@samp{+add-archive} operation.
|
|
@cindex Labelling multi-volume archives
|
|
@c <<< example
|
|
|
|
@c <<< xref somewhere, for more information about format parameters.
|
|
|
|
@node Listing Contents, Extracting From Archives, Modifying, Reading and Writing
|
|
@section Listing the Contents of an Archive
|
|
@cindex Names of the files in an archive
|
|
@cindex Archive contents, list of
|
|
@cindex Archive members, list of
|
|
|
|
@samp{tar +list} prints a list of the file names of the archive
|
|
members on the standard output. If you specify @var{file-name}
|
|
arguments on the command line (or using the @samp{+files-from} option,
|
|
@pxref{File Name Lists}), only the files you specify will be listed,
|
|
and only if they exist in the archive. Files not specified will be
|
|
ignored, unless they are under a specific directory.
|
|
|
|
If you include the @samp{+verbose} option, @code{tar} prints an
|
|
@samp{ls -l} type listing for the archive. @pxref{Additional
|
|
Information}, for a description of the @samp{+verbose} option.
|
|
|
|
If the blocking factor of the archive differs from the default,
|
|
@code{tar} reports this. @xref{Blocking Factor}.
|
|
|
|
@xref{Archive Reading Options} for a list of options which can be used
|
|
to modify @samp{+list}'s operation.
|
|
|
|
This example prints a list of the archive members of the archive
|
|
@file{stooges}:
|
|
|
|
@example
|
|
tar +list +file=stooges
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} responds:
|
|
|
|
@example
|
|
larry
|
|
moe
|
|
shemp
|
|
marx/julius
|
|
marx/alexander
|
|
marx/karl
|
|
@end example
|
|
|
|
This example generates a verbose list of the archive members of the
|
|
archive file @file{dwarves}, which has a blocking factor of two:
|
|
|
|
@example
|
|
tar +list -v +file=blocks
|
|
@end example
|
|
|
|
@noindent
|
|
@code{tar} responds:
|
|
|
|
@example
|
|
tar: Blocksize = 2 records
|
|
-rw------- ringo/user 42 May 1 13:29 1990 .bashful
|
|
-rw-rw-rw- ringo/user 42 Oct 4 13:29 1990 doc
|
|
-rw-rw-rw- ringo/user 42 Jul 20 18:01 1969 dopey
|
|
-rw-rw---- ringo/user 42 Nov 26 13:42 1963 grumpy
|
|
-rw-rw-rw- ringo/user 42 May 5 13:29 1990 happy
|
|
-rw-rw-rw- ringo/user 42 May 1 12:00 1868 sleepy
|
|
-rw-rw-rw- ringo/user 42 Jul 4 17:29 1776 sneezy
|
|
@end example
|
|
|
|
@node Extracting From Archives, , Listing Contents, Reading and Writing
|
|
@section Extracting Files from an Archive
|
|
@cindex Extraction
|
|
@cindex Retrieving files from an archive
|
|
@cindex Resurrecting files from an archive
|
|
|
|
To read archive members from the archive and write them into the file
|
|
system, use @samp{tar +extract}. The archive itself is left
|
|
unchanged.
|
|
|
|
If you do not specify the files to extract, @code{tar} extracts all
|
|
the files in the archive. If you specify the name of a directory as a
|
|
file-name argument, @code{tar} will extract all files which have been
|
|
stored as part of that directory. If a file was stored with a
|
|
directory name as part of its file name, and that directory does not
|
|
exist under the working directory when the file is extracted,
|
|
@code{tar} will create the directory. @xref{Selecting Archive
|
|
Members}, for information on specifying files to extract.
|
|
|
|
The following example shows the extraction of the archive
|
|
@file{stooges} into an empty directory:
|
|
|
|
@example
|
|
tar +extract +file=stooges
|
|
@end example
|
|
|
|
@noindent
|
|
Generating a listing of the directory (@samp{ls}) produces:
|
|
|
|
@example
|
|
larry
|
|
moe
|
|
shemp
|
|
marx
|
|
@end example
|
|
|
|
@noindent
|
|
The subdirectory @file{marx} contains the files @file{julius},
|
|
@file{alexander} and @file{karl}.
|
|
|
|
If you wanted to just extract the files in the subdirectory
|
|
@file{marx}, you could specify that directory as a file-name argument
|
|
in conjunction with the @samp{+extract} operation:
|
|
|
|
@example
|
|
tar +extract +file=stooges marx
|
|
@end example
|
|
|
|
@quotation
|
|
@strong{Warning:} Extraction can overwrite files in the file system.
|
|
To avoid losing files in the file system when extracting files from
|
|
the archive with the same name, use the @samp{+keep-old-files} option
|
|
(@pxref{File Writing Options}).
|
|
@end quotation
|
|
|
|
If the archive was created using @samp{+block-size}, @samp{+compress}
|
|
or @samp{+multi-volume}, you must specify those format options again
|
|
when extracting files from the archive (@pxref{Format Variations}).
|
|
|
|
@menu
|
|
* Archive Reading Options::
|
|
* File Writing Options::
|
|
* Scarce Disk Space:: Recovering From Scarce Disk Space
|
|
@end menu
|
|
|
|
@node Archive Reading Options, File Writing Options, Extracting From Archives, Extracting From Archives
|
|
@subsection Options to Help Read Archives
|
|
@cindex Options when reading archives
|
|
@cindex Reading incomplete blocks
|
|
@cindex Blocks, incomplete
|
|
@cindex End of archive markers, ignoring
|
|
@cindex Ignoring end of archive markers
|
|
@cindex Large lists of file names on small machines
|
|
@cindex Small memory
|
|
@cindex Running out of space
|
|
|
|
@c <<< each option wants its own node. summary after menu
|
|
|
|
Normally, @code{tar} will request data in full block increments from
|
|
an archive storage device. If the device cannot return a full block,
|
|
@code{tar} will report an error. However, some devices do not always
|
|
return full blocks, or do not require the last block of an archive to
|
|
be padded out to the next block boundary. To keep reading until you
|
|
obtain a full block, or to accept an incomplete block if it contains
|
|
an end-of-archive marker, specify the @samp{+read-full-blocks} option
|
|
in conjunction with the @samp{+extract} or @samp{+list} operations.
|
|
@xref{Listing Contents}.
|
|
|
|
The @samp{+read-full-blocks} option is turned on by default when
|
|
@code{tar} reads an archive from standard input, or from a remote
|
|
machine. This is because on BSD Unix systems, attempting to read a
|
|
pipe returns however much happens to be in the pipe, even if it is
|
|
less than was requested. If this option were not enabled, @code{tar}
|
|
would fail as soon as it read an incomplete block from the pipe.
|
|
|
|
If you're not sure of the blocking factor of an archive, you can read
|
|
the archive by specifying @samp{+read-full-blocks} and
|
|
@samp{+block-size=@var{n}}, where @var{n} is a blocking factor larger
|
|
than the blocking factor of the archive. This lets you avoid having
|
|
to determine the blocking factor of an archive. @xref{Blocking
|
|
Factor}.
|
|
|
|
@table @samp
|
|
@item +read-full-blocks
|
|
@item -B
|
|
Use in conjunction with @samp{tar +extract} to read an archive which
|
|
contains incomplete blocks, or one which has a blocking factor less
|
|
than the one specified.
|
|
@end table
|
|
|
|
Normally @code{tar} stops reading when it encounters a block of zeros
|
|
between file entries (which usually indicates the end of the archive).
|
|
@samp{+ignore-zeros} allows @code{tar} to completely read an archive
|
|
which contains a block of zeros before the end (i.e.@: a damaged
|
|
archive, or one which was created by @code{cat}-ing several archives
|
|
together).
|
|
|
|
The @samp{+ignore-zeros} option is turned off by default because many
|
|
versions of @code{tar} write garbage after the end of archive entry,
|
|
since that part of the media is never supposed to be read. GNU
|
|
@code{tar} does not write after the end of an archive, but seeks to
|
|
maintain compatablity among archiving utilities.
|
|
|
|
@table @samp
|
|
@item +ignore-zeros
|
|
@itemx -i
|
|
To ignore blocks of zeros (ie.@: end-of-archive entries) which may be
|
|
encountered while reading an archive. Use in conjunction with
|
|
@samp{tar +extract} or @samp{tar +list}.
|
|
@end table
|
|
|
|
If you are using a machine with a small amount of memory, and you need
|
|
to process large list of file-names, you can reduce the amount of
|
|
space @code{tar} needs to process the list. To do so, specify the
|
|
@samp{+same-order} option and provide an ordered list of file names.
|
|
This option tells @code{tar} that the @file{file-name} arguments
|
|
(provided on the command line, or read from a file using the
|
|
@samp{+files-from} option) are listed in the same order as the files
|
|
in the archive.
|
|
|
|
You can create a file containing an ordered list of files in the
|
|
archive by storing the output produced by @samp{tar +list
|
|
+file=@var{archive-name}}. @xref{Listing Contents}, for information
|
|
on the @samp{+list} operation.
|
|
|
|
This option is probably never needed on modern computer systems.
|
|
|
|
@table @samp
|
|
@item +same-order
|
|
@itemx +preserve-order
|
|
@itemx -s
|
|
To process large lists of file-names on machines with small amounts of
|
|
memory. Use in conjunction with @samp{tar +compare}, @samp{tar +list}
|
|
or @samp{tar +extract}.
|
|
@end table
|
|
|
|
@c we don't need/want +preserve to exist any more
|
|
|
|
@node File Writing Options, Scarce Disk Space, Archive Reading Options, Extracting From Archives
|
|
@subsection Changing How @code{tar} Writes Files
|
|
@c <<< find a better title
|
|
@cindex Overwriting old files, prevention
|
|
@cindex Protecting old files
|
|
@cindex Modification times of extracted files
|
|
@cindex Permissions of extracted files
|
|
@cindex Modes of extracted files
|
|
@cindex Writing extracted files to standard output
|
|
@cindex Standard output, writing extracted files to
|
|
|
|
Normally, @code{tar} writes extracted files into the file system
|
|
without regard to the files already on the system---files with the
|
|
same name as archive members are overwritten. To prevent @code{tar}
|
|
from extracting an archive member from an archive, if doing so will
|
|
overwrite a file in the file system, use @samp{+keep-old-files} in
|
|
conjunction with the @samp{+extract} operation. When this option is
|
|
specified, @code{tar} reports an error stating the name of the files
|
|
in conflict, instead of writing the file from the archive.
|
|
|
|
@table @samp
|
|
@item +keep-old files
|
|
@itemx -k
|
|
Prevents @code{tar} from overwriting files in the file system during
|
|
extraction.
|
|
@end table
|
|
|
|
Normally, @code{tar} sets the modification times of extracted files to
|
|
the modification times recorded for the files in the archive, but
|
|
limits the permissions of extracted files by the current @code{umask}
|
|
setting.
|
|
|
|
To set the modification times of extracted files to the time when
|
|
the files were extracted, use the @samp{+modification-time} option in
|
|
conjunction with @samp{tar +extract}.
|
|
|
|
@table @samp
|
|
@item +modification-time
|
|
@itemx -m
|
|
Sets the modification time of extracted archive members to the time
|
|
they were extracted, not the time recorded for them in the archive.
|
|
Use in conjunction with @samp{+extract}.
|
|
@end table
|
|
|
|
To set the modes (access permissions) of extracted files to those
|
|
recorded for those files in the archive, use the
|
|
@samp{+preserve-permissions} option in conjunction with the
|
|
@samp{+extract} operation.
|
|
@c <<<mib --- should be aliased to ignore-umask.
|
|
|
|
@table @samp
|
|
@item +preserve-permission
|
|
@itemx +same-permission
|
|
@itemx +ignore-umask
|
|
@itemx -p
|
|
Set modes of extracted archive members to those recorded in the
|
|
archive, instead of current umask settings. Use in conjunction with
|
|
@samp{+extract}.
|
|
@end table
|
|
|
|
@c <<< following paragraph needs to be rewritten:
|
|
@c <<< why doesnt' this cat files together, why is this useful. is it
|
|
@c <<< really useful with more than one file?
|
|
To write the files extracted to the standard output, instead of
|
|
creating the files on the file system, use @samp{+to-stdout} in
|
|
conjunction with @samp{tar +extract}. This option is useful if you
|
|
are extracting files to send them through a pipe, and do not need to
|
|
preserve them in the file system.
|
|
|
|
@table @samp
|
|
@item +to-stdout
|
|
@itemx -O
|
|
Writes files to the standard output. Used in conjunction with
|
|
@samp{+extract}.
|
|
@end table
|
|
|
|
@c <<< why would you want to do such a thing, how are files separated on
|
|
@c <<< the standard output? is this useful with more that one file? are
|
|
@c <<< pipes the real reason?
|
|
|
|
@node Scarce Disk Space, , File Writing Options, Extracting From Archives
|
|
@subsection Recovering From Scarce Disk Space
|
|
@cindex Middle of the archive, starting in the
|
|
@cindex Running out of space during extraction
|
|
@cindex Disk space, running out of
|
|
@cindex Space on the disk, recovering from lack of
|
|
|
|
If a previous attempt to extract files failed due to lack of disk
|
|
space, you can use @samp{+starting-file=@var{file-name}} to start
|
|
extracting only after file @var{file-name} when extracting files from
|
|
the archive. This assumes, of course, that there is now free space,
|
|
or that you are now extracting into a different file system.
|
|
|
|
@table @samp
|
|
@item +starting-file=@var{file-name}
|
|
@itemx -K @var{file-name}
|
|
Starts an operation in the middle of an archive. Use in conjunction
|
|
with @samp{+extract} or @samp{+list}.
|
|
@end table
|
|
|
|
If you notice you are running out of disk space during an extraction
|
|
operation, you can also suspend @code{tar}, remove unnecessary files
|
|
from the file system, and then restart the same @code{tar} operation.
|
|
In this case, @samp{+starting-file} is not necessary.
|
|
|
|
@c <<< xref incremental, xref +interactive, xref +exclude
|
|
|
|
@node Insuring Accuracy, Selecting Archive Members, Reading and Writing, Top
|
|
@chapter Insuring the Accuracy of an Archive
|
|
|
|
You can insure the accuracy of an archive by comparing files in the
|
|
system with archive members. @code{tar} can compare an archive to the
|
|
file system as the archive is being written, to verify a write
|
|
operation, or can compare a previously written archive, to insure that
|
|
it is up to date.
|
|
|
|
@menu
|
|
* Write Verification::
|
|
* Comparing::
|
|
@end menu
|
|
|
|
@node Write Verification, Comparing, Insuring Accuracy, Insuring Accuracy
|
|
@section Verifying Data as It is Stored
|
|
@cindex Verifying a write operation
|
|
@cindex Double-checking a write operation
|
|
|
|
To check for discrepancies in an archive immediately after it is
|
|
written, use the @samp{+verify} option in conjunction with the
|
|
@samp{tar +create} operation. When this option is specified,
|
|
@code{tar} checks archive members against their counterparts in the file
|
|
system, and reports discrepancies on the standard error. In
|
|
multi-volume archives, each volume is verified after it is written,
|
|
before the next volume is written.
|
|
|
|
To verify an archive, you must be able to read it from before the end
|
|
of the last written entry. This option is useful for detecting data
|
|
errors on some tapes. Archives written to pipes, some cartridge tape
|
|
drives, and some other devices cannot be verified.
|
|
|
|
@table @samp
|
|
@item +verify
|
|
@itemx -W
|
|
Checks for discrepancies in the archive immediately after it is
|
|
written. Use in conjunction with @samp{tar +create}.
|
|
@end table
|
|
|
|
@node Comparing, , Write Verification, Insuring Accuracy
|
|
@section Comparing an Archive with the File System
|
|
@cindex Verifying the currency of an archive
|
|
|
|
@samp{tar +compare} compares archive members in an existing archive
|
|
with their counterparts in the file system, and reports differences in
|
|
file size, mode, owner, modification date and contents. If a file is
|
|
represented in the archive but does not exist in the file system,
|
|
@code{tar} reports a difference.
|
|
|
|
If you use @var{file-name} arguments in conjunction with @samp{tar
|
|
+compare}, @code{tar} compares the archived versions of the files
|
|
specified with their counterparts in the file system. If you specify
|
|
a file that is not in the archive, @code{tar} will report an error. If
|
|
you don't specify any files, @code{tar} compares all the files in the
|
|
archive.
|
|
|
|
Because @code{tar} only checks files in the archive against files in
|
|
the file system, and not vice versa, it ignores files in the file
|
|
system that do not exist in the archive.
|
|
|
|
The following example compares the archive members @file{larry},
|
|
@file{moe} and @file{curly} in the archive @file{stooges} with files
|
|
of the same name in the file system.
|
|
|
|
@example
|
|
tar +compare +file=stooges larry moe curly
|
|
@end example
|
|
|
|
@noindent
|
|
If a file, for example @file{curly}, did not exist in the archive,
|
|
@code{tar} would report an error, as follows:
|
|
|
|
@example
|
|
curly: does not exist
|
|
@end example
|
|
|
|
@node Selecting Archive Members, User Interaction, Insuring Accuracy, Top
|
|
@chapter Selecting Archive Members
|
|
@cindex Specifying files to act on
|
|
@cindex Specifying archive members
|
|
|
|
@dfn{File-name arguments} specify which files in the file system
|
|
@code{tar} operates on, when creating or adding to an archive, or
|
|
which archive members @code{tar} operates on, when reading or
|
|
deleting from an archive. (@pxref{Reading and Writing}.)
|
|
|
|
To specify file names, you can include them as the last arguments on
|
|
the command line, as follows:
|
|
@example
|
|
tar @var{operation} [@var{option1} @var{option2} ..] [@var{file-name-1} @var{file-name-2} ...]
|
|
@end example
|
|
|
|
If you specify a directory name as a file name argument, all the files
|
|
in that directory are operated on by @code{tar}.
|
|
|
|
If you do not specify files when @code{tar} is invoked, @code{tar}
|
|
operates on all the non-directory files in the working directory (if
|
|
the operation is @samp{+create}), all the archive members in the
|
|
archive (if a read operation is specified), or does nothing (if any
|
|
other operation is specified).
|
|
|
|
@menu
|
|
* File Name Lists:: Reading File Names from a File
|
|
* File Name Interpretation:: this needs a better title
|
|
* File Exclusion:: so does this
|
|
@end menu
|
|
|
|
@node File Name Lists, File Name Interpretation, Selecting Archive Members, Selecting Archive Members
|
|
@section Reading a List of File Names from a File
|
|
@cindex Lists of file names
|
|
@cindex File-name arguments, alternatives
|
|
|
|
To read file names from a file on the file system, instead of from the
|
|
command line, use the @samp{+files-from=@var{file}} option. If you
|
|
specify @samp{-} as @var{file}, the file names are read from standard
|
|
input. Note that using both @samp{+files-from=-} and @samp{+file=-}
|
|
in the same command will not work unless the operation is
|
|
@samp{+create}. @xref{Archive Name}, for an explanation of the
|
|
@samp{+file} option.
|
|
|
|
@table @samp
|
|
@item +files-from=@var{file}
|
|
@itemx -T @var{file}
|
|
Reads file-name arguments from a file on the file system, instead of
|
|
from the command line. Use in conjunction with any operation.
|
|
@end table
|
|
|
|
@node File Name Interpretation, File Exclusion, File Name Lists, Selecting Archive Members
|
|
@section File Name Interpretation
|
|
@cindex File Names, interpreting
|
|
|
|
@c <<<<add some text -ringo
|
|
|
|
@menu
|
|
* Absolute File Names::
|
|
* Changing Working Directory::
|
|
* Archiving with Symbolic Links:: Archiving Using Symbolic Links
|
|
@end menu
|
|
|
|
@node Absolute File Names, Changing Working Directory, File Name Interpretation, File Name Interpretation
|
|
@subsection Storing and Extracting Files Relative to Root
|
|
|
|
@c <<< is this what this does, or does it just preserve the slash?
|
|
@c <<< is it still called +absolute-paths?
|
|
|
|
@c To archive or extract files relative to the root directory, specify
|
|
@c the @samp{+absolute-paths} option.
|
|
|
|
@c Normally, @code{tar} acts on files relative to the working
|
|
@c directory---ignoring superior directory names when archiving, and
|
|
@c ignoring leading slashes when extracting.
|
|
|
|
@c When you specify @samp{+absolute-paths}, @code{tar} stores file names
|
|
@c including all superior directory names, and preserves leading slashes.
|
|
@c If you only invoked @code{tar} from the root directory you would never
|
|
@c need the @samp{+absolute-paths} option, but using this option may be
|
|
@c more convenient than switching to root.
|
|
|
|
@c >>> should be an example in the tutorial/wizardry section using this
|
|
@c >>> to transfer files between systems.
|
|
|
|
@c >>> is write access an issue?
|
|
|
|
@table @samp
|
|
@item +absolute-paths
|
|
Preserves full file names (inclusing superior dirctory names) when
|
|
archiving files. Preserves leading slash when extracting files.
|
|
@end table
|
|
|
|
@node Changing Working Directory, Archiving with Symbolic Links, Absolute File Names, File Name Interpretation
|
|
@subsection Changing the Working Directory Within a List of File-names
|
|
@cindex Directory, changing in mid-stream
|
|
@cindex Working directory, specifying
|
|
|
|
To change working directory in the middle of a list of file names,
|
|
(either on the command line or in a file specified using
|
|
@samp{+files-from}), use @samp{+directory=@var{directory}}. This will
|
|
change the working directory to the directory @var{directory} after
|
|
that point in the list. For example,
|
|
|
|
@example
|
|
tar +create iggy ziggy +directory=baz melvin
|
|
@end example
|
|
|
|
@noindent
|
|
will place the files @file{iggy} and @file{ziggy} from the current
|
|
directory into the archive, followed by the file @file{melvin} from
|
|
the directory @file{baz}. This option is especially useful when you
|
|
have several widely separated files that you want to store in the same
|
|
directory in the archive.
|
|
|
|
Note that the file @file{melvin} is recorded in the archive under the
|
|
precise name @file{melvin}, @emph{not} @file{baz/melvin}. Thus, the
|
|
archive will contain three files that all appear to have come from the
|
|
same directory; if the archive is extracted with plain @samp{tar
|
|
+extract}, all three files will be written in the current directory.
|
|
|
|
Contrast this with the command
|
|
|
|
@example
|
|
tar -c iggy ziggy bar/melvin
|
|
@end example
|
|
|
|
@noindent
|
|
which records the third file in the archive under the name
|
|
@file{bar/melvin} so that, if the archive is extracted using @samp{tar
|
|
+extract}, the third file will be written in a subdirectory named
|
|
@file{bar}.
|
|
|
|
@table @samp
|
|
@item +directory=@file{directory}
|
|
@itemx -C @file{directory}
|
|
Changes the working directory.
|
|
@end table
|
|
|
|
@c <<<need to test how extract deals with this, and add an example -ringo
|
|
|
|
@node Archiving with Symbolic Links, , Changing Working Directory, File Name Interpretation
|
|
@subsection Archiving Using Symbolic Links
|
|
@cindex File names, using symbolic links
|
|
@cindex Symbolic link as file name
|
|
|
|
@samp{+dereference} is used with @samp{tar +create}, and causes
|
|
@code{tar} to archive files which are referenced by a symbolic link,
|
|
using the name of the link as the file name.
|
|
|
|
<<<this needs to be checked by MIB and then re-written, with an example
|
|
The name under which the file is stored in the file system is not
|
|
recorded in the archive. To record both the symbolic link name and
|
|
the file name in the system, archive the file under both names. If
|
|
all links were recorded automatically by @code{tar}, an extracted file
|
|
might be linked to a file name that no longer exists in the file
|
|
system.
|
|
|
|
@c <<< is the following still true? - ringo
|
|
If a linked-to file is encountered again by @code{tar} while creating
|
|
the same archive, an entire second copy of it will be stored. This
|
|
could be considered a bug.
|
|
|
|
@table @samp
|
|
@item +dereference
|
|
@itemx -h
|
|
Stores files referenced by a symbolic link, using the name of the link
|
|
as the file name. Use in conjunction with any write operation.
|
|
@end table
|
|
|
|
@node File Exclusion, , File Name Interpretation, Selecting Archive Members
|
|
@section Selecting Files by Characteristic
|
|
@cindex File names, excluding files by
|
|
@cindex Excluding files by name and pattern
|
|
@cindex Excluding files by file system
|
|
@cindex File system boundaries, not crossing
|
|
@cindex Excluding file by age
|
|
@cindex Modification time, excluding files by
|
|
@cindex Age, excluding files by
|
|
|
|
To avoid crossing file system boundaries when archiving parts of a
|
|
directory tree, use @samp{+one-file-system}. This option only affects
|
|
files that are archived because they are in a directory that is being
|
|
archived; files explicitly named on the command line are archived
|
|
regardless of where they reside.
|
|
|
|
This option is useful for making full or incremental archival backups
|
|
of a file system.
|
|
|
|
If this option is used in conjunction with @samp{+verbose}, files that
|
|
are excluded are mentioned by name on the standard error.
|
|
|
|
@table @samp
|
|
@item +one-file-system
|
|
@itemx -l
|
|
Prevents @code{tar} from crossing file system boundaries when
|
|
archiving. Use in conjunction with any write operation.
|
|
@end table
|
|
|
|
To avoid operating on files whose names match a particular pattern,
|
|
use the @samp{+exclude=@var{pattern}} or
|
|
@samp{+exclude-from=@var{file}} options.
|
|
|
|
When you specify the @samp{+exclude=@var{pattern}} option, @code{tar}
|
|
ignores files which match the @var{pattern}, which can be a single
|
|
file name or a more complex expression. Thus, if you invoke
|
|
@code{tar} with @samp{tar +create +exclude=*.o}, no files whose names
|
|
end in @file{.o} are included in the archive.
|
|
@c <<< what other things can you use besides "*"?
|
|
|
|
@samp{+exclude-from=@var{file}} acts like @samp{+exclude}, but
|
|
specifies a file @var{file} containing a list of patterns. @code{tar}
|
|
ignores files with names that fit any of these patterns.
|
|
|
|
You can use either option more than once in a single command.
|
|
|
|
@table @samp
|
|
@item +exclude=@var{pattern}
|
|
Causes @code{tar} to ignore files that match the @var{pattern}.
|
|
|
|
@item +exclude-from=@var{file}
|
|
Causes @code{tar} to ignore files that match the patterns listed in
|
|
@var{file}.
|
|
@end table
|
|
@c +exclude-from used to be "+exclude", +exclude didn't used to exist.
|
|
|
|
To operate only on files with modification or status-change times
|
|
after a particular date, use @samp{+after-date=@var{date}}. You can
|
|
use this option with @samp{tar +create} or @samp{tar +add-file} to
|
|
insure only new files are archived, or with @samp{tar +extract} to
|
|
insure only recent files are resurrected. @refill
|
|
@c +after-date @var{date} or +newer @var{date}
|
|
|
|
@samp{+newer-mtime=@var{date}} acts like @samp{+after-date=@var{date}},
|
|
but tests just the modification times of the files, ignoring
|
|
status-change times.
|
|
|
|
@c <<<need example of +newer-mtime with quoted argument
|
|
Remember that the entire date argument should be quoted if it contains
|
|
any spaces.
|
|
|
|
|
|
@strong{Please Note:} @samp{+after-date} and @samp{+newer-mtime}
|
|
should not be used for incremental backups. Some files (such as those
|
|
in renamed directories) are not selected up properly by these options.
|
|
@c xref to incremental backup chapter when node name is decided.
|
|
|
|
@table @samp
|
|
@item +after-date=@var{date}
|
|
@itemx +newer=@var{date}
|
|
@itemx -N @var{date}
|
|
Acts on files only if their modification or inode-changed times are
|
|
later than @var{date}. Use in conjunction with any operation.
|
|
@item +newer-mtime=@var{date}
|
|
Acts like @samp{+after-date}, but only looks at modification times.
|
|
@end table
|
|
|
|
@c <<< following is the getdate date format --- needs to be re-written,
|
|
@c <<< made a sub-node:
|
|
|
|
Time/Date Formats Accepted by getdate
|
|
(omitting obscure constructions)
|
|
|
|
The input consists of one or more of: time zone day date year
|
|
in any order.
|
|
|
|
Those in turn consist of (`|' and `/' mean `or', `[]' means `optional'):
|
|
|
|
time: H am/pm | H:M [am/pm] | H:M:S [am/pm]
|
|
zone: timezone-name | timezone-name dst
|
|
day: day-name | day-name, | N day-name
|
|
date: M/D | M/D/Y | month-name D | month-name D, Y | D month-name | D month-name Y
|
|
year: Y
|
|
|
|
am can also be a.m., pm can also be p.m.
|
|
case and spaces around punctuation are not significant.
|
|
month and day names can be abbreviated. >>>
|
|
|
|
@node User Interaction, Backups and Restoration, Selecting Archive Members, Top
|
|
@chapter User Interaction
|
|
@cindex Getting more information during the operation
|
|
@cindex Information during operation
|
|
@cindex Feedback from @code{tar}
|
|
|
|
Once you have typed a @code{tar}command, it is usually performed
|
|
without any further information required of the user, or provided by
|
|
@code{tar}. The following options allow you to generate progress and
|
|
status information during an operation, or to confirm operations on
|
|
files as they are performed.
|
|
|
|
@menu
|
|
* Additional Information::
|
|
* Interactive Operation::
|
|
@end menu
|
|
|
|
@node Additional Information, Interactive Operation, User Interaction, User Interaction
|
|
@section Progress and Status Information
|
|
@cindex Progress information
|
|
@cindex Status information
|
|
@cindex Information on progress and status of operations
|
|
@cindex Verbose operation
|
|
@cindex Record number where error occured
|
|
@cindex Error message, record number of
|
|
@cindex Version of the @code{tar} program
|
|
|
|
Typically, @code{tar} performs most operations without reporting any
|
|
information to the user except error messages. If you have
|
|
encountered a problem when operating on an archive, however, you may
|
|
need more information than just an error message in order to solve the
|
|
problem. The following options can be helpful diagnostic tools.
|
|
|
|
When used with most operations, @samp{+verbose} causes @code{tar} to
|
|
print the file names of the files or archive members it is operating
|
|
on. When used with @samp{tar +list}, the verbose option causes
|
|
@code{tar} to print out an @samp{ls -l} type listing of the files in
|
|
the archive.
|
|
|
|
Verbose output appears on the standard output except when an archive
|
|
is being written to the standard output (as with @samp{tar +create
|
|
+file=- +verbose}). In that case @code{tar} writes verbose output to
|
|
the standard error stream.
|
|
|
|
@table @samp
|
|
@item +verbose
|
|
@itemx -v
|
|
Prints the names of files or archive members as they are being
|
|
operated on. Can be used in conjunction with any operation. When
|
|
used with @samp{+list}, generates an @samp{ls -l} type listing.
|
|
@end table
|
|
|
|
To find out where in an archive a message was triggered, use
|
|
@samp{+record-number}. @samp{+record-number} causes @code{tar} to
|
|
print, along with every message it produces, the record number within
|
|
the archive where the message was triggered.
|
|
|
|
This option is especially useful when reading damaged archives, since
|
|
it helps pinpoint the damaged sections. It can also be used with
|
|
@samp{tar +list} when listing a file-system backup tape, allowing you
|
|
to choose among several backup tapes when retrieving a file later, in
|
|
favor of the tape where the file appears earliest (closest to the
|
|
front of the tape).
|
|
@c <<< xref when the node name is set and the backup section written
|
|
|
|
@table @samp
|
|
@item +record-number
|
|
@itemx -R
|
|
Prints the record number whenever a message is generated by
|
|
@code{tar}. Use in conjunction with any operation.
|
|
@end table
|
|
|
|
@c rewrite below
|
|
To print the version number of the @code{tar} program, use @samp{tar
|
|
+version}. @code{tar} prints the version number to the standard
|
|
error. For example:
|
|
|
|
@example
|
|
tar +version
|
|
@end example
|
|
|
|
@noindent
|
|
might return:
|
|
|
|
@example
|
|
GNU tar version 1.09
|
|
@end example
|
|
@c used to be an option. has been fixed.
|
|
|
|
@node Interactive Operation, , Additional Information, User Interaction
|
|
@section Asking for Confirmation During Operations
|
|
@cindex Interactive operation
|
|
|
|
Typically, @code{tar} carries out a command without stopping for
|
|
further instructions. In some situations however, you
|
|
may want to exclude some files and archive members from the operation
|
|
(for instance if disk or storage space is tight). You can do this by
|
|
excluding certain files automatically (@pxref{File Exclusion}), or by
|
|
performing an operation interactively, using the @samp{+interactive}
|
|
operation.
|
|
|
|
When the @samp{+interactive} option is specified, @code{tar} asks for
|
|
confirmation before reading, writing, or deleting each file it
|
|
encounters while carrying out an operation. To confirm the action you
|
|
must type a line of input beginning with @samp{y}. If your input line
|
|
begins with anything other than @samp{y}, @code{tar} skips that file.
|
|
|
|
Commands which might be useful to perform interactively include
|
|
appending files to an archive, extracting files from an archive,
|
|
deleting a file from an archive, and deleting a file from disk during
|
|
an incremental restore.
|
|
|
|
If @code{tar} is reading the archive from the standard input,
|
|
@code{tar} opens the file @file{/dev/tty} to support the interactive
|
|
communications.
|
|
<<< this aborts if you won't OK the working directory. this is a bug. -ringo
|
|
|
|
@table @samp
|
|
@item +interactive
|
|
@itemx +confirmation
|
|
@itemx -w
|
|
Asks for confirmation before reading, writing or deleting an archive
|
|
member (when listing, comparing or writing an archive or deleting
|
|
archive members), or before writing or deleting a file (when
|
|
extracting an archive).
|
|
@end table
|
|
|
|
@node Backups and Restoration, Media, User Interaction, Top
|
|
@chapter Performing Backups and Restoring Files
|
|
|
|
To @dfn{back up} a file system means to create archives that contain
|
|
all the files in that file system. Those archives can then be used to
|
|
restore any or all of those files (for instance if a disk crashes or a
|
|
file is accidently deleted). File system @dfn{backups} are also
|
|
called @dfn{dumps}.
|
|
|
|
@menu
|
|
* Backup Levels:: Levels of backups
|
|
* Backup Scripts:: Using scripts to perform backups
|
|
and restoration
|
|
* incremental and listed-incremental:: The +incremental
|
|
and +listed-incremental Options
|
|
* Problems:: Some common problems and their solutions
|
|
@end menu
|
|
|
|
@node Backup Levels, Backup Scripts, Backups and Restoration, Backups and Restoration
|
|
@section Levels of Backups
|
|
|
|
An archive containing all the files in the file system is called a
|
|
@dfn{full backup} or @dfn{full dump}. You could insure your data by
|
|
creating a full dump every day. This strategy, however, would waste a
|
|
substantial amount of archive media and user time, as unchanged files
|
|
are daily re-archived.
|
|
|
|
It is more efficient to do a full dump only occasionally. To back up
|
|
files between full dumps, you can a incremental dump. A @dfn{level
|
|
one} dump archives all the files that have changed since the last full
|
|
dump.
|
|
|
|
A typical dump strategy would be to perform a full dump once a week,
|
|
and a level one dump once a day. This means some versions of files
|
|
will in fact be archived more than once, but this dump strategy makes
|
|
it possible to restore a file system to within one day of accuracy by
|
|
only extracting two archives---the last weekly (full) dump and the
|
|
last daily (level one) dump. The only information lost would be in
|
|
files changed or created since the last daily backup. (Doing dumps
|
|
more than once a day is usually not worth the trouble).
|
|
|
|
@node Backup Scripts, incremental and listed-incremental, Backup Levels, Backups and Restoration
|
|
@section Using Scripts to Perform Backups and Restoration
|
|
|
|
GNU @code{tar} comes with scripts you can use to do full and level-one
|
|
dumps. Using scripts (shell programs) to perform backups and
|
|
restoration is a convenient and reliable alternative to typing out
|
|
file name lists and @code{tar} commands by hand.
|
|
|
|
Before you use these scripts, you need to edit the file
|
|
@file{backup-specs}, which specifies parameters used by the backup
|
|
scripts and by the restore script. @xref{Script Syntax}.
|
|
Once the backup parameters are set, you can perform backups or
|
|
restoration by running the appropriate script.
|
|
|
|
The name of the restore script is @code{restore}. The names of the
|
|
level one and full backup scripts are, respectively, @code{level-1} and
|
|
@code{level-0}. The @code{level-0} script also exists under the name
|
|
@code{weekly}, and the @code{level-1} under the name
|
|
@code{daily}---these additional names can be changed according to your
|
|
backup schedule. @xref{Scripted Restoration}, for more information
|
|
on running the restoration script. @xref{Scripted Backups}, for more
|
|
information on running the backup scripts.
|
|
|
|
@emph{Please Note:} The backup scripts and the restoration scripts are
|
|
designed to be used together. While it is possible to restore files
|
|
by hand from an archive which was created using a backup script, and
|
|
to create an archive by hand which could then be extracted using the
|
|
restore script, it is easier to use the scripts. @xref{incremental
|
|
and listed-incremental}, before making such an attempt.
|
|
|
|
@c shorten node names
|
|
@menu
|
|
* Backup Parameters:: Setting parameters for backups and restoration
|
|
* Scripted Backups:: Using the backup scripts
|
|
* Scripted Restoration:: Using the restore script
|
|
@end menu
|
|
|
|
@node Backup Parameters, Scripted Backups, Backup Scripts, Backup Scripts
|
|
@subsection Setting Parameters for Backups and Restoration
|
|
|
|
The file @file{backup-specs} specifies backup parameters for the
|
|
backup and restoration scripts provided with @code{tar}. You must
|
|
edit @file{backup-specs} to fit your system configuration and schedule
|
|
before using these scripts.
|
|
|
|
@c <<< This about backup scripts needs to be written:
|
|
@c <<<BS is a shell script .... thus ... @file{backup-specs} is in shell
|
|
@c script syntax. @xref{Script Syntax}, for an explanation of this
|
|
@c syntax.
|
|
|
|
@c whats a parameter .... looked at by the backup scripts ... which will
|
|
@c be expecting to find ... now syntax ... value is linked to lame ...
|
|
@c @file{backup-specs} specifies the following parameters:
|
|
|
|
|
|
@table @code
|
|
@item ADMINISTRATOR
|
|
The user name of the backup administrator.
|
|
|
|
@item BACKUP_HOUR
|
|
The hour at which the backups are done. This can be a number from 0
|
|
to 23, or the string @samp{now}.
|
|
|
|
@item TAPE_FILE
|
|
The device @code{tar} writes the archive to. This device should be
|
|
attached to the host on which the dump scripts are run.
|
|
@c <<< examples for all ...
|
|
|
|
@item TAPE_STATUS
|
|
The command to use to obtain the status of the archive device,
|
|
including error count. On some tape drives there may not be such a
|
|
command; in that case, simply use `TAPE_STATUS=false'.
|
|
|
|
@item BLOCKING
|
|
The blocking factor @code{tar} will use when writing the dump archive.
|
|
@xref{Blocking Factor}.
|
|
|
|
@item BACKUP_DIRS
|
|
A list of file systems to be dumped. You can include any directory
|
|
name in the list---subdirectories on that file system will be
|
|
included, regardless of how they may look to other networked machines.
|
|
Subdirectories on other file systems will be ignored.
|
|
|
|
The host name specifies which host to run @code{tar} on, and should
|
|
normally be the host that actually contains the file system. However,
|
|
the host machine must have GNU @code{tar} installed, and must be able
|
|
to access the directory containing the backup scripts and their
|
|
support files using the same file name that is used on the machine
|
|
where the scripts are run (ie. what @code{pwd} will print when in that
|
|
directory on that machine). If the host that contains the file system
|
|
does not have this capability, you can specify another host as long as
|
|
it can access the file system through NFS.
|
|
|
|
@item BACKUP_FILES
|
|
A list of individual files to be dumped. These should be accessible
|
|
from the machine on which the backup script is run.
|
|
@c <<<same file name, be specific. through nfs ...
|
|
@end table
|
|
|
|
@menu
|
|
* backup-specs example:: An Example Text of @file{Backup-specs}
|
|
* Script Syntax:: Syntax for @file{Backup-specs}
|
|
@end menu
|
|
|
|
@node backup-specs example, Script Syntax, Backup Parameters, Backup Parameters
|
|
@subsubsection An Example Text of @file{Backup-specs}
|
|
|
|
The following is the text of @file{backup-specs} as it appears at FSF:
|
|
|
|
@example
|
|
# site-specific parameters for file system backup.
|
|
|
|
ADMINISTRATOR=friedman
|
|
BACKUP_HOUR=1
|
|
TAPE_FILE=/dev/nrsmt0
|
|
TAPE_STATUS="mts -t $TAPE_FILE"
|
|
BLOCKING=124
|
|
BACKUP_DIRS="
|
|
albert:/fs/fsf
|
|
apple-gunkies:/gd
|
|
albert:/fs/gd2
|
|
albert:/fs/gp
|
|
geech:/usr/jla
|
|
churchy:/usr/roland
|
|
albert:/
|
|
albert:/usr
|
|
apple-gunkies:/
|
|
apple-gunkies:/usr
|
|
gnu:/hack
|
|
gnu:/u
|
|
apple-gunkies:/com/mailer/gnu
|
|
apple-gunkies:/com/archive/gnu"
|
|
|
|
BACKUP_FILES="/com/mailer/aliases /com/mailer/league*[a-z]"
|
|
|
|
@end example
|
|
|
|
@node Script Syntax, , backup-specs example, Backup Parameters
|
|
@subsubsection Syntax for @file{Backup-specs}
|
|
|
|
@file{backup-specs} is in shell script syntax. The following
|
|
conventions should be considered when editing the script:
|
|
@c <<< "conventions?"
|
|
|
|
A quoted string is considered to be contiguous, even if it is on more
|
|
than one line. Therefore, you cannot include commented-out lines
|
|
within a multi-line quoted string. BACKUP_FILES and BACKUP_DIRS are
|
|
the two most likely parameters to be multi-line.
|
|
|
|
A quoted string typically cannot contain wildcards. In
|
|
@file{backup-specs}, however, the parameters BACKUP_DIRS and
|
|
BACKUP_FILES can contain wildcards.
|
|
|
|
@node Scripted Backups, Scripted Restoration, Backup Parameters, Backup Scripts
|
|
@subsection Using the Backup Scripts
|
|
|
|
The syntax for running a backup script is:
|
|
|
|
@example
|
|
@file{script-name} [@var{time-to-be-run}]
|
|
@end example
|
|
|
|
where @var{time-to-be-run} can be a specific system time, or can be
|
|
@kbd{now}. If you do not specify a time, the script runs at the time
|
|
specified in @file{backup-specs} (@pxref{Script Syntax}).
|
|
|
|
You should start a script with a tape or disk mounted. Once you start
|
|
a script, it prompts you for new tapes or disks as it needs them.
|
|
Media volumes don't have to correspond to archive files---a
|
|
multi-volume archive can be started in the middle of a tape that
|
|
already contains the end of another multi-volume archive. The
|
|
@code{restore} script prompts for media by its archive volume, so to
|
|
avoid an error message you should keep track of which tape (or disk)
|
|
contains which volume of the archive. @xref{Scripted Restoration}.
|
|
|
|
@c <<<have file names changed? -ringo
|
|
The backup scripts write two files on the file system. The first is a
|
|
record file in @file{/etc/tar-backup/}, which is used by the scripts
|
|
to store and retrieve information about which files were dumped. This
|
|
file is not meant to be read by humans, and should not be deleted by
|
|
them. @xref{incremental and listed-incremental}, for a more
|
|
detailed explanation of this file.
|
|
|
|
The second file is a log file containing the names of the file systems
|
|
and files dumped, what time the backup was made, and any error
|
|
messages that were generated, as well as how much space was left in
|
|
the media volume after the last volume of the archive was written.
|
|
You should check this log file after every backup. The file name is
|
|
@file{log-@var{mmm-ddd-yyyy}-level-1} or
|
|
@file{log-@var{mmm-ddd-yyyy}-full}.
|
|
|
|
The script also prints the name of each system being dumped to the
|
|
standard output.
|
|
@c <<<the section on restore scripts is commented out.
|
|
@c <<< a section on non-scripted testore mya be a good idea
|
|
@ignore
|
|
@node Scripted Restoration, , Scripted Backups, Backup Scripts
|
|
@subsection Using the Restore Script
|
|
@c subject to change as things develop
|
|
|
|
To restore files that were archived using a scripted backup, use the
|
|
@code{restore} script. The syntax for the script is:
|
|
|
|
|
|
where ##### are the file systems to restore from, and
|
|
##### is a regular expression which specifies which files to
|
|
restore. If you specify +all, the script restores all the files
|
|
in the file system.
|
|
|
|
You should start the restore script with the media containing the
|
|
first volume of the archive mounted. The script will prompt for other
|
|
volumes as they are needed. If the archive is on tape, you don't need
|
|
to rewind the tape to to its beginning---if the tape head is
|
|
positioned past the beginning of the archive, the script will rewind
|
|
the tape as needed. @xref{Media}, for a discussion of tape
|
|
positioning.
|
|
|
|
If you specify @samp{+all} as the @var{files} argument, the
|
|
@code{restore} script extracts all the files in the archived file
|
|
system into the active file system.
|
|
|
|
@quotation
|
|
@strong{Warning:}The script will delete files from the active file
|
|
system if they were not in the file system when the archive was made.
|
|
@end quotation
|
|
|
|
@xref{incremental and listed-incremental}, for an explanation of how
|
|
the script makes that determination.
|
|
@c this may be an option, not a given
|
|
@end ignore
|
|
|
|
@node incremental and listed-incremental, Problems, Backup Scripts, Backups and Restoration
|
|
@section The @code{+incremental} and @code{+listed-incremental} Options
|
|
|
|
@samp{+incremental} is used in conjunction with @samp{+create},
|
|
@samp{+extract} or @samp{+list} when backing up and restoring file
|
|
systems. An archive cannot be extracted or listed with the
|
|
@samp{+incremental} option specified unless it was created with the
|
|
option specified. This option should only be used by a script, not by
|
|
the user, and is usually disregarded in favor of
|
|
@samp{+listed-incremental}, which is described below.
|
|
|
|
@samp{+incremental} in conjunction with @samp{+create} causes
|
|
@code{tar} to write, at the beginning of the archive, an entry for
|
|
each of the directories that will be archived. The entry for a
|
|
directory includes a list of all the files in the directory at the
|
|
time the archive was created and a flag for each file indicating
|
|
whether or not the file is going to be put in the archive.
|
|
|
|
Note that this option causes @code{tar} to create a non-standard
|
|
archive that may not be readable by non-GNU versions of the @code{tar}
|
|
program.
|
|
|
|
@samp{+incremental} in conjunction with @samp{+extract} causes
|
|
@code{tar} to read the lists of directory contents previously stored
|
|
in the archive, @emph{delete} files in the file system that did not
|
|
exist in their directories when the archive was created, and then
|
|
extract the files in the archive.
|
|
|
|
This behavior is convenient when restoring a damaged file system from
|
|
a succession of incremental backups: it restores the entire state of
|
|
the file system to that which obtained when the backup was made. If
|
|
@samp{+incremental} isn't specified, the file system will probably
|
|
fill up with files that shouldn't exist any more.
|
|
|
|
@samp{+incremental} in conjunction with @samp{+list}, causes
|
|
@code{tar} to print, for each directory in the archive, the list of
|
|
files in that directory at the time the archive was created. This
|
|
information is put out in a format that is not easy for humans to
|
|
read, but which is unambiguous for a program: each file name is
|
|
preceded by either a @samp{Y} if the file is present in the archive,
|
|
an @samp{N} if the file is not included in the archive, or a @samp{D}
|
|
if the file is a directory (and is included in the archive). Each
|
|
file name is terminated by a null character. The last file is followed
|
|
by an additional null and a newline to indicate the end of the data.
|
|
|
|
@samp{+listed-incremental}=@var{file} acts like @samp{+incremental},
|
|
but when used in conjunction with @samp{+create} will also cause
|
|
@code{tar} to use the file @var{file}, which contains information
|
|
about the state of the file system at the time of the last backup, to
|
|
decide which files to include in the archive being created. That file
|
|
will then be updated by @code{tar}. If the file @var{file} does not
|
|
exist when this option is specified, @code{tar} will create it, and
|
|
include all appropriate files in the archive.
|
|
|
|
The file @var{file}, which is archive independent, contains the date
|
|
it was last modified and a list of devices, inode numbers and
|
|
directory names. @code{tar} will archive files with newer mod dates
|
|
or inode change times, and directories with an unchanged inode number
|
|
and device but a changed directory name. The file is updated after
|
|
the files to be archived are determined, but before the new archive is
|
|
actually created.
|
|
|
|
@c <<< this section needs to be written
|
|
@node Problems, , incremental and listed-incremental, Backups and Restoration
|
|
@section Some Common Problems and their Solutions
|
|
|
|
errors from system:
|
|
permission denied
|
|
no such file or directory
|
|
not owner
|
|
|
|
errors from tar:
|
|
directory checksum error
|
|
header format error
|
|
|
|
errors from media/system:
|
|
i/o error
|
|
device busy
|
|
|
|
@node Media, Quick Reference, Backups and Restoration, Top
|
|
@chapter Tapes and Other Archive Media
|
|
|
|
Archives are usually written on dismountable media---tape cartridges,
|
|
mag tapes, or floppy disks.
|
|
|
|
The amount of data a tape or disk holds depends not only on its size,
|
|
but also on how it is formatted. A 2400 foot long reel of mag tape
|
|
holds 40 megabytes of data when formated at 1600 bits per inch. The
|
|
physically smaller EXABYTE tape cartridge holds 2.3 gigabytes.
|
|
|
|
Magnetic media are re-usable---once the archive on a tape is no longer
|
|
needed, the archive can be erased and the tape or disk used over.
|
|
Media quality does deteriorate with use, however. Most tapes or disks
|
|
should be disgarded when they begin to produce data errors. EXABYTE
|
|
tape cartridges should be disgarded when they generate an @dfn{error
|
|
count} (number of non-usable bits) of more than 10k.
|
|
|
|
Magnetic media are written and erased using magnetic fields, and
|
|
should be protected from such fields to avoid damage to stored data.
|
|
Sticking a floppy disk to a filing cabinet using a magnet is probably
|
|
not a good idea.
|
|
|
|
|
|
@menu
|
|
* Write Protection:: Write Protection
|
|
* Tape Positioning:: Tape Positions and Tape Marks
|
|
@end menu
|
|
|
|
@node Write Protection, Tape Positioning, Media, Media
|
|
@section Write Protection
|
|
|
|
All tapes and disks can be @dfn{write protected}, to protect data on
|
|
them from being changed. Once an archive is written, you should write
|
|
protect the media to prevent the archive from being accidently
|
|
overwritten or deleted. (This will protect the archive from being
|
|
changed with a tape or floppy drive---it will not protect it from
|
|
magnet fields or other physical hazards).
|
|
|
|
The write protection device itself is usually an integral part of the
|
|
physical media, and can be a two position (write enabled/write
|
|
disabled) switch, a notch which can be popped out or covered, a ring
|
|
which can be removed from the center of a tape reel, or some other
|
|
changeable feature.
|
|
|
|
@node Tape Positioning, , Write Protection, Media
|
|
@section Tape Positions and Tape Marks
|
|
|
|
Just as archives can store more than one file from the file system,
|
|
tapes can store more than one archive file. To keep track of where
|
|
archive files (or any other type of file stored on tape) begin and
|
|
end, tape archive devices write magnetic @dfn{tape marks} on the
|
|
archive media. Tape drives write one tape mark between files,
|
|
two at the end of all the file entries.
|
|
|
|
If you think of data as a series of "0000"'s, and tape marks as "x"'s,
|
|
a tape might look like the following:
|
|
|
|
@example
|
|
0000x000000x00000x00x00000xx-------------------------
|
|
@end example
|
|
|
|
Tape devices read and write tapes using a read/write @dfn{tape
|
|
head}---a physical part of the device which can only access one point
|
|
on the tape at a time. When you use @code{tar} to read or write
|
|
archive data from a tape device, the device will begin reading or
|
|
writing from wherever on the tape the tape head happens to be,
|
|
regardless of which archive or what part of the archive the tape head
|
|
is on. Before writing an archive, you should make sure that no data
|
|
on the tape will be overwritten (unless it is no longer needed).
|
|
Before reading an archive, you should make sure the tape head is at
|
|
the beginning of the archive you want to read. (The @code{restore}
|
|
script will find the archive automatically. @xref{Scripted
|
|
Restoration}). @xref{mt}, for an explanation of the tape moving
|
|
utility.
|
|
|
|
If you want to add new archive file entries to a tape, you should
|
|
advance the tape to the end of the existing file entries, backspace
|
|
over the last tape mark, and write the new archive file. If you were
|
|
to add two archives to the example above, the tape might look like the
|
|
following:
|
|
|
|
@example
|
|
0000x000000x00000x00x00000x000x0000xx----------------
|
|
@end example
|
|
|
|
@menu
|
|
* mt:: The @code{mt} Utility
|
|
@end menu
|
|
|
|
@node mt, , Tape Positioning, Tape Positioning
|
|
@subsection The @code{mt} Utility
|
|
|
|
<<< is it true that this only works on non-block devices? should
|
|
<<< explain the difference, xref to block-size (fixed or variable).
|
|
|
|
You can use the @code{mt} utility to advance or rewind a tape past a
|
|
specified number of archive files on the tape. This will allow you to
|
|
move to the beginning of an archive before extracting or reading it,
|
|
or to the end of all the archives before writing a new one.
|
|
@c why isn't there an "advance 'til you find two tape marks together"?
|
|
|
|
The syntax of the @code{mt} command is:
|
|
|
|
@example
|
|
mt [-f @var{tapename}] @var{operation} [@var{number}]
|
|
@end example
|
|
|
|
where @var{tapename} is the name of the tape device, @var{number} is
|
|
the number of times an operation is performed (with a default of one),
|
|
and @var{operation} is one of the following:
|
|
|
|
@table @code
|
|
@item eof
|
|
@itemx weof
|
|
Writes @var{number} tape marks at the current position on the tape.
|
|
|
|
|
|
@item fsf
|
|
Moves tape position forward @var{number} files.
|
|
|
|
|
|
@item bsf
|
|
Moves tape position back @var{number} files.
|
|
|
|
|
|
@item rewind
|
|
Rewinds the tape. (Ignores @var{number}).
|
|
|
|
|
|
@item offline
|
|
@itemx rewoff1
|
|
Rewinds the tape and takes the tape device off-line. (Ignores @var{number}).
|
|
|
|
|
|
@item status
|
|
Prints status information about the tape unit.
|
|
@end table
|
|
<<< is there a better way to frob the spacing on the list? -ringo
|
|
|
|
If you don't specify a @var{tapename}, @code{mt} uses the environment
|
|
variable TAPE; if TAPE does not exist, @code{mt} uses the device
|
|
@file{/dev/rmt12}.
|
|
|
|
@code{mt} returns a 0 exit status when the operation(s) were
|
|
successful, 1 if the command was unrecognized, and 2 if an operation
|
|
failed.
|
|
|
|
@c <<< new node on how to find an archive? -ringo
|
|
If you use @code{tar +extract} with the
|
|
@samp{+label=@var{archive-name}} option specified, @code{tar} will
|
|
read an archive label (the tape head has to be positioned on it) and
|
|
print an error if the archive label doesn't match the
|
|
@var{archive-name} specified. @var{archive-name} can be any regular
|
|
expression. If the labels match, @code{tar} extracts the archive.
|
|
@xref{Archive Label}. @xref{Matching Format Parameters}.
|
|
<<< fix cross references
|
|
|
|
@code{tar +list +label} will cause @code{tar} to print the label.
|
|
|
|
@c <<< MIB -- program to list all the labels on a tape?
|
|
|
|
@node Quick Reference, Data Format Details, Media, Top
|
|
@appendix A Quick Reference Guide to @code{tar} Operations and Options
|
|
@c put in proper form for appendix. (unnumbered?)
|
|
|
|
@menu
|
|
* Operations:: A Table of Operations
|
|
* Options:: Table of Options
|
|
@end menu
|
|
|
|
@node Operations, Options, Quick Reference, Quick Reference
|
|
@appendixsec A Table of Operations
|
|
@c add xrefs, note synonyms
|
|
|
|
The operation argument to @code{tar} specifies which action you want to
|
|
take.
|
|
|
|
@table @samp
|
|
@item -A
|
|
Adds copies of an archive or archives to the end of another archive.
|
|
|
|
@item -c
|
|
Creates a new archive.
|
|
|
|
@item -d
|
|
Compares files in the archive with their counterparts in the file
|
|
system, and reports differences in file size, mode, owner,
|
|
modification date and contents.
|
|
|
|
@item -r
|
|
Adds files to the end of the archive.
|
|
|
|
@item -t
|
|
Prints a list of the contents of the archive.
|
|
|
|
@item -x
|
|
Reads files from the archive and writes them into the active file
|
|
system.
|
|
|
|
@item -u
|
|
Adds files to the end of the archive, but only if they are newer than
|
|
their counterparts already in the archive, or if they do not already
|
|
exist in the archive.
|
|
|
|
@item +add-archive
|
|
Adds copies of an archive or archives to the end of another archive.
|
|
|
|
@item +add-file
|
|
Adds files to the end of the archive.
|
|
|
|
@item +append
|
|
Adds files to the end of the archive.
|
|
|
|
@item +catenate
|
|
Adds copies of an archive or archives to the end of another archive.
|
|
|
|
@item +compare
|
|
Compares files in the archive with their counterparts in the file
|
|
system, and reports differences in file size, mode, owner,
|
|
modification date and contents.
|
|
|
|
@item +concatenate
|
|
Adds copies of an archive or archives to the end of another archive.
|
|
|
|
@item +create
|
|
Creates a new archive.
|
|
|
|
@item +delete
|
|
Deletes files from the archive. All versions of the files are deleted.
|
|
|
|
@item +diff
|
|
Compares files in the archive with their counterparts in the file
|
|
system, and reports differences in file size, mode, owner,
|
|
modification date and contents.
|
|
|
|
@item +extract
|
|
Reads files from the archive and writes them into the active file
|
|
system.
|
|
|
|
@item +get
|
|
Reads files from the archive and writes them into the active file
|
|
system.
|
|
|
|
@item +help
|
|
Prints a list of @code{tar} operations and options.
|
|
|
|
@item +list
|
|
Prints a list of the contents of the archive.
|
|
|
|
@item +update
|
|
Adds files to the end of the archive, but only if they are newer than
|
|
their counterparts already in the archive, or if they do not already
|
|
exist in the archive.
|
|
|
|
@item +version
|
|
Prints the version number of the @code{tar} program to the standard
|
|
error.
|
|
@end table
|
|
|
|
@node Options, , Operations, Quick Reference
|
|
@appendixsec Table of Options
|
|
|
|
Options change the way @code{tar} performs an operation.
|
|
|
|
@table @samp
|
|
@item +absolute-paths
|
|
WILL BE INPUT WHEN QUESTION IS RESOLVED
|
|
|
|
@item +after-date=@var{date}
|
|
Limit the operation to files changed after the given date.
|
|
@xref{File Exclusion}.
|
|
|
|
@item +block-size=@var{number}
|
|
Specify the blocking factor of an archive. @xref{Blocking Factor}.
|
|
|
|
@item +compress
|
|
Specify a compressed archive. @xref{Compressed Archives}.
|
|
|
|
@item +compress-block.
|
|
Create a whole block sized compressed archive. @xref{Compressed Archives}.
|
|
|
|
@item +confirmation
|
|
Solicit confirmation for each file. @xref{Interactive Operation}
|
|
<<< +selective should be a synonym.
|
|
|
|
@item +dereference
|
|
Treat a symbolic link as an alternate name for the file the link
|
|
points to. @xref{Symbolic Links}.
|
|
|
|
@item +directory=@file{directory}
|
|
Change the working directory. @xref{Changing Working Directory}.
|
|
|
|
@item +exclude=@var{pattern}
|
|
Exclude files which match the regular expression @var{pattern}.
|
|
@xref{File Exclusion}.
|
|
|
|
@item +exclude-from=@file{file}
|
|
Exclude files which match any of the regular expressions listed in
|
|
the file @file{file}. @xref{File Exclusion}.
|
|
|
|
@item +file=@var{archive-name}
|
|
Name the archive. @xref{Archive Name}).
|
|
|
|
@item +files-from=@file{file}
|
|
Read file-name arguments from a file on the file system.
|
|
@xref{File Name Lists}.
|
|
|
|
@item +ignore-umask
|
|
Set modes of extracted files to those recorded in the archive.
|
|
@xref{File Writing Options}.
|
|
|
|
@item +ignore-zeros
|
|
Ignore end-of-archive entries. @xref{Archive Reading Options}.
|
|
<<< this should be changed to +ignore-end
|
|
|
|
@item +listed-incremental=@var{file-name} (-g)
|
|
Take a file name argument always. If the file doesn't exist, run a level
|
|
zero dump, creating the file. If the file exists, uses that file to see
|
|
what has changed.
|
|
|
|
@item +incremental (-G)
|
|
@c <<<look it up>>>
|
|
|
|
@item +tape-length=@var{n} (-L)
|
|
@c <<<alternate way of doing multi archive, will go to that length and
|
|
@c prompts for new tape, automatically turns on multi-volume. >>>
|
|
@c <<< this needs to be written into main body as well -ringo
|
|
|
|
@item +info-script=@var{program-file}
|
|
Create a multi-volume archive via a script. @xref{Multi-Volume Archives}.
|
|
|
|
@item +interactive
|
|
Ask for confirmation before performing any operation on a file or
|
|
archive member.
|
|
|
|
@item +keep-old-files
|
|
Prevent overwriting during extraction. @xref{File Writing Options}.
|
|
|
|
@item +label=@var{archive-label}
|
|
Include an archive-label in the archive being created. @xref{Archive
|
|
Label}.
|
|
|
|
@item +modification-time
|
|
Set the modification time of extracted files to the time they were
|
|
extracted. @xref{File Writing Options}.
|
|
|
|
@item +multi-volume
|
|
Specify a multi-volume archive. @xref{Multi-Volume Archives}.
|
|
|
|
@item +newer=@var{date}
|
|
Limit the operation to files changed after the given date.
|
|
@xref{File Exclusion}.
|
|
|
|
@item +newer-mtime=@var{date}
|
|
Limit the operation to files modified after the given date. @xref{File
|
|
Exclusion}.
|
|
|
|
@item +old
|
|
Create an old format archive. @xref{Old Style File Information}.
|
|
@c <<< did we agree this should go away as a synonym?
|
|
|
|
@item +old-archive
|
|
Create an old format archive. @xref{Old Style File Information}.
|
|
|
|
@item +one-file-system
|
|
Prevent @code{tar} from crossing file system boundaries when
|
|
archiving. @xref{File Exclusion}.
|
|
|
|
@item +portable
|
|
Create an old format archive. @xref{Old Style File Information}.
|
|
@c <<< was portability, may still need to be changed
|
|
|
|
@item +preserve-order
|
|
Help process large lists of file-names on machines with small amounts of
|
|
memory. @xref{Archive Reading Options}.
|
|
|
|
@item +preserve-permission
|
|
Set modes of extracted files to those recorded in the archive.
|
|
@xref{File Writing Options}.
|
|
|
|
@item +read-full-blocks
|
|
Read an archive with a smaller than specified block size or which
|
|
contains incomplete blocks. @xref{Archive Reading Options}).
|
|
@c should be +partial-blocks (!!!)
|
|
|
|
@item +record-number
|
|
Print the record number where a message is generated.
|
|
@xref{Additional Information}.
|
|
|
|
@item +same-order
|
|
Help process large lists of file-names on machines with small amounts of
|
|
memory. @xref{Archive Reading Options}.
|
|
|
|
@item +same-permission
|
|
Set the modes of extracted files to those recorded in the archive.
|
|
@xref{File Writing Options}.
|
|
|
|
@item +sparse
|
|
Archive sparse files sparsely. @xref{Sparse Files}.
|
|
|
|
@item +starting-file=@var{file-name}
|
|
Begin reading in the middle of an archive. @xref{Scarce Disk Space}.
|
|
|
|
@item +to-stdout
|
|
Write files to the standard output. @xref{File Writing Options}.
|
|
|
|
@item +uncompress
|
|
Specifdo a compressed archive. @xref{Compressed Archives}.
|
|
|
|
@item -V @var{archive-label}
|
|
Include an archive-label in the archive being created. @xref{Archive
|
|
Label}.
|
|
@c was +volume
|
|
|
|
@item +verbose
|
|
Print the names of files or archive members as they are being
|
|
operated on. @xref{Additional Information}.
|
|
|
|
@item +verify
|
|
Check for discrepancies in the archive immediately after it is
|
|
written. @xref{Write Verification}.
|
|
|
|
@item -B
|
|
Read an archive with a smaller than specified block size or which
|
|
contains incomplete blocks. @xref{Archive Reading Options}).
|
|
|
|
@item -K @var{file-name}
|
|
Begin reading in the middle of an archive. @xref{Scarce Disk Space}.
|
|
|
|
@item -M
|
|
Specify a multi-volume archive. @xref{Multi-Volume Archives}.
|
|
|
|
@item -N @var{date}
|
|
Limit operation to files changed after the given date. @xref{File Exclusion}.
|
|
|
|
@item -O
|
|
Write files to the standard output. @xref{File Writing Options}.
|
|
|
|
@c <<<<- P is absolute paths, add when resolved. -ringo>>>
|
|
|
|
@item -R
|
|
Print the record number where a message is generated.
|
|
@xref{Additional Information}.
|
|
|
|
@item -S
|
|
Archive sparse files sparsely. @xref{Sparse Files}.
|
|
|
|
@item -T @var{file}
|
|
Read file-name arguments from a file on the file system.
|
|
@xref{File Name Lists}.
|
|
|
|
@item -W
|
|
Check for discrepancies in the archive immediately after it is
|
|
written. @xref{Write Verification}.
|
|
|
|
@item -Z
|
|
Specify a compressed archive. @xref{Compressed Archives}.
|
|
|
|
@item -b @var{number}
|
|
Specify the blocking factor of an archive. @xref{Blocking Factor}.
|
|
|
|
@item -f @var{archive-name}
|
|
Name the archive. @xref{Archive Name}).
|
|
|
|
@item -h
|
|
Treat a symbolic link as an alternate name for the file the link
|
|
points to. @xref{Symbolic Links}.
|
|
|
|
@item -i
|
|
Ignore end-of-archive entries. @xref{Archive Reading Options}.
|
|
|
|
@item -k
|
|
Prevent overwriting during extraction. @xref{File Writing Options}.
|
|
|
|
@item -l
|
|
Prevent @code{tar} from crossing file system boundaries when
|
|
archiving. @xref{File Exclusion}.
|
|
|
|
@item -m
|
|
Set the modification time of extracted files to the time they were
|
|
extracted. @xref{File Writing Options}.
|
|
|
|
@item -o
|
|
Create an old format archive. @xref{Old Style File Information}.
|
|
|
|
@item -p
|
|
Set the modes of extracted files to those recorded in the archive.
|
|
@xref{File Writing Options}.
|
|
|
|
@item -s
|
|
Help process large lists of file-names on machines with small amounts of
|
|
memory. @xref{Archive Reading Options}.
|
|
|
|
@item -v
|
|
Print the names of files or archive members they are being operated
|
|
on. @xref{Additional Information}.
|
|
|
|
@item -w
|
|
@c <<<see +interactive. WILL BE INPUT WHEN QUESTIONS ARE RESOLVED.>>>
|
|
|
|
@item -z
|
|
Specify a compressed archive. @xref{Compressed Archives}.
|
|
|
|
@item -z -z
|
|
Create a whole block sized compressed archive. @xref{Compressed Archives}.
|
|
@c I would rather this were -Z. it is the only double letter short
|
|
@c form.
|
|
|
|
@item -C @file{directory}
|
|
Change the working directory. @xref{Changing Working Directory}.
|
|
|
|
@item -F @var{program-file}
|
|
Create a multi-volume archive via a script. @xref{Multi-Volume Archives}.
|
|
|
|
@item -X @file{file}
|
|
Exclude files which match any of the regular expressions listed in
|
|
the file @file{file}. @xref{File Exclusion}.
|
|
@end table
|
|
|
|
@node Data Format Details, Concept Index, Quick Reference, Top
|
|
@appendix Details of the Archive Data Format
|
|
|
|
This chapter is based heavily on John Gilmore's @i{tar}(5) manual page
|
|
for the public domain @code{tar} that GNU @code{tar} is based on.
|
|
@c it's been majorly edited since, we may be able to lose this.
|
|
|
|
The archive media contains a series of records, each of which contains
|
|
512 bytes. Each archive member is represented by a header record,
|
|
which describes the file, followed by zero or more records which
|
|
represent the contents of the file. At the end of the archive file
|
|
there may be a record consisting of a series of binary zeros, as an
|
|
end-of-archive marker. GNU @code{tar} writes a record of zeros at the
|
|
end of an archive, but does not assume that such a record exists when
|
|
reading an archive.
|
|
|
|
Records may be grouped into @dfn{blocks} for I/O operations. A block
|
|
of records is written with a single @code{write()} operation. The
|
|
number of records in a block is specified using the @samp{+block-size}
|
|
option. @xref{Blocking Factor}, for more information about specifying
|
|
block size.
|
|
|
|
@menu
|
|
* Header Data:: The Distribution of Data in the Header
|
|
* Header Fields:: The Meaning of Header Fields
|
|
* Sparse File Handling:: Fields to Handle Sparse Files
|
|
@end menu
|
|
|
|
@node Header Data, Header Fields, Data Format Details, Data Format Details
|
|
@appendixsec The Distribution of Data in the Header
|
|
|
|
The header record is defined in C as follows:
|
|
@c I am taking the following code on faith.
|
|
|
|
@example
|
|
@r{Standard Archive Format - Standard TAR - USTAR}
|
|
|
|
#define RECORDSIZE 512
|
|
#define NAMSIZ 100
|
|
#define TUNMLEN 32
|
|
#define TGNMLEN 32
|
|
#define SPARSE_EXT_HDR 21
|
|
#define SPARSE_IN_HDR 4
|
|
|
|
struct sparse @{
|
|
char offset[12];
|
|
char numbytes[12];
|
|
@};
|
|
|
|
union record @{
|
|
char charptr[RECORDSIZE];
|
|
struct header @{
|
|
char name[NAMSIZ];
|
|
char mode[8];
|
|
char uid[8];
|
|
char gid[8];
|
|
char size[12];
|
|
char mtime[12];
|
|
char chksum[8];
|
|
char linkflag;
|
|
char linkname[NAMSIZ];
|
|
char magic[8];
|
|
char uname[TUNMLEN];
|
|
char gname[TGNMLEN];
|
|
char devmajor[8];
|
|
char devminor[8];
|
|
|
|
@r{The following fields were added by gnu and are not used by other}
|
|
@r{versions of @code{tar}}.
|
|
char atime[12];
|
|
char ctime[12];
|
|
char offset[12];
|
|
char longnames[4];
|
|
@r{The next three fields were added by gnu to deal with shrinking down}
|
|
@r{sparse files.}
|
|
struct sparse sp[SPARSE_IN_HDR];
|
|
char isextended;
|
|
@r{This is the number of nulls at the end of the file, if any.}
|
|
char ending_blanks[12];
|
|
|
|
@} header;
|
|
|
|
struct extended_header @{
|
|
struct sparse sp[21];
|
|
char isextended;
|
|
@} ext_hdr;
|
|
|
|
@};
|
|
@c <<< this whole thing needs to be put into better english
|
|
|
|
@r{The checksum field is filled with this while the checksum is computed.}
|
|
#define CHKBLANKS " " @r{8 blanks, no null}
|
|
|
|
@r{Inclusion of this field marks an archive as being in standard}
|
|
@r{Posix format (though GNU tar itself is not Posix conforming). GNU}
|
|
@r{tar puts "ustar" in this field if uname and gname are valid.}
|
|
#define TMAGIC "ustar " @r{7 chars and a null}
|
|
|
|
@r{The magic field is filled with this if this is a GNU format dump entry.}
|
|
#define GNUMAGIC "GNUtar " @r{7 chars and a null}
|
|
|
|
@r{The linkflag defines the type of file.}
|
|
#define LF_OLDNORMAL '\0' @r{Normal disk file, Unix compatible}
|
|
#define LF_NORMAL '0' @r{Normal disk file}
|
|
#define LF_LINK '1' @r{Link to previously dumped file}
|
|
#define LF_SYMLINK '2' @r{Symbolic link}
|
|
#define LF_CHR '3' @r{Character special file}
|
|
#define LF_BLK '4' @r{Block special file}
|
|
#define LF_DIR '5' @r{Directory}
|
|
#define LF_FIFO '6' @r{FIFO special file}
|
|
#define LF_CONTIG '7' @r{Contiguous file}
|
|
|
|
@r{hhe following are further link types which were defined later.}
|
|
|
|
@r{This is a dir entry that contains the names of files that were in}
|
|
@r{the dir at the time the dump was made.}
|
|
#define LF_DUMPDIR 'D'
|
|
|
|
@r{This is the continuation of a file that began on another volume}
|
|
#define LF_MULTIVOL 'M'
|
|
|
|
@r{This is for sparse files}
|
|
#define LF_SPARSE 'S'
|
|
|
|
@r{This file is a tape/volume header. Ignore it on extraction.}
|
|
#define LF_VOLHDR 'V'
|
|
|
|
@r{These are bits used in the mode field - the values are in octal}
|
|
#define TSUID 04000 @r{Set UID on execution}
|
|
#define TSGID 02000 @r{Set GID on execution}
|
|
#define TSVTX 01000 @r{Save text (sticky bit)}
|
|
|
|
@r{These are file permissions}
|
|
#define TUREAD 00400 @r{read by owner}
|
|
#define TUWRITE 00200 @r{write by owner}
|
|
#define TUEXEC 00100 @r{execute/search by owner}
|
|
#define TGREAD 00040 @r{read by group}
|
|
#define TGWRITE 00020 @r{write by group}
|
|
#define TGEXEC 00010 @r{execute/search by group}
|
|
#define TOREAD 00004 @r{read by other}
|
|
#define TOWRITE 00002 @r{write by other}
|
|
#define TOEXEC 00001 @r{execute/search by other}
|
|
@end example
|
|
|
|
|
|
All characters in headers are 8-bit characters in the local variant of
|
|
ASCII. Each field in the header is contiguous; that is, there is no
|
|
padding in the header format.
|
|
|
|
Data representing the contents of files is not translated in any way
|
|
and is not constrained to represent characters in any character set.
|
|
@code{tar} does not distinguish between text files and binary files.
|
|
|
|
The @code{name}, @code{linkname}, @code{magic}, @code{uname}, and
|
|
@code{gname} fields contain null-terminated character strings. All
|
|
other fields contain zero-filled octal numbers in ASCII. Each numeric
|
|
field of width @var{w} contains @var{w} @minus{} 2 digits, a space, and a
|
|
null, except @code{size} and @code{mtime}, which do not contain the
|
|
trailing null.
|
|
|
|
@node Header Fields, Sparse File Handling, Header Data, Data Format Details
|
|
@appendixsec The Meaning of Header Fields
|
|
|
|
The @code{name} field contains the name of the file.
|
|
<<< how big a name before field overflows?
|
|
|
|
The @code{mode} field contains nine bits which specify file
|
|
permissions, and three bits which specify the Set UID, Set GID, and
|
|
Save Text (``stick'') modes. Values for these bits are defined above.
|
|
@xref{File Writing Options}, for information on how file permissions
|
|
and modes are used by @code{tar}.
|
|
|
|
The @code{uid} and @code{gid} fields contain the numeric user and
|
|
group IDs of the file owners. If the operating system does not
|
|
support numeric user or group IDs, these fields should be ignored.
|
|
@c but are they?
|
|
|
|
The @code{size} field contains the size of the file in bytes; this
|
|
field contains a zero if the header describes a link to a file.
|
|
|
|
The @code{mtime} field contains the modification time of the file.
|
|
This is the ASCII representation of the octal value of the last time
|
|
the file was modified, represented as an integer number of seconds
|
|
since January 1, 1970, 00:00 Coordinated Universal Time.
|
|
@xref{File Writing Options}, for a description of how @code{tar} uses
|
|
this information.
|
|
|
|
The @code{chksum} field contains the ASCII representation of the octal
|
|
value of the simple sum of all bytes in the header record. To
|
|
generate this sum, each 8-bit byte in the header is added to an
|
|
unsigned integer, which has been initialized to zero. The precision
|
|
of the integer is seventeen bits. When calculating the checksum, the
|
|
@code{chksum} field itself is treated as blank.
|
|
|
|
The @code{atime} and @code{ctime} fields are used when making
|
|
incremental backups; they store, respectively, the file's access time
|
|
and last inode-change time.
|
|
|
|
The value in the @code{offset} field is used when making a
|
|
multi-volume archive. The offset is number of bytes into the file
|
|
that we need to go to pick up where we left off in the previous
|
|
volume, i.e the location that a continued file is continued from.
|
|
|
|
The @code{longnames} field supports a feature that is not yet
|
|
implemented. This field should be empty.
|
|
|
|
The @code{magic} field indicates that this archive was output in the
|
|
P1003 archive format. If this field contains @code{TMAGIC}, the
|
|
@code{uname} and @code{gname} fields will contain the ASCII
|
|
representation of the owner and group of the file respectively. If
|
|
found, the user and group IDs are used rather than the values in the
|
|
@code{uid} and @code{gid} fields.
|
|
|
|
The @code{sp} field is used to archive sparse files efficiently.
|
|
@xref{Sparse File Handling}, for a description of this field, and
|
|
other fields it may imply.
|
|
|
|
The @code{typeflag} field specifies the file's type. If a particular
|
|
implementation does not recognize or permit the specified type,
|
|
@code{tar} extracts the file as if it were a regular file, and reports
|
|
the discrepancy on the standard error. @xref{File Types}. @xref{GNU
|
|
File Types}.
|
|
|
|
@menu
|
|
* File Types:: File Types
|
|
* GNU File Types:: Additional File Types Supported by GNU
|
|
@end menu
|
|
|
|
@node File Types, GNU File Types, Header Fields, Header Fields
|
|
@appendixsubsec File Types
|
|
|
|
The following flags are used to describe file types:
|
|
|
|
@table @code
|
|
@item LF_NORMAL
|
|
@itemx LF_OLDNORMAL
|
|
Indicates a regular file. In order to be compatible with older
|
|
versions of @code{tar}, a @code{typeflag} value of @code{LF_OLDNORMAL}
|
|
should be silently recognized as a regular file. New archives should
|
|
be created using @code{LF_NORMAL} for regular files. For backward
|
|
compatibility, @code{tar} treats a regular file whose name ends with a
|
|
slash as a directory.
|
|
|
|
@item LF_LINK
|
|
Indicates a link to another file, of any type, which has been
|
|
previously archived. @code{tar} identifies linked files in Unix by
|
|
matching device and inode numbers. The linked-to name is specified in
|
|
the @code{linkname} field with a trailing null.
|
|
|
|
@item LF_SYMLINK
|
|
Indicates a symbolic link to another file. The linked-to
|
|
name is specified in the @code{linkname} field with a trailing null.
|
|
@xref{File Writing Options}, for information on archiving files
|
|
referenced by a symbolic link.
|
|
|
|
@item LF_CHR
|
|
@itemx LF_BLK
|
|
Indicate character special files and block special files,
|
|
respectively. In this case the @code{devmajor} and @code{devminor}
|
|
fields will contain the major and minor device numbers. Operating
|
|
systems may map the device specifications to their own local
|
|
specification, or may ignore the entry.
|
|
|
|
@item LF_DIR
|
|
Indicates a directory or sub-directory. The directory name in the
|
|
@code{name} field should end with a slash. On systems where disk
|
|
allocation is performed on a directory basis, the @code{size} field
|
|
will contain the maximum number of bytes (which may be rounded to the
|
|
nearest disk block allocation unit) that the directory can hold. A
|
|
@code{size} field of zero indicates no size limitations. Systems that
|
|
do not support size limiting in this manner should ignore the
|
|
@code{size} field.
|
|
|
|
@item LF_FIFO
|
|
Indicates a FIFO special file. Note that archiving a FIFO file
|
|
archives the existence of the file and not its contents.
|
|
|
|
@item LF_CONTIG
|
|
Indicates a contiguous file. Contiguous files are the same as normal
|
|
files except that, in operating systems that support it, all the
|
|
files' disk space is allocated contiguously. Operating systems which
|
|
do not allow contiguous allocation should silently treat this type as
|
|
a normal file.
|
|
|
|
@item 'A' @dots{}
|
|
@itemx 'Z'
|
|
These are reserved for custom implementations. Some of these are used
|
|
in the GNU modified format, which is described below. @xref{GNU File
|
|
Types}.
|
|
@end table
|
|
|
|
Certain other flag values are reserved for specification in future
|
|
revisions of the P1003 standard, and should not be used by any
|
|
@code{tar} program.
|
|
|
|
@node GNU File Types, , File Types, Header Fields
|
|
@appendixsubsec Additional File Types Supported by GNU
|
|
|
|
GNU @code{tar} uses additional file types to describe new types of
|
|
files in an archive. These are listed below.
|
|
|
|
@table @code
|
|
@item LF_DUMPDIR
|
|
@itemx 'D'
|
|
Indicates a directory and a list of files created by the
|
|
@samp{+incremental} option. The @code{size} field gives the total
|
|
size of the associated list of files. Each file name is preceded by
|
|
either a @code{'Y'} (the file should be in this archive) or an
|
|
@code{'N'} (the file is a directory, or is not stored in the archive).
|
|
Each file name is terminated by a null. There is an additional null
|
|
after the last file name.
|
|
|
|
@item LF_MULTIVOL
|
|
@itemx 'M'
|
|
Indicates a file continued from another volume of a multi-volume
|
|
archive (@pxref{Multi-Volume Archives}). The original type of the file is not
|
|
given here. The @code{size} field gives the maximum size of this
|
|
piece of the file (assuming the volume does not end before the file is
|
|
written out). The @code{offset} field gives the offset from the
|
|
beginning of the file where this part of the file begins. Thus
|
|
@code{size} plus @code{offset} should equal the original size of the
|
|
file.
|
|
|
|
@item LF_SPARSE
|
|
@itemx 'S'
|
|
Indicates a sparse file. @xref{Sparse Files}. @xref{Sparse File
|
|
Handling}.
|
|
|
|
@item LF_VOLHDR
|
|
@itemx 'V'
|
|
Marks an archive label that was created using the @samp{+label} option
|
|
when the archive was created (@pxref{Archive Label}. The @code{name}
|
|
field contains the argument to the option. The @code{size} field is
|
|
zero. Only the first file in each volume of an archive should have
|
|
this type.
|
|
@end table
|
|
|
|
@node Sparse File Handling, , Header Fields, Data Format Details
|
|
@appendixsec Fields to Handle Sparse Files
|
|
|
|
The following header information was added to deal with sparse files
|
|
(@pxref{Sparse Files}):
|
|
|
|
@c TALK TO MIB
|
|
The @code{sp} field (fields? something else?) is an array of
|
|
@code{struct sparse}. Each @code{struct sparse} contains two
|
|
12-character strings, which represent the offset into the file and the
|
|
number of bytes to be written at that offset. The offset is absolute,
|
|
and not relative to the offset in preceding array elements.
|
|
|
|
The header can contain four of these @code{struct sparse}; if more are
|
|
needed, they are not stored in the header, instead, the flag
|
|
@code{isextended} is set and the next record is an
|
|
@code{extended_header}.
|
|
@c @code{extended_header} or @dfn{extended_header} ??? the next
|
|
@c record after the header, or in the middle of it.
|
|
|
|
The @code{isextended} flag is only set for sparse files, and then only
|
|
if extended header records are needed when archiving the file.
|
|
|
|
Each extended header record can contain an array of 21 sparse
|
|
structures, as well as another @code{isextended} flag. There is no
|
|
limit (except that implied by the archive media) on the number of
|
|
extended header records that can be used to describe a sparse file.
|
|
|
|
@c so is @code{extended_header} the right way to write this?
|
|
|
|
@node Concept Index, , Data Format Details, Top
|
|
@unnumbered Concept Index
|
|
|
|
@printindex cp
|
|
|
|
@summarycontents
|
|
@contents
|
|
@bye
|
|
|
|
|