@smallbook
@c %**end of header
+@c Maintenance notes:
+@c 1. Pay attention to @FIXME{}s and @UNREVISED{}s
+@c 2. Before creating final variant:
+@c 2.1. Run `make check-options' to make sure all options are properly
+@c documented;
+@c 2.2. Run `make master-menu' (see comment before the master menu).
+
@include rendition.texi
@include value.texi
+@defcodeindex op
+
@c Put everything in one index (arbitrarily chosen to be the concept index).
@syncodeindex fn cp
@syncodeindex ky cp
@syncodeindex pg cp
@syncodeindex vr cp
-@defindex op
-
@copying
This manual is for @acronym{GNU} @command{tar} (version
* Changes::
* Configuring Help Summary::
-* Genfile::
* Tar Internals::
+* Genfile::
* Free Software Needs Free Documentation::
* Copying This Manual::
* Index of Command Line Options::
The Three Option Styles
-* Mnemonic Options:: Mnemonic Option Style
+* Long Options:: Long Option Style
* Short Options:: Short Option Style
* Old Options:: Old Option Style
* Mixing:: Mixing Option Styles
Options Used by @option{--create}
+* override:: Overriding File Metadata.
* Ignore Failed Read::
Options Used by @option{--extract}
* posix:: @acronym{POSIX} archives
* Checksumming:: Checksumming Problems
* Large or Negative Values:: Large files, negative time stamps, etc.
+* Other Tars:: How to Extract GNU-Specific Data Using
+ Other @command{tar} Implementations
@GNUTAR{} and @acronym{POSIX} @command{tar}
* PAX keywords:: Controlling Extended Header Keywords.
+How to Extract GNU-Specific Data Using Other @command{tar} Implementations
+
+* Split Recovery:: Members Split Between Volumes
+* Sparse Recovery:: Sparse Members
+
Using Less Space through Compression
* gzip:: Creating and Reading Compressed Archives
* Tarcat:: Concatenate Volumes into a Single Archive
-Genfile
-
-* Generate Mode:: File Generation Mode.
-* Status Mode:: File Status Mode.
-* Exec Mode:: Synchronous Execution mode.
-
Tar Internals
* Standard:: Basic Tar Format
* Extensions:: @acronym{GNU} Extensions to the Archive Format
+* Sparse Formats:: Storing Sparse Files
* Snapshot Files::
* Dumpdir::
+Storing Sparse Files
+
+* Old GNU Format::
+* PAX 0:: PAX Format, Versions 0.0 and 0.1
+* PAX 1:: PAX Format, Version 1.0
+
+Genfile
+
+* Generate Mode:: File Generation Mode.
+* Status Mode:: File Status Mode.
+* Exec Mode:: Synchronous Execution mode.
+
Copying This Manual
* GNU Free Documentation License:: License for copying this manual
You can use @command{tar} archives in many ways. We want to stress a few
of them: storage, backup, and transportation.
-@FIXME{the following table entries need a bit of work..}
+@FIXME{the following table entries need a bit of work.}
@table @asis
@item Storage
Often, @command{tar} archives are used to store related files for
exist in @GNUTAR{} for compatibility with Unix
@command{tar}. In this book we present a full discussion of this way
of writing options and operations (@pxref{Old Options}), and we discuss
-the other two styles of writing options (@xref{Mnemonic Options}, and
+the other two styles of writing options (@xref{Long Options}, and
@pxref{Short Options}).
In the examples and in the text of this tutorial, we usually use the
two different ways. People sometimes refer to @command{tar} ``commands''.
A @command{tar} @dfn{command} is the entire command line of user input
which tells @command{tar} what to do --- including the operation, options,
-and any arguments (file names, pipes, other commands, etc). However,
+and any arguments (file names, pipes, other commands, etc.). However,
you will also sometimes hear the term ``the @command{tar} command''. When
the word ``command'' is used specifically like this, a person is usually
referring to the @command{tar} @emph{operation}, not the whole line.
@unnumberedsubsec The @option{--file} Option
@table @option
-@opindex file, tutorial
+@xopindex{file, tutorial}
@item --file=@var{archive-name}
@itemx -f @var{archive-name}
Specify the name of an archive file.
@unnumberedsubsec The @option{--verbose} Option
@table @option
-@opindex verbose, introduced
+@xopindex{verbose, introduced}
@item --verbose
@itemx -v
Show the files being worked on as @command{tar} is running.
Later in the tutorial, we will give examples using @w{@option{--verbose
--verbose}}.
+@anchor{verbose member listing}
The full output consists of six fields:
@itemize @bullet
The archive member is a GNU @dfn{volume header} (@pxref{Tape Files}).
@item --Continued at byte @var{n}--
-Encountered only at the beginning of a multy-volume archive
+Encountered only at the beginning of a multi-volume archive
(@pxref{Using Multiple Tapes}). This archive member is a continuation
from the previous volume. The number @var{n} gives the offset where
the original file was split.
@node Creating the archive
@subsection Creating the Archive
-@opindex create, introduced
+@xopindex{create, introduced}
To place the files @file{blues}, @file{folk}, and @file{jazz} into an
archive named @file{collection.tar}, use the following command:
easiest to understand (and we encourage you to do the same when you use
@command{tar}, to avoid errors).
-Note that the part of the command which says,
-@w{@option{--file=collection.tar}} is considered to be @emph{one} argument.
+Note that the sequence
+@option{--file=@-collection.tar} is considered to be @emph{one} argument.
If you substituted any other string of characters for
@kbd{collection.tar}, then that string would become the name of the
archive file you create.
@node create verbose
@subsection Running @option{--create} with @option{--verbose}
-@opindex create, using with @option{--verbose}
-@opindex verbose, using with @option{--create}
+@xopindex{create, using with @option{--verbose}}
+@xopindex{verbose, using with @option{--create}}
If you include the @option{--verbose} (@option{-v}) option on the command line,
@command{tar} will list the files it is acting on as it is working. In
verbose mode, the @code{create} example above would appear as:
@opindex list
Frequently, you will find yourself wanting to determine exactly what a
-particular archive contains. You can use the @option{--list} (@option{-t}) operation
-to get the member names as they currently appear in the archive, as well
-as various attributes of the files at the time they were archived. For
-example, you can examine the archive @file{collection.tar} that you
-created in the last section with the command,
+particular archive contains. You can use the @option{--list}
+(@option{-t}) operation to get the member names as they currently
+appear in the archive, as well as various attributes of the files at
+the time they were archived. For example, you can examine the archive
+@file{collection.tar} that you created in the last section with the
+command,
@smallexample
$ @kbd{tar --list --file=collection.tar}
@var{archive-name}}) option just as with @option{--create}
(@option{-c}) to specify the name of the archive.
-@opindex list, using with @option{--verbose}
-@opindex verbose, using with @option{--list}
+@xopindex{list, using with @option{--verbose}}
+@xopindex{verbose, using with @option{--list}}
If you use the @option{--verbose} (@option{-v}) option with
@option{--list}, then @command{tar} will print out a listing
-reminiscent of @w{@samp{ls -l}}, showing owner, file size, and so forth.
+reminiscent of @w{@samp{ls -l}}, showing owner, file size, and so
+forth. This output is described in detail in @ref{verbose member listing}.
If you had used @option{--verbose} (@option{-v}) mode, the example
above would look like:
@end table
@cindex File name arguments, using @option{--list} with
-@opindex list, using with file name arguments
+@xopindex{list, using with file name arguments}
You can specify one or more individual member names as arguments when
using @samp{list}. In this case, @command{tar} will only list the
names of members you identify. For example, @w{@kbd{tar --list
--file=afiles.tar apple}} would only print @file{apple}.
Because @command{tar} preserves paths, file names must be specified as
-they appear in the archive (ie., relative to the directory from which
+they appear in the archive (i.e., relative to the directory from which
the archive was created). Therefore, it is essential when specifying
member names to @command{tar} that you give the exact member names.
For example, @w{@kbd{tar --list --file=bfiles.tar birds}} would produce an
clearly diagnosed on @code{stderr}, after a line stating the nature of
the error.
-@GNUTAR{} returns only a few exit statuses. I'm really
-aiming simplicity in that area, for now. If you are not using the
-@option{--compare} @option{--diff}, @option{-d}) option, zero means
-that everything went well, besides maybe innocuous warnings. Nonzero
-means that something went wrong. Right now, as of today, ``nonzero''
-is almost always 2, except for remote operations, where it may be
-128.
+Possible exit codes of @GNUTAR{} are summarized in the following
+table:
+
+@table @asis
+@item 0
+@samp{Successful termination}.
+
+@item 1
+@samp{Some files differ}. If tar was invoked with @option{--compare}
+(@option{--diff}, @option{-d}) command line option, this means that
+some files in the archive differ from their disk counterparts
+(@pxref{compare}). If tar was given @option{--create},
+@option{--append} or @option{--update} option, this exit code means
+that some files were changed while being archived and so the resulting
+archive does not contain the exact copy of the file set.
+
+@item 2
+@samp{Fatal error}. This means that some fatal, unrecoverable error
+occurred.
+@end table
+
+If @command{tar} has invoked a subprocess and that subprocess exited with a
+nonzero exit code, @command{tar} exits with that code as well.
+This can happen, for example, if @command{tar} was given some
+compression option (@pxref{gzip}) and the external compressor program
+failed. Another example is @command{rmt} failure during backup to the
+remote device (@pxref{Remote Tape Server}).
@node using tar options
@section Using @command{tar} Options
to note these differences, and only use the option style(s) which
makes the most sense to you until you feel comfortable with the others.
-Some options @emph{may} take an argument (currently, there are
-two such options: @option{--backup} and @option{--occurrence}). Such
-options may have at most long and short forms, they do not have old style
-equivalent. The rules for specifying an argument for such options
-are stricter than those for specifying mandatory arguments. Please,
-pay special attention to them.
+Some options @emph{may} take an argument. Such options may have at
+most long and short forms, they do not have old style equivalent. The
+rules for specifying an argument for such options are stricter than
+those for specifying mandatory arguments. Please, pay special
+attention to them.
@menu
-* Mnemonic Options:: Mnemonic Option Style
+* Long Options:: Long Option Style
* Short Options:: Short Option Style
* Old Options:: Old Option Style
* Mixing:: Mixing Option Styles
@end menu
-@node Mnemonic Options
-@subsection Mnemonic Option Style
-
-@FIXME{have to decide whether or not to replace other occurrences of
-"mnemonic" with "long", or *ugh* vice versa.}
+@node Long Options
+@subsection Long Option Style
-Each option has at least one long (or mnemonic) name starting with two
+Each option has at least one @dfn{long} (or @dfn{mnemonic}) name starting with two
dashes in a row, e.g., @option{--list}. The long names are more clear than
their corresponding short or old names. It sometimes happens that a
-single mnemonic option has many different different names which are
+single long option has many different different names which are
synonymous, such as @option{--compare} and @option{--diff}. In addition,
long option names can be given unique abbreviations. For example,
@option{--cre} can be used in place of @option{--create} because there is no
-other mnemonic option which begins with @samp{cre}. (One way to find
+other long option which begins with @samp{cre}. (One way to find
this out is by trying it and seeing what happens; if a particular
abbreviation could represent more than one option, @command{tar} will tell
you that that abbreviation is ambiguous and you'll know that that
unique abbreviation for the long name of an option you didn't want to
use, you are stuck; @command{tar} will perform the command as ordered.)
-Mnemonic options are meant to be obvious and easy to remember, and their
+Long options are meant to be obvious and easy to remember, and their
meanings are generally easier to discern than those of their
corresponding short options (see below). For example:
gives a fairly good set of hints about what the command does, even
for those not fully acquainted with @command{tar}.
-Mnemonic options which require arguments take those arguments
+Long options which require arguments take those arguments
immediately following the option name. There are two ways of
specifying a mandatory argument. It can be separated from the
option name either by an equal sign, or by any amount of
@node Short Options
@subsection Short Option Style
-Most options also have a short option name. Short options start with
+Most options also have a @dfn{short option} name. Short options start with
a single dash, and are followed by a single character, e.g., @option{-t}
(which is equivalent to @option{--list}). The forms are absolutely
identical in function; they are interchangeable.
@subsection Old Option Style
@UNREVISED
-Like short options, old options are single letters. However, old options
+Like short options, @dfn{old options} are single letters. However, old options
must be written together as a single clumped set, without spaces separating
them or dashes preceding them@footnote{Beware that if you precede options
with a dash, you are announcing the short option style instead of the
anywhere else. The letter of an old option is exactly the same letter as
the corresponding short option. For example, the old option @samp{t} is
the same as the short option @option{-t}, and consequently, the same as the
-mnemonic option @option{--list}. So for example, the command @w{@samp{tar
+long option @option{--list}. So for example, the command @w{@samp{tar
cv}} specifies the option @option{-v} in addition to the operation @option{-c}.
When options that need arguments are given together with the command,
All three styles may be intermixed in a single @command{tar} command,
so long as the rules for each style are fully
respected@footnote{Before @GNUTAR{} version 1.11.6,
-a bug prevented intermixing old style options with mnemonic options in
+a bug prevented intermixing old style options with long options in
some cases.}. Old style options and either of the modern styles of
options may be mixed within a single @command{tar} command. However,
old style options must be introduced as the first arguments only,
@table @option
-@opindex append, summary
+@opsummary{append}
@item --append
@itemx -r
Appends files to the end of the archive. @xref{append}.
-@opindex catenate, summary
+@opsummary{catenate}
@item --catenate
@itemx -A
Same as @option{--concatenate}. @xref{concatenate}.
-@opindex compare, summary
+@opsummary{compare}
@item --compare
@itemx -d
system, and reports differences in file size, mode, owner,
modification date and contents. @xref{compare}.
-@opindex concatenate, summary
+@opsummary{concatenate}
@item --concatenate
@itemx -A
Appends other @command{tar} archives to the end of the archive.
@xref{concatenate}.
-@opindex create, summary
+@opsummary{create}
@item --create
@itemx -c
Creates a new @command{tar} archive. @xref{create}.
-@opindex delete, summary
+@opsummary{delete}
@item --delete
Deletes members from the archive. Don't try this on a archive on a
tape! @xref{delete}.
-@opindex diff, summary
+@opsummary{diff}
@item --diff
@itemx -d
Same @option{--compare}. @xref{compare}.
-@opindex extract, summary
+@opsummary{extract}
@item --extract
@itemx -x
Extracts members from the archive into the file system. @xref{extract}.
-@opindex get, summary
+@opsummary{get}
@item --get
@itemx -x
Same as @option{--extract}. @xref{extract}.
-@opindex list, summary
+@opsummary{list}
@item --list
@itemx -t
Lists the members in an archive. @xref{list}.
-@opindex update, summary
+@opsummary{update}
@item --update
@itemx -u
@table @option
-@opindex absolute-names, summary
+@opsummary{absolute-names}
@item --absolute-names
@itemx -P
@samp{/} from member names. This option disables that behavior.
@xref{absolute}.
-@opindex after-date, summary
+@opsummary{after-date}
@item --after-date
(See @option{--newer}, @pxref{after})
-@opindex anchored, summary
+@opsummary{anchored}
@item --anchored
A pattern must match an initial subsequence of the name's components.
@xref{controlling pattern-matching}.
-@opindex atime-preserve, summary
+@opsummary{atime-preserve}
@item --atime-preserve
@itemx --atime-preserve=replace
@itemx --atime-preserve=system
as support for @option{--atime-preserve=system} improves.
If your operating system does not support
-@option{--atime-preserve=system}, you might be able to preserve access
+@option{--atime-preserve=@-system}, you might be able to preserve access
times reliably by by using the @command{mount} command. For example,
you can mount the file system read-only, or access the file system via
a read-only loopback mount, or use the @samp{noatime} mount option
available on some systems. However, mounting typically requires
superuser privileges and can be a pain to manage.
-@opindex backup, summary
+@opsummary{backup}
@item --backup=@var{backup-type}
Rather than deleting files from the file system, @command{tar} will
back them up using simple or numbered backups, depending upon
@var{backup-type}. @xref{backup}.
-@opindex block-number, summary
+@opsummary{block-number}
@item --block-number
@itemx -R
With this option present, @command{tar} prints error messages for read errors
with the block number in the archive file. @xref{block-number}.
-@opindex blocking-factor, summary
+@opsummary{blocking-factor}
@item --blocking-factor=@var{blocking}
@itemx -b @var{blocking}
Sets the blocking factor @command{tar} uses to @var{blocking} x 512 bytes per
record. @xref{Blocking Factor}.
-@opindex bzip2, summary
+@opsummary{bzip2}
@item --bzip2
@itemx -j
This option tells @command{tar} to read or write archives through
@code{bzip2}. @xref{gzip}.
-@opindex checkpoint, summary
+@opsummary{checkpoint}
@item --checkpoint[=@var{number}]
This option directs @command{tar} to print periodic checkpoint
don't want to see @option{--verbose} output. For a detailed
description, see @ref{Progress information}.
-@opindex check-links, summary
+@opsummary{check-links}
@item --check-links
@itemx -l
If this option was given, @command{tar} will check the number of links
complies to UNIX98, was introduced with version
1.15.91. @xref{Changes}, for more information.}.
-@opindex compress, summary
-@opindex uncompress, summary
+@opsummary{compress}
+@opsummary{uncompress}
@item --compress
@itemx --uncompress
@itemx -Z
writing the archive. This allows you to directly act on archives
while saving space. @xref{gzip}.
-@opindex confirmation, summary
+@opsummary{confirmation}
@item --confirmation
(See @option{--interactive}.) @xref{interactive}.
-@opindex delay-directory-restore, summary
+@opsummary{delay-directory-restore}
@item --delay-directory-restore
Delay setting modification times and permissions of extracted
directories until the end of extraction. @xref{Directory Modification Times and Permissions}.
-@opindex dereference, summary
+@opsummary{dereference}
@item --dereference
@itemx -h
file that a symbolic link points to, rather than archiving the
symlink. @xref{dereference}.
-@opindex directory, summary
+@opsummary{directory}
@item --directory=@var{dir}
@itemx -C @var{dir}
to @var{dir} before performing any operations. When this option is used
during archive creation, it is order sensitive. @xref{directory}.
-@opindex exclude, summary
+@opsummary{exclude}
@item --exclude=@var{pattern}
When performing operations, @command{tar} will skip files that match
@var{pattern}. @xref{exclude}.
-@opindex exclude-from, summary
+@opsummary{exclude-from}
@item --exclude-from=@var{file}
@itemx -X @var{file}
Similar to @option{--exclude}, except @command{tar} will use the list of
patterns in the file @var{file}. @xref{exclude}.
-@opindex exclude-caches, summary
+@opsummary{exclude-caches}
@item --exclude-caches
Automatically excludes all directories
containing a cache directory tag. @xref{exclude}.
-@opindex file, summary
+@opsummary{file}
@item --file=@var{archive}
@itemx -f @var{archive}
performs operations on, rather than @command{tar}'s compilation dependent
default. @xref{file tutorial}.
-@opindex files-from, summary
+@opsummary{files-from}
@item --files-from=@var{file}
@itemx -T @var{file}
or files to operate on, in addition to those specified on the
command-line. @xref{files}.
-@opindex force-local, summary
+@opsummary{force-local}
@item --force-local
Forces @command{tar} to interpret the filename given to @option{--file}
as a local file, even if it looks like a remote tape drive name.
@xref{local and remote archives}.
-@opindex format, summary
+@opsummary{format}
@item --format=@var{format}
+@itemx -H @var{format}
Selects output archive format. @var{Format} may be one of the
following:
@xref{Formats}, for a detailed discussion of these formats.
-@opindex group, summary
+@opsummary{group}
@item --group=@var{group}
Files added to the @command{tar} archive will have a group id of @var{group},
rather than the group from the source file. @var{group} is first decoded
as a group symbolic name, but if this interpretation fails, it has to be
-a decimal numeric group ID. @FIXME-xref{}
+a decimal numeric group ID. @xref{override}.
Also see the comments for the @option{--owner=@var{user}} option.
-@opindex gzip, summary
-@opindex gunzip, summary
-@opindex ungzip, summary
+@opsummary{gzip}
+@opsummary{gunzip}
+@opsummary{ungzip}
@item --gzip
@itemx --gunzip
@itemx --ungzip
@command{gzip}, allowing @command{tar} to directly operate on several
kinds of compressed archives transparently. @xref{gzip}.
-@opindex help, summary
+@opsummary{help}
@item --help
+@itemx -?
@command{tar} will print out a short message summarizing the operations and
options to @command{tar} and exit. @xref{help}.
-@opindex ignore-case, summary
+@opsummary{ignore-case}
@item --ignore-case
Ignore case when matching member or file names with
patterns. @xref{controlling pattern-matching}.
-@opindex ignore-command-error, summary
+@opsummary{ignore-command-error}
@item --ignore-command-error
Ignore exit codes of subprocesses. @xref{Writing to an External Program}.
-@opindex ignore-failed-read, summary
+@opsummary{ignore-failed-read}
@item --ignore-failed-read
Do not exit unsuccessfully merely because an unreadable file was encountered.
@xref{Reading}.
-@opindex ignore-zeros, summary
+@opsummary{ignore-zeros}
@item --ignore-zeros
@itemx -i
With this option, @command{tar} will ignore zeroed blocks in the
archive, which normally signals EOF. @xref{Reading}.
-@opindex incremental, summary
+@opsummary{incremental}
@item --incremental
@itemx -G
primarily for backwards compatibility only. @xref{Incremental Dumps},
for a detailed discussion of incremental archives.
-@opindex index-file, summary
+@opsummary{index-file}
@item --index-file=@var{file}
Send verbose output to @var{file} instead of to standard output.
-@opindex info-script, summary
-@opindex new-volume-script, summary
+@opsummary{info-script}
+@opsummary{new-volume-script}
@item --info-script=@var{script-file}
@itemx --new-volume-script=@var{script-file}
@itemx -F @var{script-file}
@command{tar} fails immediately. @xref{info-script}, for a detailed
discussion of @var{script-file}.
-@opindex interactive, summary
+@opsummary{interactive}
@item --interactive
@itemx --confirmation
@itemx -w
performing potentially destructive options, such as overwriting files.
@xref{interactive}.
-@opindex keep-newer-files, summary
+@opsummary{keep-newer-files}
@item --keep-newer-files
Do not replace existing files that are newer than their archive copies
when extracting files from an archive.
-@opindex keep-old-files, summary
+@opsummary{keep-old-files}
@item --keep-old-files
@itemx -k
Do not overwrite existing files when extracting files from an archive.
@xref{Keep Old Files}.
-@opindex label, summary
+@opsummary{label}
@item --label=@var{name}
@itemx -V @var{name}
@command{tar} will only operate on archives that have a label matching
the pattern specified in @var{name}. @xref{Tape Files}.
-@opindex listed-incremental, summary
+@opsummary{listed-incremental}
@item --listed-incremental=@var{snapshot-file}
@itemx -g @var{snapshot-file}
With other operations, informs @command{tar} that the archive is in
incremental format. @xref{Incremental Dumps}.
-@opindex mode, summary
+@opsummary{mode}
@item --mode=@var{permissions}
When adding files to an archive, @command{tar} will use
@var{permissions} for the archive members, rather than the permissions
-from the files. The program @command{chmod} and this @command{tar}
-option share the same syntax for what @var{permissions} might be.
-@xref{File permissions, Permissions, File permissions, fileutils,
-@acronym{GNU} file utilities}. This reference also has useful
-information for those not being overly familiar with the Unix
-permission system.
-
-Of course, @var{permissions} might be plainly specified as an octal number.
-However, by using generic symbolic modifications to mode bits, this allows
-more flexibility. For example, the value @samp{a+rw} adds read and write
-permissions for everybody, while retaining executable bits on directories
-or on any other file already marked as executable.
+from the files. @var{permissions} can be specified either as an octal
+number or as symbolic permissions, like with
+@command{chmod}. @xref{override}.
-@opindex multi-volume, summary
+@opsummary{mtime}
+@item --mtime=@var{date}
+
+When adding files to an archive, @command{tar} will use @var{date} as
+the modification time of members when creating archives, instead of
+their actual modification times. The value of @var{date} can be
+either a textual date representation (@pxref{Date input formats}) or a
+name of the existing file, starting with @samp{/} or @samp{.}. In the
+latter case, the modification time of that file is used. @xref{override}.
+
+@opsummary{multi-volume}
@item --multi-volume
@itemx -M
Informs @command{tar} that it should create or otherwise operate on a
multi-volume @command{tar} archive. @xref{Using Multiple Tapes}.
-@opindex new-volume-script, summary
+@opsummary{new-volume-script}
@item --new-volume-script
(see --info-script)
-@opindex seek, summary
+@opsummary{seek}
@item --seek
@itemx -n
the archive can be seeked or not. This option is intended for use
in cases when such recognition fails.
-@opindex newer, summary
+@opsummary{newer}
@item --newer=@var{date}
@itemx --after-date=@var{date}
@itemx -N
is taken to be the name of a file whose data modification time specifies
the date. @xref{after}.
-@opindex newer-mtime, summary
+@opsummary{newer-mtime}
@item --newer-mtime=@var{date}
Like @option{--newer}, but add only files whose
contents have changed (as opposed to just @option{--newer}, which will
-also back up files for which any status information has changed).
+also back up files for which any status information has
+changed). @xref{after}.
-@opindex no-anchored, summary
+@opsummary{no-anchored}
@item --no-anchored
An exclude pattern can match any subsequence of the name's components.
@xref{controlling pattern-matching}.
-@opindex no-delay-directory-restore, summary
+@opsummary{no-delay-directory-restore}
@item --no-delay-directory-restore
Setting modification times and permissions of extracted
directories when all files from this directory has been
extracted. This is the default. @xref{Directory Modification Times and Permissions}.
-@opindex no-ignore-case, summary
+@opsummary{no-ignore-case}
@item --no-ignore-case
Use case-sensitive matching.
@xref{controlling pattern-matching}.
-@opindex no-ignore-command-error, summary
+@opsummary{no-ignore-command-error}
@item --no-ignore-command-error
Print warnings about subprocesses terminated with a non-zero exit
code. @xref{Writing to an External Program}.
-@opindex no-quote-chars, summary
+@opsummary{no-overwrite-dir}
+@item --no-overwrite-dir
+
+Preserve metadata of existing directories when extracting files
+from an archive. @xref{Overwrite Old Files}.
+
+@opsummary{no-quote-chars}
@item --no-quote-chars=@var{string}
Remove characters listed in @var{string} from the list of quoted
characters set by the previous @option{--quote-chars} option
(@pxref{quoting styles}).
-@opindex no-recursion, summary
+@opsummary{no-recursion}
@item --no-recursion
With this option, @command{tar} will not recurse into directories.
@xref{recurse}.
-@opindex no-same-owner, summary
+@opsummary{no-same-owner}
@item --no-same-owner
@itemx -o
specified in the @command{tar} archive. This the default behavior
for ordinary users.
-@opindex no-same-permissions, summary
+@opsummary{no-same-permissions}
@item --no-same-permissions
When extracting an archive, subtract the user's umask from files from
the permissions specified in the archive. This is the default behavior
for ordinary users.
-@opindex no-wildcards, summary
+@opsummary{no-unquote}
+@item --no-unquote
+Treat all input file or member names literally, do not interpret
+escape sequences. @xref{input name quoting}.
+
+@opsummary{no-wildcards}
@item --no-wildcards
Do not use wildcards.
@xref{controlling pattern-matching}.
-@opindex no-wildcards-match-slash, summary
+@opsummary{no-wildcards-match-slash}
@item --no-wildcards-match-slash
Wildcards do not match @samp{/}.
@xref{controlling pattern-matching}.
-@opindex null, summary
+@opsummary{null}
@item --null
When @command{tar} is using the @option{--files-from} option, this option
@command{tar} can correctly work with file names that contain newlines.
@xref{nul}.
-@opindex numeric-owner, summary
+@opsummary{numeric-owner}
@item --numeric-owner
This option will notify @command{tar} that it should use numeric user
@xref{Attributes}.
@item -o
-When extracting files, this option is a synonym for
-@option{--no-same-owner}, i.e. it prevents @command{tar} from
+The function of this option depends on the action @command{tar} is
+performing. When extracting files, @option{-o} is a synonym for
+@option{--no-same-owner}, i.e., it prevents @command{tar} from
restoring ownership of files being extracted.
-When creating an archive, @option{-o} is a synonym for
+When creating an archive, it is a synonym for
@option{--old-archive}. This behavior is for compatibility
with previous versions of @GNUTAR{}, and will be
removed in the future releases.
@xref{Changes}, for more information.
-@opindex occurrence, summary
+@opsummary{occurrence}
@item --occurrence[=@var{number}]
This option can be used in conjunction with one of the subcommands
@end smallexample
@noindent
-will extract the first occurrence of @file{filename} from @file{archive.tar}
+will extract the first occurrence of the member @file{filename} from @file{archive.tar}
and will terminate without scanning to the end of the archive.
-@opindex old-archive, summary
+@opsummary{old-archive}
@item --old-archive
Synonym for @option{--format=v7}.
-@opindex one-file-system, summary
+@opsummary{one-file-system}
@item --one-file-system
Used when creating an archive. Prevents @command{tar} from recursing into
directories that are on different file systems from the current
synonym for @option{--one-file-system}. This has changed in version
1.15.91. @xref{Changes}, for more information.}.
-@opindex overwrite, summary
+@opsummary{overwrite}
@item --overwrite
Overwrite existing files and directory metadata when extracting files
from an archive. @xref{Overwrite Old Files}.
-@opindex overwrite-dir, summary
+@opsummary{overwrite-dir}
@item --overwrite-dir
Overwrite the metadata of existing directories when extracting files
from an archive. @xref{Overwrite Old Files}.
-@opindex owner, summary
+@opsummary{owner}
@item --owner=@var{user}
Specifies that @command{tar} should use @var{user} as the owner of members
when creating archives, instead of the user associated with the source
file. @var{user} is first decoded as a user symbolic name, but if
this interpretation fails, it has to be a decimal numeric user ID.
-@FIXME-xref{}
-
-There is no value indicating a missing number, and @samp{0} usually means
-@code{root}. Some people like to force @samp{0} as the value to offer in
-their distributions for the owner of files, because the @code{root} user is
-anonymous anyway, so that might as well be the owner of anonymous archives.
+@xref{override}.
This option does not affect extraction from archives.
-@opindex transform, summary
+@opsummary{transform}
@item --transform=@var{sed-expr}
Transform file or member names using @command{sed} replacement expression
@option{--show-transformed-names} option
(@pxref{show-transformed-names}).
-@opindex quote-chars, summary
+@opsummary{quote-chars}
@item --quote-chars=@var{string}
Always quote characters from @var{string}, even if the selected
quoting style would not quote them (@pxref{quoting styles}).
-@opindex quoting-style, summary
+@opsummary{quoting-style}
@item --quoting-style=@var{style}
Set quoting style to use when printing member and file names
(@pxref{quoting styles}). Valid @var{style} values are:
style is @code{escape}, unless overridden while configuring the
package.
-@opindex pax-option, summary
+@opsummary{pax-option}
@item --pax-option=@var{keyword-list}
This option is meaningful only with @acronym{POSIX.1-2001} archives
(@pxref{posix}). It modifies the way @command{tar} handles the
list of keyword options. @xref{PAX keywords}, for a detailed
discussion.
-@opindex portability, summary
+@opsummary{portability}
@item --portability
@itemx --old-archive
Synonym for @option{--format=v7}.
-@opindex posix, summary
+@opsummary{posix}
@item --posix
Same as @option{--format=posix}.
-@opindex preserve, summary
+@opsummary{preserve}
@item --preserve
Synonymous with specifying both @option{--preserve-permissions} and
@option{--same-order}. @xref{Setting Access Permissions}.
-@opindex preserve-order, summary
+@opsummary{preserve-order}
@item --preserve-order
(See @option{--same-order}; @pxref{Reading}.)
-@opindex preserve-permissions, summary
-@opindex same-permissions, summary
+@opsummary{preserve-permissions}
+@opsummary{same-permissions}
@item --preserve-permissions
@itemx --same-permissions
@itemx -p
Specifying this option instructs @command{tar} that it should use the
permissions directly from the archive. @xref{Setting Access Permissions}.
-@opindex read-full-records, summary
+@opsummary{read-full-records}
@item --read-full-records
@itemx -B
Specifies that @command{tar} should reblock its input, for reading
from pipes on systems with buggy implementations. @xref{Reading}.
-@opindex record-size, summary
+@opsummary{record-size}
@item --record-size=@var{size}
Instructs @command{tar} to use @var{size} bytes per record when accessing the
archive. @xref{Blocking Factor}.
-@opindex recursion, summary
+@opsummary{recursion}
@item --recursion
With this option, @command{tar} recurses into directories.
@xref{recurse}.
-@opindex recursive-unlink, summary
+@opsummary{recursive-unlink}
@item --recursive-unlink
Remove existing
directory hierarchies before extracting directories of the same name
from the archive. @xref{Recursive Unlink}.
-@opindex remove-files, summary
+@opsummary{remove-files}
@item --remove-files
Directs @command{tar} to remove the source file from the file system after
appending it to an archive. @xref{remove files}.
-@opindex restrict, summary
+@opsummary{restrict}
@item --restrict
Disable use of some potentially harmful @command{tar} options.
-Currently this option disables shell invocaton from multi-volume menu
+Currently this option disables shell invocation from multi-volume menu
(@pxref{Using Multiple Tapes}).
-@opindex rmt-command, summary
+@opsummary{rmt-command}
@item --rmt-command=@var{cmd}
Notifies @command{tar} that it should use @var{cmd} instead of
the default @file{/usr/libexec/rmt} (@pxref{Remote Tape Server}).
-@opindex rsh-command, summary
+@opsummary{rsh-command}
@item --rsh-command=@var{cmd}
Notifies @command{tar} that is should use @var{cmd} to communicate with remote
devices. @xref{Device}.
-@opindex same-order, summary
+@opsummary{same-order}
@item --same-order
@itemx --preserve-order
@itemx -s
arguments has already been sorted to match the order of files in the
archive. @xref{Reading}.
-@opindex same-owner, summary
+@opsummary{same-owner}
@item --same-owner
When extracting an archive, @command{tar} will attempt to preserve the owner
This is the default behavior for the superuser; this option has an
effect only for ordinary users. @xref{Attributes}.
-@opindex same-permissions, summary
+@opsummary{same-permissions}
@item --same-permissions
(See @option{--preserve-permissions}; @pxref{Setting Access Permissions}.)
-@opindex show-defaults, summary
+@opsummary{show-defaults}
@item --show-defaults
Displays the default options used by @command{tar} and exits
--rmt-command=/usr/libexec/rmt --rsh-command=/usr/bin/rsh
@end smallexample
-@opindex show-omitted-dirs, summary
+@opsummary{show-omitted-dirs}
@item --show-omitted-dirs
Instructs @command{tar} to mention directories its skipping over when
operating on a @command{tar} archive. @xref{show-omitted-dirs}.
-@opindex show-transformed-names, summary
-@opindex show-stored-names, summary
+@opsummary{show-transformed-names}
+@opsummary{show-stored-names}
@item --show-transformed-names
@itemx --show-stored-names
stored in the archive, as opposed to the actual file
names. @xref{listing member and file names}.
-@opindex sparse, summary
+@opsummary{sparse}
@item --sparse
@itemx -S
Invokes a @acronym{GNU} extension when adding files to an archive that handles
sparse files efficiently. @xref{sparse}.
-@opindex starting-file, summary
+@opsummary{sparse-version}
+@item --sparse-version=@var{version}
+
+Specified the @dfn{format version} to use when archiving sparse
+files. Implies @option{--sparse}. @xref{sparse}. For the description
+of the supported sparse formats, @xref{Sparse Formats}.
+
+@opsummary{starting-file}
@item --starting-file=@var{name}
@itemx -K @var{name}
files in the archive until it finds one that matches @var{name}.
@xref{Scarce}.
-@opindex strip-components, summary
+@opsummary{strip-components}
@item --strip-components=@var{number}
Strip given @var{number} of leading components from file names before
extraction.@footnote{This option was called @option{--strip-path} in
@noindent
would extract this file to file @file{name}.
-@opindex suffix, summary
+@opsummary{suffix}, summary
@item --suffix=@var{suffix}
Alters the suffix @command{tar} uses when backing up files from the default
@samp{~}. @xref{backup}.
-@opindex tape-length, summary
+@opsummary{tape-length}
@item --tape-length=@var{num}
@itemx -L @var{num}
Specifies the length of tapes that @command{tar} is writing as being
@w{@var{num} x 1024} bytes long. @xref{Using Multiple Tapes}.
-@opindex test-label, summary
+@opsummary{test-label}
@item --test-label
Reads the volume label. If an argument is specified, test whether it
matches the volume label. @xref{--test-label option}.
-@opindex to-command, summary
+@opsummary{to-command}
@item --to-command=@var{command}
During extraction @command{tar} will pipe extracted files to the
-standard input of @var{command}. @xref{Writing to an External Program}.
+standard input of @var{command}. @xref{Writing to an External Program}.
-@opindex to-stdout, summary
+@opsummary{to-stdout}
@item --to-stdout
@itemx -O
During extraction, @command{tar} will extract files to stdout rather
than to the file system. @xref{Writing to Standard Output}.
-@opindex totals, summary
+@opsummary{totals}
@item --totals[=@var{signo}]
Displays the total number of bytes transferred when processing an
request, when signal @var{signo} is delivered to @command{tar}.
@xref{totals}.
-@opindex touch, summary
+@opsummary{touch}
@item --touch
@itemx -m
rather than the data modification time stored in the archive.
@xref{Data Modification Times}.
-@opindex uncompress, summary
+@opsummary{uncompress}
@item --uncompress
(See @option{--compress}. @pxref{gzip})
-@opindex ungzip, summary
+@opsummary{ungzip}
@item --ungzip
(See @option{--gzip}. @pxref{gzip})
-@opindex unlink-first, summary
+@opsummary{unlink-first}
@item --unlink-first
@itemx -U
Directs @command{tar} to remove the corresponding file from the file
system before extracting it from the archive. @xref{Unlink First}.
-@opindex use-compress-program, summary
+@opsummary{unquote}
+@item --unquote
+Enable unquoting input file or member names (default). @xref{input
+name quoting}.
+
+@opsummary{use-compress-program}
@item --use-compress-program=@var{prog}
Instructs @command{tar} to access the archive through @var{prog}, which is
presumed to be a compression program of some sort. @xref{gzip}.
-@opindex utc, summary
+@opsummary{utc}
@item --utc
Display file modification dates in @acronym{UTC}. This option implies
@option{--verbose}.
-@opindex verbose, summary
+@opsummary{verbose}
@item --verbose
@itemx -v
operations to increase the amount of information displayed.
@xref{verbose}.
-@opindex verify, summary
+@opsummary{verify}
@item --verify
@itemx -W
Verifies that the archive was correctly written when creating an
archive. @xref{verify}.
-@opindex version, summary
+@opsummary{version}
@item --version
Print information about the program's name, version, origin and legal
status, all on standard output, and then exit successfully.
@xref{help}.
-@opindex volno-file, summary
+@opsummary{volno-file}
@item --volno-file=@var{file}
-Used in conjunction with @option{--multi-volume}. @command{tar} will keep track
-of which volume of a multi-volume archive its working in @var{file}.
-@xref{volno-file}.
+Used in conjunction with @option{--multi-volume}. @command{tar} will
+keep track of which volume of a multi-volume archive its working in
+@var{file}. @xref{volno-file}.
-@opindex wildcards, summary
+@opsummary{wildcards}
@item --wildcards
Use wildcards when matching member names with patterns.
@xref{controlling pattern-matching}.
-@opindex wildcards-match-slash, summary
+@opsummary{wildcards-match-slash}
@item --wildcards-match-slash
Wildcards match @samp{/}.
@xref{controlling pattern-matching}.
Here is an alphabetized list of all of the short option forms, matching
them with the equivalent long option.
-@table @option
-
-@item -A
-
-@option{--concatenate}
-
-@item -B
-
-@option{--read-full-records}
-
-@item -C
-
-@option{--directory}
-
-@item -F
-
-@option{--info-script}
-
-@item -G
-
-@option{--incremental}
-
-@item -K
-
-@option{--starting-file}
-
-@item -L
-
-@option{--tape-length}
-
-@item -M
-
-@option{--multi-volume}
-
-@item -N
-
-@option{--newer}
-
-@item -O
-
-@option{--to-stdout}
+@multitable @columnfractions 0.20 0.80
+@headitem Short Option @tab Reference
-@item -P
+@item -A @tab @ref{--concatenate}.
-@option{--absolute-names}
+@item -B @tab @ref{--read-full-records}.
-@item -R
+@item -C @tab @ref{--directory}.
-@option{--block-number}
+@item -F @tab @ref{--info-script}.
-@item -S
-
-@option{--sparse}
-
-@item -T
-
-@option{--files-from}
-
-@item -U
-
-@option{--unlink-first}
-
-@item -V
-
-@option{--label}
-
-@item -W
-
-@option{--verify}
-
-@item -X
-
-@option{--exclude-from}
-
-@item -Z
+@item -G @tab @ref{--incremental}.
-@option{--compress}
+@item -K @tab @ref{--starting-file}.
-@item -b
+@item -L @tab @ref{--tape-length}.
-@option{--blocking-factor}
+@item -M @tab @ref{--multi-volume}.
-@item -c
+@item -N @tab @ref{--newer}.
-@option{--create}
+@item -O @tab @ref{--to-stdout}.
-@item -d
+@item -P @tab @ref{--absolute-names}.
-@option{--compare}
+@item -R @tab @ref{--block-number}.
-@item -f
+@item -S @tab @ref{--sparse}.
-@option{--file}
+@item -T @tab @ref{--files-from}.
-@item -g
+@item -U @tab @ref{--unlink-first}.
-@option{--listed-incremental}
+@item -V @tab @ref{--label}.
-@item -h
+@item -W @tab @ref{--verify}.
-@option{--dereference}
+@item -X @tab @ref{--exclude-from}.
-@item -i
+@item -Z @tab @ref{--compress}.
-@option{--ignore-zeros}
+@item -b @tab @ref{--blocking-factor}.
-@item -j
+@item -c @tab @ref{--create}.
-@option{--bzip2}
+@item -d @tab @ref{--compare}.
-@item -k
+@item -f @tab @ref{--file}.
-@option{--keep-old-files}
+@item -g @tab @ref{--listed-incremental}.
-@item -l
+@item -h @tab @ref{--dereference}.
-@option{--one-file-system}. Use of this short option is deprecated. It
-is retained for compatibility with the earlier versions of GNU
-@command{tar}, and will be changed in future releases.
+@item -i @tab @ref{--ignore-zeros}.
-@xref{Changes}, for more information.
+@item -j @tab @ref{--bzip2}.
-@item -m
+@item -k @tab @ref{--keep-old-files}.
-@option{--touch}
+@item -l @tab @ref{--check-links}.
-@item -o
+@item -m @tab @ref{--touch}.
-When creating --- @option{--no-same-owner}, when extracting ---
-@option{--portability}.
+@item -o @tab When creating, @ref{--no-same-owner}, when extracting ---
+@ref{--portability}.
The later usage is deprecated. It is retained for compatibility with
the earlier versions of @GNUTAR{}. In the future releases
@option{-o} will be equivalent to @option{--no-same-owner} only.
-@item -p
-
-@option{--preserve-permissions}
-
-@item -r
-
-@option{--append}
-
-@item -s
-
-@option{--same-order}
-
-@item -t
-
-@option{--list}
-
-@item -u
+@item -p @tab @ref{--preserve-permissions}.
-@option{--update}
+@item -r @tab @ref{--append}.
-@item -v
+@item -s @tab @ref{--same-order}.
-@option{--verbose}
+@item -t @tab @ref{--list}.
-@item -w
+@item -u @tab @ref{--update}.
-@option{--interactive}
+@item -v @tab @ref{--verbose}.
-@item -x
+@item -w @tab @ref{--interactive}.
-@option{--extract}
+@item -x @tab @ref{--extract}.
-@item -z
-
-@option{--gzip}
+@item -z @tab @ref{--gzip}.
-@end table
+@end multitable
@node help
@section @GNUTAR{} documentation
successfully. For example, @w{@samp{tar --version}} might print:
@smallexample
-tar (GNU tar) 1.15.2
+tar (GNU tar) @value{VERSION}
Copyright (C) 2006 Free Software Foundation, Inc.
-This is free software. You may redistribute copies of it under the terms of
-the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+This is free software. You may redistribute copies of it under the terms
+of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.
@cindex Obtaining help
@cindex Listing all @command{tar} options
-@opindex help, introduction
+@xopindex{help, introduction}
Another thing you might want to do is checking the spelling or meaning
of some particular @command{tar} option, without resorting to this
manual, for once you have carefully read it. @GNUTAR{}
back to the full documentation for precise points. If you are reading
this paragraph, you already have the @command{tar} manual in some
form. This manual is available in a variety of forms from
-@url{http://www.gnu.org/software/tar/manual}. It may printed out of the @GNUTAR{}
+@url{http://www.gnu.org/software/tar/manual}. It may be printed out of the @GNUTAR{}
distribution, provided you have @TeX{} already installed somewhere,
and a laser printer around. Just configure the distribution, execute
the command @w{@samp{make dvi}}, then print @file{doc/tar.dvi} the
@opindex show-defaults
@GNUTAR{} has some predefined defaults that are used when you do not
-explicitely specify another values. To obtain a list of such
+explicitly specify another values. To obtain a list of such
defaults, use @option{--show-defaults} option. This will output the
values in the form of @command{tar} command line options:
@smallexample
@group
@kbd{tar --show-defaults}
---format=gnu -f- -b20 --rmt-command=/etc/rmt --rsh-command=/usr/bin/rsh
+--format=gnu -f- -b20 --quoting-style=escape
+--rmt-command=/etc/rmt --rsh-command=/usr/bin/rsh
@end group
@end smallexample
+@noindent
+Notice, that this option outputs only one line. The example output above
+has been split to fit page boundaries.
+
@noindent
The above output shows that this version of @GNUTAR{} defaults to
using @samp{gnu} archive format (@pxref{Formats}), it uses standard
With @option{--create} or @option{--extract}, @option{--verbose} used
once just prints the names of the files or members as they are processed.
Using it twice causes @command{tar} to print a longer listing
-(reminiscent of @samp{ls -l}) for each member. Since @option{--list}
-already prints the names of the members, @option{--verbose} used once
-with @option{--list} causes @command{tar} to print an @samp{ls -l}
-type listing of the files in the archive. The following examples both
-extract members with long list output:
+(@xref{verbose member listing}, for the description) for each member.
+Since @option{--list} already prints the names of the members,
+@option{--verbose} used once with @option{--list} causes @command{tar}
+to print an @samp{ls -l} type listing of the files in the archive.
+The following examples both extract members with long list output:
@smallexample
$ @kbd{tar --extract --file=archive.tar --verbose --verbose}
for these operations.
@table @option
-@opindex create, complementary notes
+@xopindex{create, complementary notes}
@item --create
@itemx -c
file, which was meant to be saved, is rather destroyed.
@end enumerate
-So, recognizing the likelihood and the catastrophical nature of these
+So, recognizing the likelihood and the catastrophic nature of these
errors, @GNUTAR{} now takes some distance from elegance, and
cowardly refuses to create an archive when @option{--create} option is
given, there are no arguments besides options, and
@kbd{tar cfT empty-archive.tar /dev/null}
@end smallexample
-@opindex extract, complementary notes
+@xopindex{extract, complementary notes}
@item --extract
@itemx --get
@itemx -x
ready. In the meantime, programs not being localizable for dates
should prefer international dates, that's really the way to go.
-Look up @url{http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html} if you
+Look up @url{http://www.cl.cam.ac.uk/@/~mgk25/@/iso-time.html} if you
are curious, it contains a detailed explanation of the ISO 8601 standard.
@end table
@samp{collection.tar} and @samp{music.tar}.
We will also use the archive files @samp{afiles.tar} and
-@samp{bfiles.tar}. @samp{afiles.tar} contains the members @samp{apple},
-@samp{angst}, and @samp{aspic}. @samp{bfiles.tar} contains the members
+@samp{bfiles.tar}. The archive @samp{afiles.tar} contains the members @samp{apple},
+@samp{angst}, and @samp{aspic}; @samp{bfiles.tar} contains the members
@samp{./birds}, @samp{baboon}, and @samp{./box}.
Unless we state otherwise, all practicing you do and examples you follow
@end smallexample
@node multiple
-@subsubsection Multiple Files with the Same Name
+@subsubsection Multiple Members with the Same Name
You can use @option{--append} (@option{-r}) to add copies of files
which have been updated since the archive was created. (However, we
Both @option{--update} and @option{--append} 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, unless you use
-the @option{--backup} option. @FIXME-ref{Multiple Members with the
-Same Name}
+the @option{--backup} option. @xref{multiple}, for a detailed discussion.
@menu
* how to update::
@option{--file} option and name the rest of archives to be
concatenated on the command line. The members, and their member
names, will be copied verbatim from those archives to the first one.
-@FIXME-ref{This can cause multiple members to have the same name, for
-information on how this affects reading the archive, Multiple
-Members with the Same Name.}
+@footnote{This can cause multiple members to have the same name, for
+information on how this affects reading the archive, @ref{multiple}.}
The new, concatenated archive will be called by the same name as the
one given with the @option{--file} option. As usual, if you omit
@option{--file}, @command{tar} will use the value of the environment
@node create options
@section Options Used by @option{--create}
-@opindex create, additional options
+@xopindex{create, additional options}
The previous chapter described the basics of how to use
@option{--create} (@option{-c}) to create an archive from a set of files.
@xref{create}. This section described advanced options to be used with
@option{--create}.
@menu
+* override:: Overriding File Metadata.
* Ignore Failed Read::
@end menu
+@node override
+@subsection Overriding File Metadata
+
+As described above, a @command{tar} archive keeps, for each member it contains,
+its @dfn{metadata}, such as modification time, mode and ownership of
+the file. @GNUTAR{} allows to replace these data with other values
+when adding files to the archive. The options described in this
+section affect creation of archives of any type. For POSIX archives,
+see also @ref{PAX keywords}, for additional ways of controlling
+metadata, stored in the archive.
+
+@table @option
+@opindex mode
+@item --mode=@var{permissions}
+
+When adding files to an archive, @command{tar} will use
+@var{permissions} for the archive members, rather than the permissions
+from the files. @var{permissions} can be specified either as an octal
+number or as symbolic permissions, like with
+@command{chmod} (@xref{File permissions, Permissions, File
+permissions, fileutils, @acronym{GNU} file utilities}. This reference
+also has useful information for those not being overly familiar with
+the UNIX permission system). Using latter syntax allows for
+more flexibility. For example, the value @samp{a+rw} adds read and write
+permissions for everybody, while retaining executable bits on directories
+or on any other file already marked as executable:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar --mode='a+rw' .}
+@end smallexample
+
+@item --mtime=@var{date}
+@opindex mtime
+
+When adding files to an archive, @command{tar} will use @var{date} as
+the modification time of members when creating archives, instead of
+their actual modification times. The argument @var{date} can be
+either a textual date representation in almost arbitrary format
+(@pxref{Date input formats}) or a name of the existing file, starting
+with @samp{/} or @samp{.}. In the latter case, the modification time
+of that file will be used.
+
+The following example will set the modification date to 00:00:00 UTC,
+January 1, 1970:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar --mtime='1970-01-01' .}
+@end smallexample
+
+@noindent
+When used with @option{--verbose} (@pxref{verbose tutorial}) @GNUTAR{}
+will try to convert the specified date back to its textual
+representation and compare it with the one given with
+@option{--mtime} options. If the two dates differ, @command{tar} will
+print a warning saying what date it will use. This is to help user
+ensure he is using the right date.
+
+For example:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar -v --mtime=yesterday .}
+tar: Option --mtime: Treating date `yesterday' as 2006-06-20
+13:06:29.152478
+@dots{}
+@end smallexample
+
+@item --owner=@var{user}
+@opindex owner
+
+Specifies that @command{tar} should use @var{user} as the owner of members
+when creating archives, instead of the user associated with the source
+file. The argument @var{user} can be either an existing user symbolic
+name, or a decimal numeric user ID.
+
+There is no value indicating a missing number, and @samp{0} usually means
+@code{root}. Some people like to force @samp{0} as the value to offer in
+their distributions for the owner of files, because the @code{root} user is
+anonymous anyway, so that might as well be the owner of anonymous
+archives. For example:
+
+@smallexample
+@group
+$ @kbd{tar -c -f archive.tar --owner=0 .}
+# @r{Or:}
+$ @kbd{tar -c -f archive.tar --owner=root .}
+@end group
+@end smallexample
+
+@item --group=@var{group}
+@opindex group
+
+Files added to the @command{tar} archive will have a group id of @var{group},
+rather than the group from the source file. The argument @var{group}
+can be either an existing group symbolic name, or a decimal numeric group ID.
+@end table
+
@node Ignore Failed Read
@subsection Ignore Fail Read
@table @option
@item --ignore-failed-read
+@opindex ignore-failed-read
Do not exit with nonzero on unreadable files or directories.
@end table
@section Options Used by @option{--extract}
@UNREVISED
-@opindex extract, additional options
+@xopindex{extract, additional options}
The previous chapter showed how to use @option{--extract} to extract
an archive into the file system. Various options cause @command{tar} to
extract more information than just file contents, such as the owner,
versions of @command{tar} write garbage after the end-of-archive entry,
since that part of the media is never supposed to be read. @GNUTAR{}
does not write after the end of an archive, but seeks to
-maintain compatiblity among archiving utilities.
+maintain compatibility among archiving utilities.
@table @option
@item --ignore-zeros
@node Dealing with Old Files
@unnumberedsubsubsec Options Controlling the Overwriting of Existing Files
-@opindex overwrite-dir, introduced
+@xopindex{overwrite-dir, introduced}
When extracting files, if @command{tar} discovers that the extracted
file already exists, it normally replaces the file by removing it before
extracting it, to prevent confusion in the presence of hard or symbolic
such a directory, use the @option{--no-overwrite-dir} option.
@cindex Overwriting old files, prevention
-@opindex keep-old-files, introduced
+@xopindex{keep-old-files, introduced}
To be even more cautious and prevent existing files from being replaced, use
the @option{--keep-old-files} (@option{-k}) option. It causes @command{tar} to refuse
to replace or update a file that already exists, i.e., a file with the
same name as an archive member prevents extraction of that archive
member. Instead, it reports an error.
-@opindex overwrite, introduced
+@xopindex{overwrite, introduced}
To be more aggressive about altering existing files, use the
@option{--overwrite} option. It causes @command{tar} to overwrite
existing files and to follow existing symbolic links when extracting.
to allow this behavior. In any case, single files are silently
removed.
-@opindex unlink-first, introduced
+@xopindex{unlink-first, introduced}
Finally, the @option{--unlink-first} (@option{-U}) option can improve performance in
some cases by causing @command{tar} to remove files unconditionally
before extracting them.
@option{-x}) operation.
@table @option
-@opindex preserve-permission
-@opindex same-permission
-@item --preserve-permission
-@itemx --same-permission
+@opindex preserve-permissions
+@opindex same-permissions
+@item --preserve-permissions
+@itemx --same-permissions
@c @itemx --ignore-umask
@itemx -p
Set modes of extracted archive members to those recorded in the
@node Directory Modification Times and Permissions
@unnumberedsubsubsec Directory Modification Times and Permissions
-After sucessfully extracting a file member, @GNUTAR{} normally
+After successfully extracting a file member, @GNUTAR{} normally
restores its permissions and modification times, as described in the
previous sections. This cannot be done for directories, because
after extracting a directory @command{tar} will almost certainly
an incremental archive is reversed: first all directory members are
stored, followed by other (non-directory) members. So, when extracting
from incremental archives, @GNUTAR{} alters the above procedure. It
-remebers all restored directories, and restores their meta-data
+remembers all restored directories, and restores their meta-data
only after the entire archive has been processed. Notice, that you do
-not need to specity any special options for that, as @GNUTAR{}
+not need to specify any special options for that, as @GNUTAR{}
automatically detects archives in incremental format.
There may be cases, when such processing is required for normal archives
tar -xOzf foo.tgz bigfile1 bigfile2 | process
@end smallexample
-Hovewer, @option{--to-command} may be more convenient for use with
+However, @option{--to-command} may be more convenient for use with
multiple files. See the next section.
@node Writing to an External Program
@end table
-Some people express the desire to @emph{always} use the @option{--backup}
-option, by defining some kind of alias or script. This is not as easy
-as one may think, due to the fact that old style options should appear first
-and consume arguments a bit unpredictably for an alias or script. But,
-if you are ready to give up using old style options, you may resort to
-using something like (a Bourne shell function here):
-
-@smallexample
-tar () @{ /usr/local/bin/tar --backup $*; @}
-@end smallexample
-
@node Applications
@section Notable @command{tar} Usages
@UNREVISED
Note that incremental archives use @command{tar} extensions and may
not be readable by non-@acronym{GNU} versions of the @command{tar} program.
-@opindex listed-incremental, using with @option{--extract}
-@opindex extract, using with @option{--listed-incremental}
+@xopindex{listed-incremental, using with @option{--extract}}
+@xopindex{extract, using with @option{--listed-incremental}}
To extract from the incremental dumps, use
@option{--listed-incremental} together with @option{--extract}
option (@pxref{extracting files}). In this case, @command{tar} does
the last level was created, you will need to restore from all backups
in turn. Continuing our example, to restore the state of @file{/usr}
file system, one would do@footnote{Notice, that since both archives
-were created withouth @option{-P} option (@pxref{absolute}), these
+were created without @option{-P} option (@pxref{absolute}), these
commands should be run from the root file system.}:
@smallexample
verbose listing output (@option{--list --verbose}) when using in
scripts.
-@opindex incremental, using with @option{--list}
-@opindex listed-incremental, using with @option{--list}
-@opindex list, using with @option{--incremental}
-@opindex list, using with @option{--listed-incremental}
+@xopindex{incremental, using with @option{--list}}
+@xopindex{listed-incremental, using with @option{--list}}
+@xopindex{list, using with @option{--incremental}}
+@xopindex{list, using with @option{--listed-incremental}}
Versions of @GNUTAR{} up to 1.15.1 used to dump verbatim binary
contents of the DUMPDIR header (with terminating nulls) when
@option{--incremental} or @option{--listed-incremental} option was
given, no matter what the verbosity level. This behavior, and,
-especially, the binary output it produced were considered incovenient
+especially, the binary output it produced were considered inconvenient
and were changed in version 1.16}:
@smallexample
the host machine must have @GNUTAR{} 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 @command{pwd} will print
+machine where the scripts are run (i.e., what @command{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.
@defvr {Backup variable} RSH_COMMAND
-Full file name of @command{rsh} binary on remote mashines. This will
+Full file name of @command{rsh} binary on remote machines. This will
be passed via @option{--rsh-command} option to the remote invocation
of @GNUTAR{}.
@end defvr
Script to be run when it's time to insert a new tape in for the next
volume. Administrators may want to tailor this script for their site.
If this variable isn't set, @GNUTAR{} will display its built-in
-prompt, and will expect confirmation from the console.
-
-The built-in prompt for POSIX locale is:
-
-@smallexample
-Prepare volume #@var{n} for `@var{archive}' and hit return:
-@end smallexample
-
-@noindent
-where @var{n} is the ordinal number of the volume to be created and
-@var{archive} is archive file or device name.
-
-If you run @GNUTAR{} under a different locale, the translation of
-the above prompt to the locale's language will be used.
+prompt, and will expect confirmation from the console. For the
+description of the default prompt, see @ref{change volume prompt}.
@end defvr
@item -v[@var{level}]
@itemx --verbose[=@var{level}]
Set verbosity level. The higher the level is, the more debugging
-information will be output during execution. Devault @var{level}
+information will be output during execution. Default @var{level}
is 100, which means the highest debugging level.
@item -t @var{start-time}
@item -v[@var{level}]
@itemx --verbose[=@var{level}]
Set verbosity level. The higher the level is, the more debugging
-information will be output during execution. Devault @var{level}
+information will be output during execution. Default @var{level}
is 100, which means the highest debugging level.
@item -h
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. @FIXME-xref{Media, for a discussion of tape
-positioning.}
+the tape as needed. @xref{Tape Positioning}, for a discussion of tape
+positioning.
@quotation
@strong{Warning:} The script will delete files from the active file
instead of the default archive file location.
@table @option
-@opindex file, short description
+@xopindex{file, short description}
@item --file=@var{archive-name}
@itemx -f @var{archive-name}
Name the archive to create or operate on. Use in conjunction with
If you do not name the archive, @command{tar} uses the value of the
environment variable @env{TAPE} as the file name for the archive. If
that is not available, @command{tar} uses a default, compiled-in archive
-name, usually that for tape unit zero (ie. @file{/dev/tu00}).
+name, usually that for tape unit zero (i.e., @file{/dev/tu00}).
@cindex Standard input and output
@cindex tar to standard input and output
@option{--add-file} option to prevent it from being treated as an
option.
+@anchor{input name quoting}
+By default @GNUTAR{} attempts to @dfn{unquote} each file or member
+name, replacing @dfn{escape sequences} according to the following
+table:
+
+@multitable @columnfractions 0.20 0.60
+@headitem Escape @tab Replaced with
+@item \a @tab Audible bell (ASCII 7)
+@item \b @tab Backspace (ASCII 8)
+@item \f @tab Form feed (ASCII 12)
+@item \n @tab New line (ASCII 10)
+@item \r @tab Carriage return (ASCII 13)
+@item \t @tab Horizontal tabulation (ASCII 9)
+@item \v @tab Vertical tabulation (ASCII 11)
+@item \? @tab ASCII 127
+@item \@var{n} @tab ASCII @var{n} (@var{n} should be an octal number
+ of up to 3 digits)
+@end multitable
+
+A backslash followed by any other symbol is retained.
+
+This default behavior is controlled by the following command line
+option:
+
+@table @option
+@opindex unquote
+@item --unquote
+Enable unquoting input file or member names (default).
+
+@opindex no-unquote
+@item --no-unquote
+Disable unquoting input file or member names.
+@end table
+
If you specify a directory name as a file name argument, all the files
in that directory are operated on by @command{tar}.
@end smallexample
@noindent
-@opindex directory, using in @option{--files-from} argument
+@xopindex{directory, using in @option{--files-from} argument}
Notice that the option parsing algorithm used with @option{-T} is
stricter than the one used by shell. Namely, when specifying option
arguments, you should observe the following rules:
@node problems with exclude
@unnumberedsubsec Problems with Using the @code{exclude} Options
-@opindex exclude, potential problems with
+@xopindex{exclude, potential problems with}
Some users find @samp{exclude} options confusing. Here are some common
pitfalls:
Notice quoting of the pattern to prevent the shell from interpreting
it.
-The effect of @option{--wildcards} option is cancelled by
+The effect of @option{--wildcards} option is canceled by
@option{--no-wildcards}. This can be used to pass part of
the command line arguments verbatim and other part as globbing
patterns. For example, the following invocation:
@anchor{show-transformed-names}
@table @option
-@opindex --show-transformed-names
+@opindex show-transformed-names
@item --show-transformed-names
Display file or member names with all requested transformations
applied.
@GNUTAR{} provides a general-purpose transformation option:
@table @option
-@opindex --transform
+@opindex transform
@item --transform=@var{expression}
Modify file names using supplied @var{expression}.
@end table
Note: the @var{posix} standard does not specify what should happen
when you mix the @samp{g} and @var{number} modifiers. @GNUTAR{}
follows the GNU @command{sed} implementation in this regard, so
-the the interaction is defined to be: ignore matches before the
+the interaction is defined to be: ignore matches before the
@var{number}th, and then match and replace all matches from the
@var{number}th on.
$ @kbd{tar -cf foo.tar --newer-mtime '2 days ago'}
@end smallexample
+When any of these options is used with the option @option{--verbose}
+(@pxref{verbose tutorial}) @GNUTAR{} will try to convert the specified
+date back to its textual representation and compare that with the
+one given with the option. If the two dates differ, @command{tar} will
+print a warning saying what date it will use. This is to help user
+ensure he is using the right date. For example:
+
+@smallexample
+@group
+$ @kbd{tar -c -f archive.tar --after-date='10 days ago' .}
+tar: Option --after-date: Treating date `10 days ago' as 2006-06-11
+13:19:37.232434
+@end group
+@end smallexample
+
@quotation
@strong{Please Note:} @option{--after-date} and @option{--newer-mtime}
should not be used for incremental backups. @xref{Incremental Dumps},
@node directory
@subsection Changing the Working Directory
-@UNREVISED
@FIXME{need to read over this node now for continuity; i've switched
things around some.}
@smallexample
@group
--C
-/etc
+-C/etc
passwd
hosts
--C
-/lib
+--directory=/lib
libc.a
@end group
@end smallexample
$ @kbd{tar -c -f foo.tar --files-from list}
@end smallexample
-Notice also that you can only use the short option variant in the file
-list, i.e., always use @option{-C}, not @option{--directory}.
-
The interpretation of @option{--directory} is disabled by
@option{--null} option.
characters.
@item The maximum length of a symbolic link name is limited to
100 characters.
-@item Maximum size of a file the archive is able to accomodate
+@item Maximum size of a file the archive is able to accommodate
is 8GB
@item Maximum value of UID/GID is 2097151.
@item Maximum number of bits in device major and minor numbers is 21.
switch to @samp{posix}.
@menu
-* Portability:: Making @command{tar} Archives More Portable
* Compression:: Using Less Space through Compression
* Attributes:: Handling File Attributes
+* Portability:: Making @command{tar} Archives More Portable
* cpio:: Comparison of @command{tar} and @command{cpio}
@end menu
-@node Portability
-@section Making @command{tar} Archives More Portable
-
-Creating a @command{tar} archive on a particular system that is meant to be
-useful later on many other machines and with other versions of @command{tar}
-is more challenging than you might think. @command{tar} archive formats
-have been evolving since the first versions of Unix. Many such formats
-are around, and are not always compatible with each other. This section
-discusses a few problems, and gives some advice about making @command{tar}
-archives more portable.
-
-One golden rule is simplicity. For example, limit your @command{tar}
-archives to contain only regular files and directories, avoiding
-other kind of special files. Do not attempt to save sparse files or
-contiguous files as such. Let's discuss a few more problems, in turn.
-
-@FIXME{Discuss GNU extensions (incremental backups, multi-volume
-archives and archive labels) in GNU and PAX formats.}
+@node Compression
+@section Using Less Space through Compression
@menu
-* Portable Names:: Portable Names
-* dereference:: Symbolic Links
-* old:: Old V7 Archives
-* ustar:: Ustar Archives
-* gnu:: GNU and old GNU format archives.
-* posix:: @acronym{POSIX} archives
-* Checksumming:: Checksumming Problems
-* Large or Negative Values:: Large files, negative time stamps, etc.
+* gzip:: Creating and Reading Compressed Archives
+* sparse:: Archiving Sparse Files
@end menu
-@node Portable Names
-@subsection Portable Names
+@node gzip
+@subsection Creating and Reading Compressed Archives
+@cindex Compressed archives
+@cindex Storing archives in compressed format
-Use portable file and member names. A name is portable if it contains
-only ASCII letters and digits, @samp{/}, @samp{.}, @samp{_}, and
-@samp{-}; it cannot be empty, start with @samp{-} or @samp{//}, or
-contain @samp{/-}. Avoid deep directory nesting. For portability to
-old Unix hosts, limit your file name components to 14 characters or
-less.
+@GNUTAR{} is able to create and read compressed archives. It supports
+@command{gzip} and @command{bzip2} compression programs. For backward
+compatibility, it also supports @command{compress} command, although
+we strongly recommend against using it, since there is a patent
+covering the algorithm it uses and you could be sued for patent
+infringement merely by running @command{compress}! Besides, it is less
+effective than @command{gzip} and @command{bzip2}.
-If you intend to have your @command{tar} archives to be read under
-MSDOS, you should not rely on case distinction for file names, and you
-might use the @acronym{GNU} @command{doschk} program for helping you
-further diagnosing illegal MSDOS names, which are even more limited
-than System V's.
+Creating a compressed archive is simple: you just specify a
+@dfn{compression option} along with the usual archive creation
+commands. The compression option is @option{-z} (@option{--gzip}) to
+create a @command{gzip} compressed archive, @option{-j}
+(@option{--bzip2}) to create a @command{bzip2} compressed archive, and
+@option{-Z} (@option{--compress}) to use @command{compress} program.
+For example:
-@node dereference
-@subsection Symbolic Links
-@cindex File names, using symbolic links
-@cindex Symbolic link as file name
+@smallexample
+$ @kbd{tar cfz archive.tar.gz .}
+@end smallexample
-@opindex dereference
-Normally, when @command{tar} archives a symbolic link, it writes a
-block to the archive naming the target of the link. In that way, the
-@command{tar} archive is a faithful record of the file system contents.
+Reading compressed archive is even simpler: you don't need to specify
+any additional options as @GNUTAR{} recognizes its format
+automatically. Thus, the following commands will list and extract the
+archive created in previous example:
+
+@smallexample
+# List the compressed archive
+$ @kbd{tar tf archive.tar.gz}
+# Extract the compressed archive
+$ @kbd{tar xf archive.tar.gz}
+@end smallexample
+
+The only case when you have to specify a decompression option while
+reading the archive is when reading from a pipe or from a tape drive
+that does not support random access. However, in this case @GNUTAR{}
+will indicate which option you should use. For example:
+
+@smallexample
+$ @kbd{cat archive.tar.gz | tar tf -}
+tar: Archive is compressed. Use -z option
+tar: Error is not recoverable: exiting now
+@end smallexample
+
+If you see such diagnostics, just add the suggested option to the
+invocation of @GNUTAR{}:
+
+@smallexample
+$ @kbd{cat archive.tar.gz | tar tfz -}
+@end smallexample
+
+Notice also, that there are several restrictions on operations on
+compressed archives. First of all, compressed archives cannot be
+modified, i.e., you cannot update (@option{--update} (@option{-u})) them or delete
+(@option{--delete}) members from them. Likewise, you cannot append
+another @command{tar} archive to a compressed archive using
+@option{--append} (@option{-r})). Secondly, multi-volume archives cannot be
+compressed.
+
+The following table summarizes compression options used by @GNUTAR{}.
+
+@table @option
+@opindex gzip
+@opindex ungzip
+@item -z
+@itemx --gzip
+@itemx --ungzip
+Filter the archive through @command{gzip}.
+
+You can use @option{--gzip} and @option{--gunzip} on physical devices
+(tape drives, etc.) and remote files as well as on normal files; data
+to or from such devices or remote files is reblocked by another copy
+of the @command{tar} program to enforce the specified (or default) record
+size. The default compression parameters are used; if you need to
+override them, set @env{GZIP} environment variable, e.g.:
+
+@smallexample
+$ @kbd{GZIP=--best tar cfz archive.tar.gz subdir}
+@end smallexample
+
+@noindent
+Another way would be to avoid the @option{--gzip} (@option{--gunzip}, @option{--ungzip}, @option{-z}) option and run
+@command{gzip} explicitly:
+
+@smallexample
+$ @kbd{tar cf - subdir | gzip --best -c - > archive.tar.gz}
+@end smallexample
+
+@cindex corrupted archives
+About corrupted compressed archives: @command{gzip}'ed files have no
+redundancy, for maximum compression. The adaptive nature of the
+compression scheme means that the compression tables are implicitly
+spread all over the archive. If you lose a few blocks, the dynamic
+construction of the compression tables becomes unsynchronized, and there
+is little chance that you could recover later in the archive.
+
+There are pending suggestions for having a per-volume or per-file
+compression in @GNUTAR{}. This would allow for viewing the
+contents without decompression, and for resynchronizing decompression at
+every volume or file, in case of corrupted archives. Doing so, we might
+lose some compressibility. But this would have make recovering easier.
+So, there are pros and cons. We'll see!
+
+@opindex bzip2
+@item -j
+@itemx --bzip2
+Filter the archive through @code{bzip2}. Otherwise like @option{--gzip}.
+
+@opindex compress
+@opindex uncompress
+@item -Z
+@itemx --compress
+@itemx --uncompress
+Filter the archive through @command{compress}. Otherwise like @option{--gzip}.
+
+The @acronym{GNU} Project recommends you not use
+@command{compress}, because there is a patent covering the algorithm it
+uses. You could be sued for patent infringement merely by running
+@command{compress}.
+
+@opindex use-compress-program
+@item --use-compress-program=@var{prog}
+Use external compression program @var{prog}. Use this option if you
+have a compression program that @GNUTAR{} does not support. There
+are two requirements to which @var{prog} should comply:
+
+First, when called without options, it should read data from standard
+input, compress it and output it on standard output.
+
+Secondly, if called with @option{-d} argument, it should do exactly
+the opposite, i.e., read the compressed data from the standard input
+and produce uncompressed data on the standard output.
+@end table
+
+@cindex gpg, using with tar
+@cindex gnupg, using with tar
+@cindex Using encrypted archives
+The @option{--use-compress-program} option, in particular, lets you
+implement your own filters, not necessarily dealing with
+compression/decompression. For example, suppose you wish to implement
+PGP encryption on top of compression, using @command{gpg} (@pxref{Top,
+gpg, gpg ---- encryption and signing tool, gpg, GNU Privacy Guard
+Manual}). The following script does that:
+
+@smallexample
+@group
+#! /bin/sh
+case $1 in
+-d) gpg --decrypt - | gzip -d -c;;
+'') gzip -c | gpg -s ;;
+*) echo "Unknown option $1">&2; exit 1;;
+esac
+@end group
+@end smallexample
+
+Suppose you name it @file{gpgz} and save it somewhere in your
+@env{PATH}. Then the following command will create a compressed
+archive signed with your private key:
+
+@smallexample
+$ @kbd{tar -cf foo.tar.gpgz --use-compress=gpgz .}
+@end smallexample
+
+@noindent
+Likewise, the following command will list its contents:
+
+@smallexample
+$ @kbd{tar -tf foo.tar.gpgz --use-compress=gpgz .}
+@end smallexample
+
+@ignore
+The above is based on the following discussion:
+
+ I have one question, or maybe it's a suggestion if there isn't a way
+ to do it now. I would like to use @option{--gzip}, but I'd also like
+ the output to be fed through a program like @acronym{GNU}
+ @command{ecc} (actually, right now that's @samp{exactly} what I'd like
+ to use :-)), basically adding ECC protection on top of compression.
+ It seems as if this should be quite easy to do, but I can't work out
+ exactly how to go about it. Of course, I can pipe the standard output
+ of @command{tar} through @command{ecc}, but then I lose (though I
+ haven't started using it yet, I confess) the ability to have
+ @command{tar} use @command{rmt} for it's I/O (I think).
+
+ I think the most straightforward thing would be to let me specify a
+ general set of filters outboard of compression (preferably ordered,
+ so the order can be automatically reversed on input operations, and
+ with the options they require specifiable), but beggars shouldn't be
+ choosers and anything you decide on would be fine with me.
+
+ By the way, I like @command{ecc} but if (as the comments say) it can't
+ deal with loss of block sync, I'm tempted to throw some time at adding
+ that capability. Supposing I were to actually do such a thing and
+ get it (apparently) working, do you accept contributed changes to
+ utilities like that? (Leigh Clayton @file{loc@@soliton.com}, May 1995).
+
+ Isn't that exactly the role of the
+ @option{--use-compress-prog=@var{program}} option?
+ I never tried it myself, but I suspect you may want to write a
+ @var{prog} script or program able to filter stdin to stdout to
+ way you want. It should recognize the @option{-d} option, for when
+ extraction is needed rather than creation.
+
+ It has been reported that if one writes compressed data (through the
+ @option{--gzip} or @option{--compress} options) to a DLT and tries to use
+ the DLT compression mode, the data will actually get bigger and one will
+ end up with less space on the tape.
+@end ignore
+
+@node sparse
+@subsection Archiving Sparse Files
+@cindex Sparse Files
+
+Files in the file system occasionally have @dfn{holes}. A @dfn{hole}
+in a file is a section of the file's contents which was never written.
+The contents of a hole reads as all zeros. On many operating systems,
+actual disk storage is not allocated for holes, but they are counted
+in the length of the file. If you archive such a file, @command{tar}
+could create an archive longer than the original. To have @command{tar}
+attempt to recognize the holes in a file, use @option{--sparse}
+(@option{-S}). When you use this option, then, for any file using
+less disk space than would be expected from its length, @command{tar}
+searches the file for consecutive stretches of zeros. It then records
+in the archive for the file where the consecutive stretches of zeros
+are, and only archives the ``real contents'' of the file. On
+extraction (using @option{--sparse} is not needed on extraction) any
+such files have holes created wherever the continuous stretches of zeros
+were found. Thus, if you use @option{--sparse}, @command{tar} archives
+won't take more space than the original.
+
+@table @option
+@opindex sparse
+@item -S
+@itemx --sparse
+This option instructs @command{tar} to test each file for sparseness
+before attempting to archive it. If the file is found to be sparse it
+is treated specially, thus allowing to decrease the amount of space
+used by its image in the archive.
+
+This option is meaningful only when creating or updating archives. It
+has no effect on extraction.
+@end table
+
+Consider using @option{--sparse} when performing file system backups,
+to avoid archiving the expanded forms of files stored sparsely in the
+system.
+
+Even if your system has no sparse files currently, some may be
+created in the future. If you use @option{--sparse} while making file
+system backups as a matter of course, you can be assured the archive
+will never take more space on the media than the files take on disk
+(otherwise, archiving a disk filled with sparse files might take
+hundreds of tapes). @xref{Incremental Dumps}.
+
+However, be aware that @option{--sparse} option presents a serious
+drawback. Namely, in order to determine if the file is sparse
+@command{tar} has to read it before trying to archive it, so in total
+the file is read @strong{twice}. So, always bear in mind that the
+time needed to process all files with this option is roughly twice
+the time needed to archive them without it.
+@FIXME{A technical note:
+
+Programs like @command{dump} do not have to read the entire file; by
+examining the file system directly, they can determine in advance
+exactly where the holes are and thus avoid reading through them. The
+only data it need read are the actual allocated data blocks.
+@GNUTAR{} uses a more portable and straightforward
+archiving approach, it would be fairly difficult that it does
+otherwise. Elizabeth Zwicky writes to @file{comp.unix.internals}, on
+1990-12-10:
+
+@quotation
+What I did say is that you cannot tell the difference between a hole and an
+equivalent number of nulls without reading raw blocks. @code{st_blocks} at
+best tells you how many holes there are; it doesn't tell you @emph{where}.
+Just as programs may, conceivably, care what @code{st_blocks} is (care
+to name one that does?), they may also care where the holes are (I have
+no examples of this one either, but it's equally imaginable).
+
+I conclude from this that good archivers are not portable. One can
+arguably conclude that if you want a portable program, you can in good
+conscience restore files with as many holes as possible, since you can't
+get it right.
+@end quotation
+}
+
+@cindex sparse formats, defined
+When using @samp{POSIX} archive format, @GNUTAR{} is able to store
+sparse files using in three distinct ways, called @dfn{sparse
+formats}. A sparse format is identified by its @dfn{number},
+consisting, as usual of two decimal numbers, delimited by a dot. By
+default, format @samp{1.0} is used. If, for some reason, you wish to
+use an earlier format, you can select it using
+@option{--sparse-version} option.
+
+@table @option
+@opindex sparse-version
+@item --sparse-version=@var{version}
+
+Select the format to store sparse files in. Valid @var{version} values
+are: @samp{0.0}, @samp{0.1} and @samp{1.0}. @xref{Sparse Formats},
+for a detailed description of each format.
+@end table
+
+Using @option{--sparse-format} option implies @option{--sparse}.
+
+@node Attributes
+@section Handling File Attributes
+@UNREVISED
+
+When @command{tar} reads files, it updates their access times. To
+avoid this, use the @option{--atime-preserve[=METHOD]} option, which can either
+reset the access time retroactively or avoid changing it in the first
+place.
+
+Handling of file attributes
+
+@table @option
+@opindex atime-preserve
+@item --atime-preserve
+@itemx --atime-preserve=replace
+@itemx --atime-preserve=system
+Preserve the access times of files that are read. This works only for
+files that you own, unless you have superuser privileges.
+
+@option{--atime-preserve=replace} works on most systems, but it also
+restores the data modification time and updates the status change
+time. Hence it doesn't interact with incremental dumps nicely
+(@pxref{Incremental Dumps}), and it can set access or data modification times
+incorrectly if other programs access the file while @command{tar} is
+running.
+
+@option{--atime-preserve=system} avoids changing the access time in
+the first place, if the operating system supports this.
+Unfortunately, this may or may not work on any given operating system
+or file system. If @command{tar} knows for sure it won't work, it
+complains right away.
+
+Currently @option{--atime-preserve} with no operand defaults to
+@option{--atime-preserve=replace}, but this is intended to change to
+@option{--atime-preserve=system} when the latter is better-supported.
+
+@opindex touch
+@item -m
+@itemx --touch
+Do not extract data modification time.
+
+When this option is used, @command{tar} leaves the data modification times
+of the files it extracts as the times when the files were extracted,
+instead of setting it to the times recorded in the archive.
+
+This option is meaningless with @option{--list} (@option{-t}).
+
+@opindex same-owner
+@item --same-owner
+Create extracted files with the same ownership they have in the
+archive.
+
+This is the default behavior for the superuser,
+so this option is meaningful only for non-root users, when @command{tar}
+is executed on those systems able to give files away. This is
+considered as a security flaw by many people, at least because it
+makes quite difficult to correctly account users for the disk space
+they occupy. Also, the @code{suid} or @code{sgid} attributes of
+files are easily and silently lost when files are given away.
+
+When writing an archive, @command{tar} writes the user id and user name
+separately. If it can't find a user name (because the user id is not
+in @file{/etc/passwd}), then it does not write one. When restoring,
+it tries to look the name (if one was written) up in
+@file{/etc/passwd}. If it fails, then it uses the user id stored in
+the archive instead.
+
+@opindex no-same-owner
+@item --no-same-owner
+@itemx -o
+Do not attempt to restore ownership when extracting. This is the
+default behavior for ordinary users, so this option has an effect
+only for the superuser.
+
+@opindex numeric-owner
+@item --numeric-owner
+The @option{--numeric-owner} option allows (ANSI) archives to be written
+without user/group name information or such information to be ignored
+when extracting. It effectively disables the generation and/or use
+of user/group name information. This option forces extraction using
+the numeric ids from the archive, ignoring the names.
+
+This is useful in certain circumstances, when restoring a backup from
+an emergency floppy with different passwd/group files for example.
+It is otherwise impossible to extract files with the right ownerships
+if the password file in use during the extraction does not match the
+one belonging to the file system(s) being extracted. This occurs,
+for example, if you are restoring your files after a major crash and
+had booted from an emergency floppy with no password file or put your
+disk into another machine to do the restore.
+
+The numeric ids are @emph{always} saved into @command{tar} archives.
+The identifying names are added at create time when provided by the
+system, unless @option{--old-archive} (@option{-o}) is used. Numeric ids could be
+used when moving archives between a collection of machines using
+a centralized management for attribution of numeric ids to users
+and groups. This is often made through using the NIS capabilities.
+
+When making a @command{tar} file for distribution to other sites, it
+is sometimes cleaner to use a single owner for all files in the
+distribution, and nicer to specify the write permission bits of the
+files as stored in the archive independently of their actual value on
+the file system. The way to prepare a clean distribution is usually
+to have some Makefile rule creating a directory, copying all needed
+files in that directory, then setting ownership and permissions as
+wanted (there are a lot of possible schemes), and only then making a
+@command{tar} archive out of this directory, before cleaning
+everything out. Of course, we could add a lot of options to
+@GNUTAR{} for fine tuning permissions and ownership.
+This is not the good way, I think. @GNUTAR{} is
+already crowded with options and moreover, the approach just explained
+gives you a great deal of control already.
+
+@xopindex{same-permissions, short description}
+@xopindex{preserve-permissions, short description}
+@item -p
+@itemx --same-permissions
+@itemx --preserve-permissions
+Extract all protection information.
+
+This option causes @command{tar} to set the modes (access permissions) of
+extracted files exactly as recorded in the archive. If this option
+is not used, the current @code{umask} setting limits the permissions
+on extracted files. This option is by default enabled when
+@command{tar} is executed by a superuser.
+
+
+This option is meaningless with @option{--list} (@option{-t}).
+
+@opindex preserve
+@item --preserve
+Same as both @option{--same-permissions} and @option{--same-order}.
+
+The @option{--preserve} option has no equivalent short option name.
+It is equivalent to @option{--same-permissions} plus @option{--same-order}.
+
+@FIXME{I do not see the purpose of such an option. (Neither I. FP.)
+Neither do I. --Sergey}
+
+@end table
+
+@node Portability
+@section Making @command{tar} Archives More Portable
+
+Creating a @command{tar} archive on a particular system that is meant to be
+useful later on many other machines and with other versions of @command{tar}
+is more challenging than you might think. @command{tar} archive formats
+have been evolving since the first versions of Unix. Many such formats
+are around, and are not always compatible with each other. This section
+discusses a few problems, and gives some advice about making @command{tar}
+archives more portable.
+
+One golden rule is simplicity. For example, limit your @command{tar}
+archives to contain only regular files and directories, avoiding
+other kind of special files. Do not attempt to save sparse files or
+contiguous files as such. Let's discuss a few more problems, in turn.
+
+@FIXME{Discuss GNU extensions (incremental backups, multi-volume
+archives and archive labels) in GNU and PAX formats.}
+
+@menu
+* Portable Names:: Portable Names
+* dereference:: Symbolic Links
+* old:: Old V7 Archives
+* ustar:: Ustar Archives
+* gnu:: GNU and old GNU format archives.
+* posix:: @acronym{POSIX} archives
+* Checksumming:: Checksumming Problems
+* Large or Negative Values:: Large files, negative time stamps, etc.
+* Other Tars:: How to Extract GNU-Specific Data Using
+ Other @command{tar} Implementations
+@end menu
+
+@node Portable Names
+@subsection Portable Names
+
+Use portable file and member names. A name is portable if it contains
+only ASCII letters and digits, @samp{/}, @samp{.}, @samp{_}, and
+@samp{-}; it cannot be empty, start with @samp{-} or @samp{//}, or
+contain @samp{/-}. Avoid deep directory nesting. For portability to
+old Unix hosts, limit your file name components to 14 characters or
+less.
+
+If you intend to have your @command{tar} archives to be read under
+MSDOS, you should not rely on case distinction for file names, and you
+might use the @acronym{GNU} @command{doschk} program for helping you
+further diagnosing illegal MSDOS names, which are even more limited
+than System V's.
+
+@node dereference
+@subsection Symbolic Links
+@cindex File names, using symbolic links
+@cindex Symbolic link as file name
+
+@opindex dereference
+Normally, when @command{tar} archives a symbolic link, it writes a
+block to the archive naming the target of the link. In that way, the
+@command{tar} archive is a faithful record of the file system contents.
@option{--dereference} (@option{-h}) is used with @option{--create} (@option{-c}), and causes
@command{tar} to archive the files symbolic links point to, instead of
the links themselves. When this option is used, when @command{tar}
archive in V7 format (not ANSI), which can be read by these old
versions, specify the @option{--format=v7} option in
conjunction with the @option{--create} (@option{-c}) (@command{tar} also
-accepts @option{--portability} or @samp{op-old-archive} for this
+accepts @option{--portability} or @option{--old-archive} for this
option). When you specify it,
@command{tar} leaves out information about directories, pipes, fifos,
contiguous files, and device files, and specifies file ownership by
@command{tar} program without serious trouble, so this option should
seldom be needed. On the other hand, most modern @command{tar}s are
able to read old format archives, so it might be safer for you to
-always use @option{--format=v7} for your distributions.
+always use @option{--format=v7} for your distributions. Notice,
+however, that @samp{ustar} format is a better alternative, as it is
+free from many of @samp{v7}'s drawbacks.
@node ustar
@subsection Ustar Archive Format
In the majority of cases, @command{tar} will be configured to create
this format by default. This will change in the future releases, since
-we plan to make @samp{posix} format the default.
+we plan to make @samp{POSIX} format the default.
To force creation a @GNUTAR{} archive, use option
@option{--format=gnu}.
that are not portable to hosts with differing @code{time_t}
representations.
-On the other hand, @acronym{POSIX} archives, generally speaking, can
-be extracted by any tar implementation that understands older
-@acronym{ustar} format. The only exception are files larger than 8GB.
-
-@FIXME{Describe how @acronym{POSIX} archives are extracted by non
-POSIX-aware tars.}
-
-@node Compression
-@section Using Less Space through Compression
-
-@menu
-* gzip:: Creating and Reading Compressed Archives
-* sparse:: Archiving Sparse Files
-@end menu
-
-@node gzip
-@subsection Creating and Reading Compressed Archives
-@cindex Compressed archives
-@cindex Storing archives in compressed format
-
-@GNUTAR{} is able to create and read compressed archives. It supports
-@command{gzip} and @command{bzip2} compression programs. For backward
-compatibilty, it also supports @command{compress} command, although
-we strongly recommend against using it, since there is a patent
-covering the algorithm it uses and you could be sued for patent
-infringement merely by running @command{compress}! Besides, it is less
-effective than @command{gzip} and @command{bzip2}.
-
-Creating a compressed archive is simple: you just specify a
-@dfn{compression option} along with the usual archive creation
-commands. The compression option is @option{-z} (@option{--gzip}) to
-create a @command{gzip} compressed archive, @option{-j}
-(@option{--bzip2}) to create a @command{bzip2} compressed archive, and
-@option{-Z} (@option{--compress}) to use @command{compress} program.
-For example:
-
-@smallexample
-$ @kbd{tar cfz archive.tar.gz .}
-@end smallexample
-
-Reading compressed archive is even simpler: you don't need to specify
-any additional options as @GNUTAR{} recognizes its format
-automatically. Thus, the following commands will list and extract the
-archive created in previous example:
-
-@smallexample
-# List the compressed archive
-$ @kbd{tar tf archive.tar.gz}
-# Extract the compressed archive
-$ @kbd{tar xf archive.tar.gz}
-@end smallexample
-
-The only case when you have to specify a decompression option while
-reading the archive is when reading from a pipe or from a tape drive
-that does not support random access. However, in this case @GNUTAR{}
-will indicate which option you should use. For example:
-
-@smallexample
-$ @kbd{cat archive.tar.gz | tar tf -}
-tar: Archive is compressed. Use -z option
-tar: Error is not recoverable: exiting now
-@end smallexample
+On the other hand, @acronym{POSIX} archives, generally speaking, can
+be extracted by any tar implementation that understands older
+@acronym{ustar} format. The only exception are files larger than 8GB.
-If you see such diagnostics, just add the suggested option to the
-invocation of @GNUTAR{}:
+@FIXME{Describe how @acronym{POSIX} archives are extracted by non
+POSIX-aware tars.}
-@smallexample
-$ @kbd{cat archive.tar.gz | tar tfz -}
-@end smallexample
+@node Other Tars
+@subsection How to Extract GNU-Specific Data Using Other @command{tar} Implementations
-Notice also, that there are several restrictions on operations on
-compressed archives. First of all, compressed archives cannot be
-modified, i.e., you cannot update (@option{--update} (@option{-u})) them or delete
-(@option{--delete}) members from them. Likewise, you cannot append
-another @command{tar} archive to a compressed archive using
-@option{--append} (@option{-r})). Secondly, multi-volume archives cannot be
-compressed.
+In previous sections you became acquainted with various quirks
+necessary to make your archives portable. Sometimes you may need to
+extract archives containing GNU-specific members using some
+third-party @command{tar} implementation or an older version of
+@GNUTAR{}. Of course your best bet is to have @GNUTAR{} installed,
+but if it is for some reason impossible, this section will explain
+how to cope without it.
-The following table summarizes compression options used by @GNUTAR{}.
+When we speak about @dfn{GNU-specific} members we mean two classes of
+them: members split between the volumes of a multi-volume archive and
+sparse members. You will be able to always recover such members if
+the archive is in PAX format. In addition split members can be
+recovered from archives in old GNU format. The following subsections
+describe the required procedures in detail.
-@table @option
-@opindex gzip
-@opindex ungzip
-@item -z
-@itemx --gzip
-@itemx --ungzip
-Filter the archive through @command{gzip}.
+@menu
+* Split Recovery:: Members Split Between Volumes
+* Sparse Recovery:: Sparse Members
+@end menu
-You can use @option{--gzip} and @option{--gunzip} on physical devices
-(tape drives, etc.) and remote files as well as on normal files; data
-to or from such devices or remote files is reblocked by another copy
-of the @command{tar} program to enforce the specified (or default) record
-size. The default compression parameters are used; if you need to
-override them, set @env{GZIP} environment variable, e.g.:
+@node Split Recovery
+@subsubsection Extracting Members Split Between Volumes
+
+@cindex Mutli-volume archives, extracting using non-GNU tars
+If a member is split between several volumes of an old GNU format archive
+most third party @command{tar} implementation will fail to extract
+it. To extract it, use @command{tarcat} program (@pxref{Tarcat}).
+This program is available from
+@uref{http://www.gnu.org/@/software/@/tar/@/utils/@/tarcat.html, @GNUTAR{}
+home page}. It concatenates several archive volumes into a single
+valid archive. For example, if you have three volumes named from
+@file{vol-1.tar} to @file{vol-3.tar}, you can do the following to
+extract them using a third-party @command{tar}:
@smallexample
-$ @kbd{GZIP=--best tar cfz archive.tar.gz subdir}
+$ @kbd{tarcat vol-1.tar vol-2.tar vol-3.tar | tar xf -}
@end smallexample
-@noindent
-Another way would be to avoid the @option{--gzip} (@option{--gunzip}, @option{--ungzip}, @option{-z}) option and run
-@command{gzip} explicitly:
+@cindex Mutli-volume archives in PAX format, extracting using non-GNU tars
+You could use this approach for most (although not all) PAX
+format archives as well. However, extracting split members from a PAX
+archive is a much easier task, because PAX volumes are constructed in
+such a way that each part of a split member is extracted to a
+different file by @command{tar} implementations that are not aware of
+GNU extensions. More specifically, the very first part retains its
+original name, and all subsequent parts are named using the pattern:
@smallexample
-$ @kbd{tar cf - subdir | gzip --best -c - > archive.tar.gz}
+%d/GNUFileParts.%p/%f.%n
@end smallexample
-@cindex corrupted archives
-About corrupted compressed archives: @command{gzip}'ed files have no
-redundancy, for maximum compression. The adaptive nature of the
-compression scheme means that the compression tables are implicitly
-spread all over the archive. If you lose a few blocks, the dynamic
-construction of the compression tables becomes unsynchronized, and there
-is little chance that you could recover later in the archive.
-
-There are pending suggestions for having a per-volume or per-file
-compression in @GNUTAR{}. This would allow for viewing the
-contents without decompression, and for resynchronizing decompression at
-every volume or file, in case of corrupted archives. Doing so, we might
-lose some compressibility. But this would have make recovering easier.
-So, there are pros and cons. We'll see!
-
-@opindex bzip2
-@item -j
-@itemx --bzip2
-Filter the archive through @code{bzip2}. Otherwise like @option{--gzip}.
-
-@opindex compress
-@opindex uncompress
-@item -Z
-@itemx --compress
-@itemx --uncompress
-Filter the archive through @command{compress}. Otherwise like @option{--gzip}.
-
-The @acronym{GNU} Project recommends you not use
-@command{compress}, because there is a patent covering the algorithm it
-uses. You could be sued for patent infringement merely by running
-@command{compress}.
+@noindent
+where symbols preceeded by @samp{%} are @dfn{macro characters} that
+have the following meaning:
-@opindex use-compress-program
-@item --use-compress-program=@var{prog}
-Use external compression program @var{prog}. Use this option if you
-have a compression program that @GNUTAR{} does not support. There
-are two requirements to which @var{prog} should comply:
+@multitable @columnfractions .25 .55
+@headitem Meta-character @tab Replaced By
+@item %d @tab The directory name of the file, equivalent to the
+result of the @command{dirname} utility on its full name.
+@item %f @tab The file name of the file, equivalent to the result
+of the @command{basename} utility on its full name.
+@item %p @tab The process ID of the @command{tar} process that
+created the archive.
+@item %n @tab Ordinal number of this particular part.
+@end multitable
-First, when called without options, it should read data from standard
-input, compress it and output it on standard output.
+For example, if the file @file{var/longfile} was split during archive
+creation between three volumes, and the creator @command{tar} process
+had process ID @samp{27962}, then the member names will be:
-Secondly, if called with @option{-d} argument, it should do exactly
-the opposite, i.e., read the compressed data from the standard input
-and produce uncompressed data on the standard output.
-@end table
+@smallexample
+var/longfile
+var/GNUFileParts.27962/longfile.1
+var/GNUFileParts.27962/longfile.2
+@end smallexample
-@cindex gpg, using with tar
-@cindex gnupg, using with tar
-@cindex Using encrypted archives
-The @option{--use-compress-program} option, in particular, lets you
-implement your own filters, not necessarily dealing with
-compression/decomression. For example, suppose you wish to implement
-PGP encryption on top of compression, using @command{gpg} (@pxref{Top,
-gpg, gpg ---- encryption and signing tool, gpg, GNU Privacy Guard
-Manual}). The following script does that:
+When you extract your archive using a third-party @command{tar}, these
+files will be created on your disk, and the only thing you will need
+to do to restore your file in its original form is concatenate them in
+the proper order, for example:
@smallexample
@group
-#! /bin/sh
-case $1 in
--d) gpg --decrypt - | gzip -d -c;;
-'') gzip -c | gpg -s ;;
-*) echo "Unknown option $1">&2; exit 1;;
-esac
+$ @kbd{cd var}
+$ @kbd{cat GNUFileParts.27962/longfile.1 \
+ GNUFileParts.27962/longfile.2 >> longfile}
+$ rm -f GNUFileParts.27962
@end group
@end smallexample
-Suppose you name it @file{gpgz} and save it somewhere in your
-@env{PATH}. Then the following command will create a commpressed
-archive signed with your private key:
+Notice, that if the @command{tar} implementation you use supports PAX
+format archives, it will probably emit warnings about unknown keywords
+during extraction. They will look like this:
@smallexample
-$ @kbd{tar -cf foo.tar.gpgz --use-compress=gpgz .}
+@group
+Tar file too small
+Unknown extended header keyword 'GNU.volume.filename' ignored.
+Unknown extended header keyword 'GNU.volume.size' ignored.
+Unknown extended header keyword 'GNU.volume.offset' ignored.
+@end group
@end smallexample
@noindent
-Likewise, the following command will list its contents:
+You can safely ignore these warnings.
+
+If your @command{tar} implementation is not PAX-aware, you will get
+more warnings and more files generated on your disk, e.g.:
@smallexample
-$ @kbd{tar -tf foo.tar.gpgz --use-compress=gpgz .}
+@group
+$ @kbd{tar xf vol-1.tar}
+var/PaxHeaders.27962/longfile: Unknown file type 'x', extracted as
+normal file
+Unexpected EOF in archive
+$ @kbd{tar xf vol-2.tar}
+tmp/GlobalHead.27962.1: Unknown file type 'g', extracted as normal file
+GNUFileParts.27962/PaxHeaders.27962/sparsefile.1: Unknown file type
+'x', extracted as normal file
+@end group
@end smallexample
-@ignore
-The above is based on the following discussion:
-
- I have one question, or maybe it's a suggestion if there isn't a way
- to do it now. I would like to use @option{--gzip}, but I'd also like
- the output to be fed through a program like @acronym{GNU}
- @command{ecc} (actually, right now that's @samp{exactly} what I'd like
- to use :-)), basically adding ECC protection on top of compression.
- It seems as if this should be quite easy to do, but I can't work out
- exactly how to go about it. Of course, I can pipe the standard output
- of @command{tar} through @command{ecc}, but then I lose (though I
- haven't started using it yet, I confess) the ability to have
- @command{tar} use @command{rmt} for it's I/O (I think).
-
- I think the most straightforward thing would be to let me specify a
- general set of filters outboard of compression (preferably ordered,
- so the order can be automatically reversed on input operations, and
- with the options they require specifiable), but beggars shouldn't be
- choosers and anything you decide on would be fine with me.
-
- By the way, I like @command{ecc} but if (as the comments say) it can't
- deal with loss of block sync, I'm tempted to throw some time at adding
- that capability. Supposing I were to actually do such a thing and
- get it (apparently) working, do you accept contributed changes to
- utilities like that? (Leigh Clayton @file{loc@@soliton.com}, May 1995).
-
- Isn't that exactly the role of the
- @option{--use-compress-prog=@var{program}} option?
- I never tried it myself, but I suspect you may want to write a
- @var{prog} script or program able to filter stdin to stdout to
- way you want. It should recognize the @option{-d} option, for when
- extraction is needed rather than creation.
-
- It has been reported that if one writes compressed data (through the
- @option{--gzip} or @option{--compress} options) to a DLT and tries to use
- the DLT compression mode, the data will actually get bigger and one will
- end up with less space on the tape.
-@end ignore
-
-@node sparse
-@subsection Archiving Sparse Files
-@cindex Sparse Files
-@UNREVISED
-
-@table @option
-@opindex sparse
-@item -S
-@itemx --sparse
-Handle sparse files efficiently.
-@end table
-
-This option causes all files to be put in the archive to be tested for
-sparseness, and handled specially if they are. The @option{--sparse}
-(@option{-S}) option is useful when many @code{dbm} files, for example, are being
-backed up. Using this option dramatically decreases the amount of
-space needed to store such a file.
-
-In later versions, this option may be removed, and the testing and
-treatment of sparse files may be done automatically with any special
-@acronym{GNU} options. For now, it is an option needing to be specified on
-the command line with the creation or updating of an archive.
-
-Files in the file system occasionally have ``holes.'' A hole in a file
-is a section of the file's contents which was never written. The
-contents of a hole read as all zeros. On many operating systems,
-actual disk storage is not allocated for holes, but they are counted
-in the length of the file. If you archive such a file, @command{tar}
-could create an archive longer than the original. To have @command{tar}
-attempt to recognize the holes in a file, use @option{--sparse} (@option{-S}). When
-you use this option, then, for any file using less disk space than
-would be expected from its length, @command{tar} searches the file for
-consecutive stretches of zeros. It then records in the archive for
-the file where the consecutive stretches of zeros are, and only
-archives the ``real contents'' of the file. On extraction (using
-@option{--sparse} is not needed on extraction) any such
-files have holes created wherever the continuous stretches of zeros
-were found. Thus, if you use @option{--sparse}, @command{tar} archives
-won't take more space than the original.
-
-A file is sparse if it contains blocks of zeros whose existence is
-recorded, but that have no space allocated on disk. When you specify
-the @option{--sparse} option in conjunction with the @option{--create}
-(@option{-c}) operation, @command{tar} tests all files for sparseness
-while archiving. If @command{tar} finds a file to be sparse, it uses a
-sparse representation of the file in the archive. @xref{create}, for
-more information about creating archives.
-
-@option{--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 @option{--sparse} when performing file
-system backups, to avoid archiving the expanded forms of files stored
-sparsely in the system.
-
-Even if your system has no sparse files currently, some may be
-created in the future. If you use @option{--sparse} while making file
-system backups as a matter of course, you can be assured the archive
-will never take more space on the media than the files take on disk
-(otherwise, archiving a disk filled with sparse files might take
-hundreds of tapes). @xref{Incremental Dumps}.
-@end quotation
-
-@command{tar} ignores the @option{--sparse} option when reading an archive.
+Ignore these warnings. The @file{PaxHeaders.*} directories created
+will contain files with @dfn{extended header keywords} describing the
+extracted files. You can delete them, unless they describe sparse
+members. Read further to learn more about them.
-@table @option
-@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 Sparse Recovery
+@subsubsection Extracting Sparse Members
-However, users should be well aware that at archive creation time,
-@GNUTAR{} still has to read whole disk file to
-locate the @dfn{holes}, and so, even if sparse files use little space
-on disk and in the archive, they may sometimes require inordinate
-amount of time for reading and examining all-zero blocks of a file.
-Although it works, it's painfully slow for a large (sparse) file, even
-though the resulting tar archive may be small. (One user reports that
-dumping a @file{core} file of over 400 megabytes, but with only about
-3 megabytes of actual data, took about 9 minutes on a Sun Sparcstation
-ELC, with full CPU utilization.)
-
-This reading is required in all cases and is not related to the fact
-the @option{--sparse} option is used or not, so by merely @emph{not}
-using the option, you are not saving time@footnote{Well! We should say
-the whole truth, here. When @option{--sparse} is selected while creating
-an archive, the current @command{tar} algorithm requires sparse files to be
-read twice, not once. We hope to develop a new archive format for saving
-sparse files in which one pass will be sufficient.}.
+@cindex sparse files, extracting with non-GNU tars
+Any @command{tar} implementation will be able to extract sparse members from a
+PAX archive. However, the extracted files will be @dfn{condensed},
+i.e., any zero blocks will be removed from them. When we restore such
+a condensed file to its original form, by adding zero bloks (or
+@dfn{holes}) back to their original locations, we call this process
+@dfn{expanding} a compressed sparse file.
-Programs like @command{dump} do not have to read the entire file; by
-examining the file system directly, they can determine in advance
-exactly where the holes are and thus avoid reading through them. The
-only data it need read are the actual allocated data blocks.
-@GNUTAR{} uses a more portable and straightforward
-archiving approach, it would be fairly difficult that it does
-otherwise. Elizabeth Zwicky writes to @file{comp.unix.internals}, on
-1990-12-10:
+@pindex xsparse
+To expand a file, you will need a simple auxiliary program called
+@command{xsparse}. It is available in source form from
+@uref{http://www.gnu.org/@/software/@/tar/@/utils/@/xsparse.html, @GNUTAR{}
+home page}.
-@quotation
-What I did say is that you cannot tell the difference between a hole and an
-equivalent number of nulls without reading raw blocks. @code{st_blocks} at
-best tells you how many holes there are; it doesn't tell you @emph{where}.
-Just as programs may, conceivably, care what @code{st_blocks} is (care
-to name one that does?), they may also care where the holes are (I have
-no examples of this one either, but it's equally imaginable).
+@cindex sparse files v.1.0, extracting with non-GNU tars
+Let's begin with archive members in @dfn{sparse format
+version 1.0}@footnote{@xref{PAX 1}.}, which are the easiest to expand.
+The condensed file will contain both file map and file data, so no
+additional data will be needed to restore it. If the original file
+name was @file{@var{dir}/@var{name}}, then the condensed file will be
+named @file{@var{dir}/@/GNUSparseFile.@var{n}/@/@var{name}}, where
+@var{n} is a decimal number@footnote{technically speaking, @var{n} is a
+@dfn{process ID} of the @command{tar} process which created the
+archive (@pxref{PAX keywords}).}.
-I conclude from this that good archivers are not portable. One can
-arguably conclude that if you want a portable program, you can in good
-conscience restore files with as many holes as possible, since you can't
-get it right.
-@end quotation
+To expand a version 1.0 file, run @command{xsparse} as follows:
-@node Attributes
-@section Handling File Attributes
-@UNREVISED
+@smallexample
+$ @kbd{xsparse @file{cond-file}}
+@end smallexample
-When @command{tar} reads files, it updates their access times. To
-avoid this, use the @option{--atime-preserve[=METHOD]} option, which can either
-reset the access time retroactively or avoid changing it in the first
-place.
+@noindent
+where @file{cond-file} is the name of the condensed file. The utility
+will deduce the name for the resulting expanded file using the
+following algorithm:
+
+@enumerate 1
+@item If @file{cond-file} does not contain any directories,
+@file{../cond-file} will be used;
+
+@item If @file{cond-file} has the form
+@file{@var{dir}/@var{t}/@var{name}}, where both @var{t} and @var{name}
+are simple names, with no @samp{/} characters in them, the output file
+name will be @file{@var{dir}/@var{name}}.
+
+@item Otherwise, if @file{cond-file} has the form
+@file{@var{dir}/@var{name}}, the output file name will be
+@file{@var{name}}.
+@end enumerate
-Handling of file attributes
+In the unlikely case when this algorithm does not suite your needs,
+you can explicitly specify output file name as a second argument to
+the command:
-@table @option
-@opindex atime-preserve
-@item --atime-preserve
-@itemx --atime-preserve=replace
-@itemx --atime-preserve=system
-Preserve the access times of files that are read. This works only for
-files that you own, unless you have superuser privileges.
+@smallexample
+$ @kbd{xsparse @file{cond-file} @file{out-file}}
+@end smallexample
-@option{--atime-preserve=replace} works on most systems, but it also
-restores the data modification time and updates the status change
-time. Hence it doesn't interact with incremental dumps nicely
-(@pxref{Backups}), and it can set access or data modification times
-incorrectly if other programs access the file while @command{tar} is
-running.
+It is often a good idea to run @command{xsparse} in @dfn{dry run} mode
+first. In this mode, the command does not actually expand the file,
+but verbosely lists all actions it would be taking to do so. The dry
+run mode is enabled by @option{-n} command line argument:
-@option{--atime-preserve=system} avoids changing the access time in
-the first place, if the operating system supports this.
-Unfortunately, this may or may not work on any given operating system
-or file system. If @command{tar} knows for sure it won't work, it
-complains right away.
+@smallexample
+@group
+$ @kbd{xsparse -n /home/gray/GNUSparseFile.6058/sparsefile}
+Reading v.1.0 sparse map
+Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+`/home/gray/sparsefile'
+Finished dry run
+@end group
+@end smallexample
-Currently @option{--atime-preserve} with no operand defaults to
-@option{--atime-preserve=replace}, but this is intended to change to
-@option{--atime-preserve=system} when the latter is better-supported.
+To actually expand the file, you would run:
-@opindex touch
-@item -m
-@itemx --touch
-Do not extract data modification time.
+@smallexample
+$ @kbd{xsparse /home/gray/GNUSparseFile.6058/sparsefile}
+@end smallexample
-When this option is used, @command{tar} leaves the data modification times
-of the files it extracts as the times when the files were extracted,
-instead of setting it to the times recorded in the archive.
+@noindent
+The program behaves the same way all UNIX utilities do: it will keep
+quiet unless it has simething important to tell you (e.g. an error
+condition or something). If you wish it to produce verbose output,
+similar to that from the dry run mode, use @option{-v} option:
-This option is meaningless with @option{--list} (@option{-t}).
+@smallexample
+@group
+$ @kbd{xsparse -v /home/gray/GNUSparseFile.6058/sparsefile}
+Reading v.1.0 sparse map
+Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+`/home/gray/sparsefile'
+Done
+@end group
+@end smallexample
-@opindex same-owner
-@item --same-owner
-Create extracted files with the same ownership they have in the
-archive.
+Additionally, if your @command{tar} implementation has extracted the
+@dfn{extended headers} for this file, you can instruct @command{xstar}
+to use them in order to verify the integrity of the expanded file.
+The option @option{-x} sets the name of the extended header file to
+use. Continuing our example:
-This is the default behavior for the superuser,
-so this option is meaningful only for non-root users, when @command{tar}
-is executed on those systems able to give files away. This is
-considered as a security flaw by many people, at least because it
-makes quite difficult to correctly account users for the disk space
-they occupy. Also, the @code{suid} or @code{sgid} attributes of
-files are easily and silently lost when files are given away.
+@smallexample
+@group
+$ @kbd{xsparse -v -x /home/gray/PaxHeaders.6058/sparsefile \
+ /home/gray/GNUSparseFile.6058/sparsefile}
+Reading extended header file
+Found variable GNU.sparse.major = 1
+Found variable GNU.sparse.minor = 0
+Found variable GNU.sparse.name = sparsefile
+Found variable GNU.sparse.realsize = 217481216
+Reading v.1.0 sparse map
+Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+`/home/gray/sparsefile'
+Done
+@end group
+@end smallexample
-When writing an archive, @command{tar} writes the user id and user name
-separately. If it can't find a user name (because the user id is not
-in @file{/etc/passwd}), then it does not write one. When restoring,
-it tries to look the name (if one was written) up in
-@file{/etc/passwd}. If it fails, then it uses the user id stored in
-the archive instead.
+@anchor{extracting sparse v.0.x}
+@cindex sparse files v.0.1, extracting with non-GNU tars
+@cindex sparse files v.0.0, extracting with non-GNU tars
+An @dfn{extended header} is a special @command{tar} archive header
+that precedes an archive member and contains a set of
+@dfn{variables}, describing the member properties that cannot be
+stored in the standard @code{ustar} header. While optional for
+expanding sparse version 1.0 members, use of extended headers is
+mandatory when expanding sparse members in older sparse formats: v.0.0
+and v.0.1 (The sparse formats are described in detail in @ref{Sparse
+Formats}.) So, for this format, the question is: how to obtain
+extended headers from the archive?
+
+If you use a @command{tar} implementation that does not support PAX
+format, extended headers for each member will be extracted as a
+separate file. If we represent the member name as
+@file{@var{dir}/@var{name}}, then the extended header file will be
+named @file{@var{dir}/@/PaxHeaders.@var{n}/@/@var{name}}, where
+@var{n} is an integer number.
+
+Things become more difficult if your @command{tar} implementation
+does support PAX headers, because in this case you will have to
+manually extract the headers. We recommend the following algorithm:
+
+@enumerate 1
+@item
+Consult the documentation of your @command{tar} implementation for an
+option that prints @dfn{block numbers} along with the archive
+listing (analogous to @GNUTAR{}'s @option{-R} option). For example,
+@command{star} has @option{-block-number}.
-@opindex no-same-owner
-@item --no-same-owner
-@itemx -o
-Do not attempt to restore ownership when extracting. This is the
-default behavior for ordinary users, so this option has an effect
-only for the superuser.
+@item
+Obtain verbose listing using the @samp{block number} option, and
+find block numbers of the sparse member in question and the member
+immediately following it. For example, running @command{star} on our
+archive we obtain:
-@opindex numeric-owner
-@item --numeric-owner
-The @option{--numeric-owner} option allows (ANSI) archives to be written
-without user/group name information or such information to be ignored
-when extracting. It effectively disables the generation and/or use
-of user/group name information. This option forces extraction using
-the numeric ids from the archive, ignoring the names.
+@smallexample
+@group
+$ @kbd{star -t -v -block-number -f arc.tar}
+@dots{}
+star: Unknown extended header keyword 'GNU.sparse.size' ignored.
+star: Unknown extended header keyword 'GNU.sparse.numblocks' ignored.
+star: Unknown extended header keyword 'GNU.sparse.name' ignored.
+star: Unknown extended header keyword 'GNU.sparse.map' ignored.
+block 56: 425984 -rw-r--r-- gray/users Jun 25 14:46 2006 GNUSparseFile.28124/sparsefile
+block 897: 65391 -rw-r--r-- gray/users Jun 24 20:06 2006 README
+@dots{}
+@end group
+@end smallexample
-This is useful in certain circumstances, when restoring a backup from
-an emergency floppy with different passwd/group files for example.
-It is otherwise impossible to extract files with the right ownerships
-if the password file in use during the extraction does not match the
-one belonging to the file system(s) being extracted. This occurs,
-for example, if you are restoring your files after a major crash and
-had booted from an emergency floppy with no password file or put your
-disk into another machine to do the restore.
+@noindent
+(as usual, ignore the warnings about unknown keywords.)
-The numeric ids are @emph{always} saved into @command{tar} archives.
-The identifying names are added at create time when provided by the
-system, unless @option{--old-archive} (@option{-o}) is used. Numeric ids could be
-used when moving archives between a collection of machines using
-a centralized management for attribution of numeric ids to users
-and groups. This is often made through using the NIS capabilities.
+@item
+Let @var{size} be the size of the sparse member, @var{Bs} be its block number
+and @var{Bn} be the block number of the next member.
+Compute:
-When making a @command{tar} file for distribution to other sites, it
-is sometimes cleaner to use a single owner for all files in the
-distribution, and nicer to specify the write permission bits of the
-files as stored in the archive independently of their actual value on
-the file system. The way to prepare a clean distribution is usually
-to have some Makefile rule creating a directory, copying all needed
-files in that directory, then setting ownership and permissions as
-wanted (there are a lot of possible schemes), and only then making a
-@command{tar} archive out of this directory, before cleaning
-everything out. Of course, we could add a lot of options to
-@GNUTAR{} for fine tuning permissions and ownership.
-This is not the good way, I think. @GNUTAR{} is
-already crowded with options and moreover, the approach just explained
-gives you a great deal of control already.
+@smallexample
+@var{N} = @var{Bs} - @var{Bn} - @var{size}/512 - 2
+@end smallexample
-@opindex same-permissions, short description
-@opindex preserve-permissions, short description
-@item -p
-@itemx --same-permissions
-@itemx --preserve-permissions
-Extract all protection information.
+@noindent
+This number gives the size of the extended header part in tar @dfn{blocks}.
+In our example, this formula gives: @code{897 - 56 - 425984 / 512 - 2
+= 7}.
-This option causes @command{tar} to set the modes (access permissions) of
-extracted files exactly as recorded in the archive. If this option
-is not used, the current @code{umask} setting limits the permissions
-on extracted files. This option is by default enabled when
-@command{tar} is executed by a superuser.
+@item
+Use @command{dd} to extract the headers:
+@smallexample
+@kbd{dd if=@var{archive} of=@var{hname} bs=512 skip=@var{Bs} count=@var{N}}
+@end smallexample
-This option is meaningless with @option{--list} (@option{-t}).
+@noindent
+where @var{archive} is the archive name, @var{hname} is a name of the
+file to store the extended header in, @var{Bs} and @var{N} are
+computed in previous steps.
-@opindex preserve
-@item --preserve
-Same as both @option{--same-permissions} and @option{--same-order}.
+In our example, this command will be
-The @option{--preserve} option has no equivalent short option name.
-It is equivalent to @option{--same-permissions} plus @option{--same-order}.
+@smallexample
+$ @kbd{dd if=arc.tar of=xhdr bs=512 skip=56 count=7}
+@end smallexample
+@end enumerate
-@FIXME{I do not see the purpose of such an option. (Neither I. FP.)
-Neither do I. --Sergey}
+Finally, you can expand the condensed file, using the obtained header:
-@end table
+@smallexample
+@group
+$ @kbd{xsparse -v -x xhdr GNUSparseFile.6058/sparsefile}
+Reading extended header file
+Found variable GNU.sparse.size = 217481216
+Found variable GNU.sparse.numblocks = 208
+Found variable GNU.sparse.name = sparsefile
+Found variable GNU.sparse.map = 0,2048,1050624,2048,@dots{}
+Expanding file `GNUSparseFile.28124/sparsefile' to `sparsefile'
+Done
+@end group
+@end smallexample
@node cpio
@section Comparison of @command{tar} and @command{cpio}
@file{<sys/mtio.h>}.
@table @option
-@opindex force-local, short description
+@xopindex{force-local, short description}
@item --force-local
Archive file is local even if it contains a colon.
@item -[0-7][lmh]
Specify drive and density.
-@opindex multi-volume, short description
+@xopindex{multi-volume, short description}
@item -M
@itemx --multi-volume
Create/list/extract multi-volume archive.
that may be larger than will fit on the medium used to hold it.
@xref{Multi-Volume Archives}.
-@opindex tape-length, short description
+@xopindex{tape-length, short description}
@item -L @var{num}
@itemx --tape-length=@var{num}
Change tape after writing @var{num} x 1024 bytes.
detect end of physical tapes. By being slightly conservative on the
maximum tape length, you might avoid the problem entirely.
-@opindex info-script, short description
-@opindex new-volume-script, short description
+@xopindex{info-script, short description}
+@xopindex{new-volume-script, short description}
@item -F @var{file}
@itemx --info-script=@var{file}
@itemx --new-volume-script=@var{file}
@opindex blocking-factor
The data in an archive is grouped into blocks, which are 512 bytes.
Blocks are read and written in whole number multiples called
-@dfn{records}. The number of blocks in a record (ie. the size of a
+@dfn{records}. The number of blocks in a record (i.e., the size of a
record in units of 512 bytes) is called the @dfn{blocking factor}.
The @option{--blocking-factor=@var{512-size}} (@option{-b
@var{512-size}}) option specifies the blocking factor of an archive.
blocking factor (particularly if you're not sure what the blocking factor
is), you can usually use the @option{--read-full-records} (@option{-B}) option while
specifying a blocking factor larger then the blocking factor of the archive
-(ie. @samp{tar --extract --read-full-records --blocking-factor=300}.
+(i.e., @samp{tar --extract --read-full-records --blocking-factor=300}.
@xref{list}, for more information on the @option{--list} (@option{-t})
operation. @xref{Reading}, for a more detailed explanation of that option.
@command{tar} should rather drain the pipe out before exiting itself.
@end itemize
-@opindex ignore-zeros, short description
+@xopindex{ignore-zeros, short description}
@item -i
@itemx --ignore-zeros
Ignore blocks of zeros in archive (means EOF).
archive file, which may sometimes avoid problems when multiple files
are stored on a single physical tape.
-@opindex read-full-records, short description
+@xopindex{read-full-records, short description}
@item -B
@itemx --read-full-records
Reblock as we read (for reading 4.2BSD pipes).
@node Using Multiple Tapes
@section Using Multiple Tapes
-@UNREVISED
Often you might want to write a large archive, one larger than will fit
on the actual tape you are using. In such a case, you can run multiple
@command{tar} commands, but this can be inconvenient, particularly if you
are using options like @option{--exclude=@var{pattern}} or dumping entire file systems.
-Therefore, @command{tar} supports multiple tapes automatically.
+Therefore, @command{tar} provides a special mode for creating
+multi-volume archives.
+
+@dfn{Multi-volume} archive is a single @command{tar} archive, stored
+on several media volumes of fixed size. Although in this section we will
+often call @samp{volume} a @dfn{tape}, there is absolutely no
+requirement for multi-volume archives to be stored on tapes. Instead,
+they can use whatever media type the user finds convenient, they can
+even be located on files.
+
+When creating a multi-volume archive, @GNUTAR{} continues to fill
+current volume until it runs out of space, then it switches to
+next volume (usually the operator is queried to replace the tape on
+this point), and continues working on the new volume. This operation
+continues until all requested files are dumped. If @GNUTAR{} detects
+end of media while dumping a file, such a file is archived in split
+form. Some very big files can even be split across several volumes.
+
+Each volume is itself a valid @GNUTAR{} archive, so it can be read
+without any special options. Consequently any file member residing
+entirely on one volume can be extracted or otherwise operated upon
+without needing the other volume. Sure enough, to extract a split
+member you would need all volumes its parts reside on.
+
+Multi-volume archives suffer from several limitations. In particular,
+they cannot be compressed.
+
+@GNUTAR{} is able to create multi-volume archives of two formats
+(@pxref{Formats}): @samp{GNU} and @samp{POSIX}.
+
+@menu
+* Multi-Volume Archives:: Archives Longer than One Tape or Disk
+* Tape Files:: Tape Files
+* Tarcat:: Concatenate Volumes into a Single Archive
+
+@end menu
+
+@node Multi-Volume Archives
+@subsection Archives Longer than One Tape or Disk
+@cindex Multi-volume archives
+
+@opindex multi-volume
+To create an archive that is larger than will fit on a single unit of
+the media, use the @option{--multi-volume} (@option{-M}) option in conjunction with
+the @option{--create} option (@pxref{create}). A @dfn{multi-volume}
+archive can be manipulated like any other archive (provided the
+@option{--multi-volume} option is specified), but is stored on more
+than one tape or disk.
+
+When you specify @option{--multi-volume}, @command{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.
+
+@table @option
+@item --multi-volume
+@itemx -M
+Creates a multi-volume archive, when used in conjunction with
+@option{--create} (@option{-c}). To perform any other operation on a multi-volume
+archive, specify @option{--multi-volume} in conjunction with that
+operation.
+For example:
+
+@smallexample
+$ @kbd{tar --create --multi-volume --file=/dev/tape @var{files}}
+@end smallexample
+@end table
+
+The method @command{tar} uses to detect end of tape is not perfect, and
+fails on some operating systems or on some devices. If @command{tar}
+cannot detect the end of the tape itself, you can use
+@option{--tape-length} option to inform it about the capacity of the
+tape:
+
+@anchor{tape-length}
+@table @option
+@opindex tape-length
+@item --tape-length=@var{size}
+@itemx -L @var{size}
+Set maximum length of a volume. The @var{size} argument should then
+be the usable size of the tape in units of 1024 bytes. This option
+selects @option{--multi-volume} automatically. For example:
+
+@smallexample
+$ @kbd{tar --create --tape-length=41943040 --file=/dev/tape @var{files}}
+@end smallexample
+@end table
+
+@anchor{change volume prompt}
+When @GNUTAR{} comes to the end of a storage media, it asks you to
+change the volume. The built-in prompt for POSIX locale
+is@footnote{If you run @GNUTAR{} under a different locale, the
+translation to the locale's language will be used.}:
-Use @option{--multi-volume} (@option{-M}) on the command line, and
-then @command{tar} will, when it reaches the end of the tape, prompt
-for another tape, and continue the archive. Each tape will have an
-independent archive, and can be read without needing the other. (As
-an exception to this, the file that @command{tar} was archiving when
-it ran out of tape will usually be split between the two archives; in
-this case you need to extract from the first archive, using
-@option{--multi-volume}, and then put in the second tape when
-prompted, so @command{tar} can restore both halves of the file.)
+@smallexample
+Prepare volume #@var{n} for `@var{archive}' and hit return:
+@end smallexample
-@GNUTAR{} multi-volume archives do not use a truly portable format.
-You need @GNUTAR{} at both ends to process them properly.
+@noindent
+where @var{n} is the ordinal number of the volume to be created and
+@var{archive} is archive file or device name.
When prompting for a new tape, @command{tar} accepts any of the following
responses:
Request @command{tar} to write the next volume on the file @var{file-name}.
@item !
Request @command{tar} to run a subshell. This option can be disabled
-by giving @option{--restrict} command line option to @command{tar}.
+by giving @option{--restrict} command line option to
+@command{tar}@footnote{@xref{--restrict}, for more information about
+this option}.
@item y
Request @command{tar} to begin writing the next volume.
@end table
(You should only type @samp{y} after you have changed the tape;
otherwise @command{tar} will write over the volume it just finished.)
+@cindex Volume number file
+@cindex volno file
+@anchor{volno-file}
+@opindex volno-file
+The volume number used by @command{tar} in its tape-changing prompt
+can be changed; if you give the
+@option{--volno-file=@var{file-of-number}} option, then
+@var{file-of-number} should be an non-existing file to be created, or
+else, a file already containing a decimal number. That number will be
+used as the volume number of the first volume written. When
+@command{tar} is finished, it will rewrite the file with the
+now-current volume number. (This does not change the volume number
+written on a tape label, as per @ref{label}, it @emph{only} affects
+the number used in the prompt.)
+
@cindex End-of-archive info script
@cindex Info script
@anchor{info-script}
@opindex info-script
@opindex new-volume-script
-If you want more elaborate behavior than this, give @command{tar} the
-@option{--info-script=@var{script-name}}
-(@option{--new-volume-script=@var{script-name}}, @option{-F
-@var{script-name}}) option. The file @var{script-name} is expected to
-be a program (or shell script) to be run instead of the normal
-prompting procedure. It is executed without any command line
-arguments. Additional data is passed to it via the following
+If you want more elaborate behavior than this, you can write a special
+@dfn{new volume script}, that will be responsible for changing the
+volume, and instruct @command{tar} to use it instead of its normal
+prompting procedure:
+
+@table @option
+@item --info-script=@var{script-name}
+@itemx --new-volume-script=@var{script-name}
+@itemx -F @var{script-name}
+Specify the full name of the volume script to use. The script can be
+used to eject cassettes, or to broadcast messages such as
+@samp{Someone please come change my tape} when performing unattended
+backups.
+@end table
+
+The @var{script-name} is executed without any command line
+arguments. It inherits @command{tar}'s shell environment.
+Additional data is passed to it via the following
environment variables:
@table @env
list of archive format names.
@end table
-The info script can instruct @command{tar} to use new archive name,
-by writing in to file descriptor 3 (see below for an
-example).
+The volume script can instruct @command{tar} to use new archive name,
+by writing in to file descriptor 3 (see below for an example).
If the info script fails, @command{tar} exits; otherwise, it begins
writing the next volume.
-The method @command{tar} uses to detect end of tape is not perfect, and
-fails on some operating systems or on some devices. You can use the
-@option{--tape-length=@var{size}} (@option{-L @var{size}}) option if
-@command{tar} can't detect the end of the tape itself. This option
-selects @option{--multi-volume} (@option{-M}) automatically. The
-@var{size} argument should then be the usable size of the tape in
-units of 1024 bytes. But for many devices, and floppy disks in
-particular, this option is never required for real, as far as we know.
-
-@cindex Volume number file
-@cindex volno file
-@anchor{volno-file}
-@opindex volno-file
-The volume number used by @command{tar} in its tape-change prompt
-can be changed; if you give the
-@option{--volno-file=@var{file-of-number}} option, then
-@var{file-of-number} should be an unexisting file to be created, or
-else, a file already containing a decimal number. That number will be
-used as the volume number of the first volume written. When
-@command{tar} is finished, it will rewrite the file with the
-now-current volume number. (This does not change the volume number
-written on a tape label, as per @ref{label}, it @emph{only} affects
-the number used in the prompt.)
-
If you want @command{tar} to cycle through a series of files or tape
drives, there are three approaches to choose from. First of all, you
-can give @command{tar} multiple @option{--file} options. In this case
+can give @command{tar} multiple @option{--file} options. In this case
the specified files will be used, in sequence, as the successive
volumes of the archive. Only when the first one in the sequence needs
to be used again will @command{tar} prompt for a tape change (or run
-the info script). Secondly, you can use the @samp{n} response to the
-tape-change prompt, and, finally, you can use an info script, that
-writes new archive name to file descriptor. The following example
-illustrates this approach:
+the info script). For example, suppose someone has two tape drives on
+a system named @file{/dev/tape0} and @file{/dev/tape1}. For having
+@GNUTAR{} to switch to the second drive when it needs to write the
+second tape, and then back to the first tape, etc., just do either of:
+
+@smallexample
+$ @kbd{tar --create --multi-volume --file=/dev/tape0 --file=/dev/tape1 @var{files}}
+$ @kbd{tar cMff /dev/tape0 /dev/tape1 @var{files}}
+@end smallexample
+
+The second method is to use the @samp{n} response to the tape-change
+prompt.
+
+Finally, the most flexible approach is to use a volume script, that
+writes new archive name to the file descriptor #3. For example, the
+following volume script will create a series of archive files, named
+@file{@var{archive}-@var{vol}}, where @var{archive} is the name of the
+archive being created (as given by @option{--file} option) and
+@var{vol} is the ordinal number of the archive being created:
@smallexample
@group
@end group
@end smallexample
-Each volume of a multi-volume archive is an independent @command{tar}
-archive, complete in itself. For example, you can list or extract any
-volume alone; just don't specify @option{--multi-volume}
-(@option{-M}). However, if one file in the archive is split across
-volumes, the only way to extract it successfully is with a
-multi-volume extract command @option{--extract --multi-volume}
-(@option{-xM}) starting on or before the volume where the file begins.
-
-For example, let's presume someone has two tape drives on a system
-named @file{/dev/tape0} and @file{/dev/tape1}. For having @GNUTAR{}
-to switch to the second drive when it needs to write the
-second tape, and then back to the first tape, etc., just do either of:
+The same script cant be used while listing, comparing or extracting
+from the created archive. For example:
@smallexample
-$ @kbd{tar --create --multi-volume --file=/dev/tape0 --file=/dev/tape1 @var{files}}
-$ @kbd{tar cMff /dev/tape0 /dev/tape1 @var{files}}
+@group
+# @r{Create a multi-volume archive:}
+$ @kbd{tar -c -L1024 -f archive.tar -F new-volume .}
+# @r{Extract from the created archive:}
+$ @kbd{tar -x -f archive.tar -F new-volume .}
+@end group
@end smallexample
-@menu
-* Multi-Volume Archives:: Archives Longer than One Tape or Disk
-* Tape Files:: Tape Files
-* Tarcat:: Concatenate Volumes into a Single Archive
-
-@end menu
-
-@node Multi-Volume Archives
-@subsection Archives Longer than One Tape or Disk
-@cindex Multi-volume archives
-@UNREVISED
-
-@opindex multi-volume
-To create an archive that is larger than will fit on a single unit of
-the media, use the @option{--multi-volume} (@option{-M}) option in conjunction with
-the @option{--create} option (@pxref{create}). A @dfn{multi-volume}
-archive can be manipulated like any other archive (provided the
-@option{--multi-volume} option is specified), but is stored on more
-than one tape or disk.
-
-When you specify @option{--multi-volume}, @command{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.
+@noindent
+Notice, that the first command had to use @option{-L} option, since
+otherwise @GNUTAR{} will end up writing everything to file
+@file{archive.tar}.
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
that volume), use @option{--extract}, again without
@option{--multi-volume}.
-If an archive member is split across volumes (ie. its entry begins on
+If an archive member is split across volumes (i.e., its entry begins on
one volume of the media and ends on another), you need to specify
@option{--multi-volume} to extract it successfully. In this case, you
should load the volume where the archive member starts, and use
volumes as it needs them. @xref{extracting archives}, for more
information about extracting archives.
-@option{--info-script=@var{script-name}}
-(@option{--new-volume-script=@var{script-name}}, @option{-F
-@var{script-name}}) (@pxref{info-script}) is like
-@option{--multi-volume} (@option{-M}), except that @command{tar} does
-not prompt you directly to change media volumes when a volume is
-full---instead, @command{tar} runs commands you have stored in
-@var{script-name}. For example, this option can be used to eject
-cassettes, or to broadcast messages such as @samp{Someone please come
-change my tape} when performing unattended backups. When
-@var{script-name} is done, @command{tar} will assume that the media
-has been changed.
-
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
-@option{--label=@var{archive-label}} (@option{-V @var{archive-label}})
-(@pxref{label}) when it was created, @command{tar} will not
-automatically label volumes which are added later. To label
-subsequent volumes, specify @option{--label=@var{archive-label}} again
-in conjunction with the @option{--append}, @option{--update} or
-@option{--concatenate} operation.
-
-@cindex Labeling multi-volume archives
-@FIXME{example}
-
-@FIXME{There should be a sample program here, including an exit
-before end. Is the exit status even checked in tar? :-(}
-
-@table @option
-@item --multi-volume
-@itemx -M
-Creates a multi-volume archive, when used in conjunction with
-@option{--create} (@option{-c}). To perform any other operation on a multi-volume
-archive, specify @option{--multi-volume} in conjunction with that
-operation.
+@option{--label=@var{archive-label}} (@pxref{label}) when it was
+created, @command{tar} will not automatically label volumes which are
+added later. To label subsequent volumes, specify
+@option{--label=@var{archive-label}} again in conjunction with the
+@option{--append}, @option{--update} or @option{--concatenate} operation.
-@item --info-script=@var{program-file}
-@itemx --new-volume-script=@var{program-file}
-@itemx -F @var{program-file}
-Creates a multi-volume archive via a script. Used in conjunction with
-@option{--create} (@option{-c}). @xref{info-script}, dor a detailed discussion.
-@end table
-
-Beware that there is @emph{no} real standard about the proper way, for
-a @command{tar} archive, to span volume boundaries. If you have a
-multi-volume created by some vendor's @command{tar}, there is almost
-no chance you could read all the volumes with @GNUTAR{}.
-The converse is also true: you may not expect
-multi-volume archives created by @GNUTAR{} to be
-fully recovered by vendor's @command{tar}. Since there is little
-chance that, in mixed system configurations, some vendor's
-@command{tar} will work on another vendor's machine, and there is a
-great chance that @GNUTAR{} will work on most of
-them, your best bet is to install @GNUTAR{} on all
-machines between which you know exchange of files is possible.
+Notice that multi-volume support is a GNU extension and the archives
+created in this mode should be read only using @GNUTAR{}. If you
+absolutely have to process such archives using a third-party @command{tar}
+implementation, read @ref{Split Recovery}.
@node Tape Files
@subsection Tape Files
@section Including a Label in the Archive
@cindex Labeling an archive
@cindex Labels on the archive media
+@cindex Labeling multi-volume archives
@UNREVISED
@opindex label
@cindex Listing volume label
The volume label will be displayed by @option{--list} along with
the file contents. If verbose display is requested, it will also be
-explicitely marked as in the example below:
+explicitly marked as in the example below:
@smallexample
@group
the archive label matches the one specified and will refuse to proceed
if it does not. Use this as a safety precaution to avoid accidentally
overwriting existing archives. For example, if you wish to add files
-to @file{archive}, presumably labelled with string @samp{My volume},
+to @file{archive}, presumably labeled with string @samp{My volume},
you will get:
@smallexample
@noindent
in case its label does not match. This will work even if
-@file{archive} is not labelled at all.
+@file{archive} is not labeled at all.
Similarly, @command{tar} will refuse to list or extract the
archive if its label doesn't match the @var{archive-label}
operation, or can compare a previously written archive, to insure that
it is up to date.
-@opindex verify, using with @option{--create}
-@opindex create, using with @option{--verify}
+@xopindex{verify, using with @option{--create}}
+@xopindex{create, using with @option{--verify}}
To check for discrepancies in an archive immediately after it is
written, use the @option{--verify} (@option{-W}) option in conjunction with
the @option{--create} operation. When this option is
@appendix Configuring Help Summary
Running @kbd{tar --help} displays the short @command{tar} option
-summary (@pxref{help}). This summary is organised by @dfn{groups} of
+summary (@pxref{help}). This summary is organized by @dfn{groups} of
semantically close options. The options within each group are printed
in the following order: a short option, eventually followed by a list
of corresponding long option names, followed by a short description of
Right margin of the text output. Used for wrapping.
@end deftypevr
-@node Genfile
-@appendix Genfile
-@include genfile.texi
-
@node Tar Internals
@appendix Tar Internals
@include intern.texi
+@node Genfile
+@appendix Genfile
+@include genfile.texi
+
@node Free Software Needs Free Documentation
@appendix Free Software Needs Free Documentation
@include freemanuals.texi
@appendix Index of Command Line Options
This appendix contains an index of all @GNUTAR{} long command line
-options. The options are listed without the preceeding double-dash.
-
-@FIXME{@itemize
-@item Make sure @emph{all} options are indexed.
-@item Provide an index of short options
-@end itemize}
+options. The options are listed without the preceding double-dash.
+For a cross-reference of short command line options, @ref{Short Option Summary}.
@printindex op