* doc/tar.1: Add needed option -f after operation -A, sort operation -t alphabetically, add --file after --concatenate, consistently use long option --file in the GNU-style section, and delete duplicate --update. * doc/tar.texi: Add small missing word, and lowercase a letter.
13425 lines
490 KiB
Plaintext
13425 lines
490 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
|
@comment %**start of header
|
|
@setfilename tar.info
|
|
@include version.texi
|
|
@settitle GNU tar @value{VERSION}
|
|
@setchapternewpage odd
|
|
|
|
@documentencoding UTF-8
|
|
@c These two commands require Texinfo 5.0; for now use the older
|
|
@c equivalent @set commands supported in Texinfo 4.11 and later.
|
|
@ignore
|
|
@codequotebacktick on
|
|
@codequoteundirected on
|
|
@end ignore
|
|
@set txicodequoteundirected
|
|
@set txicodequotebacktick
|
|
|
|
@finalout
|
|
|
|
@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
|
|
@defcodeindex kw
|
|
|
|
@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
|
|
@syncodeindex kw cp
|
|
|
|
@copying
|
|
|
|
This manual is for @acronym{GNU} @command{tar} (version
|
|
@value{VERSION}, @value{UPDATED}), which creates and extracts files
|
|
from archives.
|
|
|
|
Copyright @copyright{} 1992, 1994--1997, 1999--2001, 2003--2017,
|
|
2021--2023 Free Software Foundation, Inc.
|
|
|
|
@quotation
|
|
Permission is granted to copy, distribute and/or modify this document
|
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
|
any later version published by the Free Software Foundation; with the
|
|
Invariant Sections being ``GNU General Public License'', with the
|
|
Front-Cover Texts being ``A GNU Manual'', and with the Back-Cover Texts
|
|
as in (a) below. A copy of the license is included in the section
|
|
entitled ``GNU Free Documentation License''.
|
|
|
|
(a) The FSF's Back-Cover Text is: ``You have the freedom to
|
|
copy and modify this GNU manual.''
|
|
@end quotation
|
|
@end copying
|
|
|
|
@dircategory Archiving
|
|
@direntry
|
|
* Tar: (tar). Making tape (or disk) archives.
|
|
@end direntry
|
|
|
|
@dircategory Individual utilities
|
|
@direntry
|
|
* tar: (tar)tar invocation. Invoking @GNUTAR{}.
|
|
@end direntry
|
|
|
|
@shorttitlepage @acronym{GNU} @command{tar}
|
|
|
|
@titlepage
|
|
@title @acronym{GNU} tar: an archiver tool
|
|
@subtitle @value{RENDITION} @value{VERSION}, @value{UPDATED}
|
|
@author John Gilmore, Jay Fenlason et al.
|
|
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
@insertcopying
|
|
@end titlepage
|
|
|
|
@ifnottex
|
|
@node Top
|
|
@top @acronym{GNU} tar: an archiver tool
|
|
|
|
@insertcopying
|
|
|
|
@cindex file archival
|
|
@cindex archiving files
|
|
|
|
The first part of this master menu lists the major nodes in this Info
|
|
document. The rest of the menu lists all the lower level nodes.
|
|
@end ifnottex
|
|
|
|
@c The master menu goes here.
|
|
@c
|
|
@c NOTE: To update it from within Emacs, make sure mastermenu.el is
|
|
@c loaded and run texinfo-master-menu.
|
|
@c To update it from the command line, run
|
|
@c
|
|
@c make master-menu
|
|
|
|
@menu
|
|
* Introduction::
|
|
* Tutorial::
|
|
* tar invocation::
|
|
* operations::
|
|
* Backups::
|
|
* Choosing::
|
|
* Date input formats::
|
|
* Formats::
|
|
* Media::
|
|
* Reliability and security::
|
|
|
|
Appendices
|
|
|
|
* Changes::
|
|
* Recipes:: Frequently used tar recipes
|
|
* Configuring Help Summary::
|
|
* Fixing Snapshot Files::
|
|
* Tar Internals::
|
|
* Genfile::
|
|
* GNU Free Documentation License::
|
|
* Index of Command Line Options::
|
|
* Index::
|
|
|
|
@detailmenu
|
|
--- The Detailed Node Listing ---
|
|
|
|
Introduction
|
|
|
|
* Book Contents:: What this Book Contains
|
|
* Definitions:: Some Definitions
|
|
* What tar Does:: What @command{tar} Does
|
|
* Naming tar Archives:: How @command{tar} Archives are Named
|
|
* Authors:: @GNUTAR{} Authors
|
|
* Reports:: Reporting bugs or suggestions
|
|
|
|
Tutorial Introduction to @command{tar}
|
|
|
|
* assumptions::
|
|
* stylistic conventions::
|
|
* basic tar options:: Basic @command{tar} Operations and Options
|
|
* frequent operations::
|
|
* Two Frequent Options::
|
|
* create:: How to Create Archives
|
|
* list:: How to List Archives
|
|
* extract:: How to Extract Members from an Archive
|
|
* going further::
|
|
|
|
Two Frequently Used Options
|
|
|
|
* file tutorial::
|
|
* verbose tutorial::
|
|
* help tutorial::
|
|
|
|
How to Create Archives
|
|
|
|
* prepare for examples::
|
|
* Creating the archive::
|
|
* create verbose::
|
|
* short create::
|
|
* create dir::
|
|
|
|
How to List Archives
|
|
|
|
* list dir::
|
|
|
|
How to Extract Members from an Archive
|
|
|
|
* extracting archives::
|
|
* extracting files::
|
|
* extract dir::
|
|
* extracting untrusted archives::
|
|
* failing commands::
|
|
|
|
Invoking @GNUTAR{}
|
|
|
|
* Synopsis::
|
|
* using tar options::
|
|
* Styles::
|
|
* All Options:: All @command{tar} Options.
|
|
* help:: Where to Get Help.
|
|
* defaults:: What are the Default Values.
|
|
* verbose:: Checking @command{tar} progress.
|
|
* checkpoints:: Checkpoints.
|
|
* warnings:: Controlling Warning Messages.
|
|
* interactive:: Asking for Confirmation During Operations.
|
|
* external:: Running External Commands.
|
|
|
|
The Three Option Styles
|
|
|
|
* Long Options:: Long Option Style
|
|
* Short Options:: Short Option Style
|
|
* Old Options:: Old Option Style
|
|
* Mixing:: Mixing Option Styles
|
|
|
|
All @command{tar} Options
|
|
|
|
* Operation Summary::
|
|
* Option Summary::
|
|
* Short Option Summary::
|
|
* Position-Sensitive Options::
|
|
|
|
Controlling Warning Messages
|
|
|
|
* General Warnings:: Keywords applicable for @command{tar --create}.
|
|
* Archive Creation Warnings:: Keywords applicable for @command{tar --create}.
|
|
* Archive Extraction Warnings:: Keywords applicable for @command{tar --extract}.
|
|
* Incremental Extraction Warnings:: Keywords controlling incremental extraction.
|
|
* Warning Classes:: Convenience keywords control multiple warnings.
|
|
* Warning Defaults:: Default settings for warnings.
|
|
|
|
@GNUTAR{} Operations
|
|
|
|
* Basic tar::
|
|
* Advanced tar::
|
|
* create options::
|
|
* extract options::
|
|
* backup::
|
|
* looking ahead::
|
|
|
|
Advanced @GNUTAR{} Operations
|
|
|
|
* Operations::
|
|
* append::
|
|
* update::
|
|
* concatenate::
|
|
* delete::
|
|
* compare::
|
|
|
|
How to Add Files to Existing Archives: @option{--append}
|
|
|
|
* appending files:: Appending Files to an Archive
|
|
* multiple::
|
|
|
|
Updating an Archive
|
|
|
|
* how to update::
|
|
|
|
Options Used by @option{--create}
|
|
|
|
* override:: Overriding File Metadata.
|
|
* Extended File Attributes::
|
|
* Ignore Failed Read::
|
|
|
|
Options Used by @option{--extract}
|
|
|
|
* Reading:: Options to Help Read Archives
|
|
* Writing:: Changing How @command{tar} Writes Files
|
|
* Scarce:: Coping with Scarce Resources
|
|
|
|
Options to Help Read Archives
|
|
|
|
* read full records::
|
|
* Ignore Zeros::
|
|
|
|
Changing How @command{tar} Writes Files
|
|
|
|
* Dealing with Old Files::
|
|
* Overwrite Old Files::
|
|
* Keep Old Files::
|
|
* Keep Newer Files::
|
|
* Unlink First::
|
|
* Recursive Unlink::
|
|
* Data Modification Times::
|
|
* Setting Access Permissions::
|
|
* Directory Modification Times and Permissions::
|
|
* Writing to Standard Output::
|
|
* Writing to an External Program::
|
|
* remove files::
|
|
|
|
Coping with Scarce Resources
|
|
|
|
* Starting File::
|
|
* Same Order::
|
|
|
|
Performing Backups and Restoring Files
|
|
|
|
* Full Dumps:: Using @command{tar} to Perform Full Dumps
|
|
* Incremental Dumps:: Using @command{tar} to Perform Incremental Dumps
|
|
* Backup Levels:: Levels of Backups
|
|
* Backup Parameters:: Setting Parameters for Backups and Restoration
|
|
* Scripted Backups:: Using the Backup Scripts
|
|
* Scripted Restoration:: Using the Restore Script
|
|
|
|
Setting Parameters for Backups and Restoration
|
|
|
|
* General-Purpose Variables::
|
|
* Magnetic Tape Control::
|
|
* User Hooks::
|
|
* backup-specs example:: An Example Text of @file{Backup-specs}
|
|
|
|
Choosing Files and Names for @command{tar}
|
|
|
|
* file:: Choosing the Archive's Name
|
|
* Selecting Archive Members::
|
|
* files:: Reading Names from a File
|
|
* exclude:: Excluding Some Files
|
|
* wildcards:: Wildcards Patterns and Matching
|
|
* quoting styles:: Ways of Quoting Special Characters in Names
|
|
* transform:: Modifying File and Member Names
|
|
* after:: Operating Only on New Files
|
|
* recurse:: Descending into Directories
|
|
* one:: Crossing File System Boundaries
|
|
|
|
Reading Names from a File
|
|
|
|
* nul::
|
|
|
|
Excluding Some Files
|
|
|
|
* problems with exclude::
|
|
|
|
Wildcards Patterns and Matching
|
|
|
|
* controlling pattern-matching::
|
|
|
|
Crossing File System Boundaries
|
|
|
|
* directory:: Changing Directory
|
|
* absolute:: Absolute File Names
|
|
|
|
Date input formats
|
|
|
|
* General date syntax:: Common rules
|
|
* Calendar date items:: 21 Jul 2020
|
|
* Time of day items:: 9:20pm
|
|
* Time zone items:: UTC, -0700, +0900, @dots{}
|
|
* Combined date and time of day items:: 2020-07-21T20:02:00,000000-0400
|
|
* Day of week items:: Monday and others
|
|
* Relative items in date strings:: next tuesday, 2 years ago
|
|
* Pure numbers in date strings:: 20200721, 1440
|
|
* Seconds since the Epoch:: @@1595289600
|
|
* Specifying time zone rules:: TZ="America/New_York", TZ="UTC0"
|
|
* Authors of parse_datetime:: Bellovin, Eggert, Salz, Berets, et al.
|
|
|
|
Controlling the Archive Format
|
|
|
|
* 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}
|
|
|
|
Using Less Space through Compression
|
|
|
|
* gzip:: Creating and Reading Compressed Archives
|
|
* sparse:: Archiving Sparse Files
|
|
|
|
Creating and Reading Compressed Archives
|
|
|
|
* lbzip2:: Using lbzip2 with @GNUTAR{}.
|
|
|
|
Making @command{tar} Archives More Portable
|
|
|
|
* Portable Names:: Portable Names
|
|
* dereference:: Symbolic Links
|
|
* hard links:: Hard 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
|
|
|
|
@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
|
|
|
|
Tapes and Other Archive Media
|
|
|
|
* Device:: Device selection and switching
|
|
* Remote Tape Server::
|
|
* Common Problems and Solutions::
|
|
* Blocking:: Blocking
|
|
* Many:: Many archives on one tape
|
|
* Using Multiple Tapes:: Using Multiple Tapes
|
|
* label:: Including a Label in the Archive
|
|
* verify::
|
|
* Write Protection::
|
|
|
|
Blocking
|
|
|
|
* Format Variations:: Format Variations
|
|
* Blocking Factor:: The Blocking Factor of an Archive
|
|
|
|
Many Archives on One Tape
|
|
|
|
* Tape Positioning:: Tape Positions and Tape Marks
|
|
* mt:: The @command{mt} Utility
|
|
|
|
Using Multiple Tapes
|
|
|
|
* Multi-Volume Archives:: Archives Longer than One Tape or Disk
|
|
* Tape Files:: Tape Files
|
|
* Tarcat:: Concatenate Volumes into a Single Archive
|
|
|
|
|
|
Reliability and Security
|
|
|
|
* Reliability::
|
|
* Security::
|
|
|
|
Reliability
|
|
|
|
* Permissions problems::
|
|
* Data corruption and repair::
|
|
* Race conditions::
|
|
|
|
Security
|
|
|
|
* Privacy::
|
|
* Integrity::
|
|
* Live untrusted data::
|
|
* Security rules of thumb::
|
|
|
|
Recipes
|
|
|
|
* copy directory hierarchy::
|
|
* intermediate directories::
|
|
|
|
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.
|
|
|
|
@end detailmenu
|
|
@end menu
|
|
|
|
@node Introduction
|
|
@chapter Introduction
|
|
|
|
@GNUTAR{} creates
|
|
and manipulates @dfn{archives} which are actually collections of
|
|
many other files; the program provides users with an organized and
|
|
systematic method for controlling a large amount of data.
|
|
The name ``tar'' originally came from the phrase ``Tape ARchive'', but
|
|
archives need not (and these days, typically do not) reside on tapes.
|
|
|
|
@menu
|
|
* Book Contents:: What this Book Contains
|
|
* Definitions:: Some Definitions
|
|
* What tar Does:: What @command{tar} Does
|
|
* Naming tar Archives:: How @command{tar} Archives are Named
|
|
* Authors:: @GNUTAR{} Authors
|
|
* Reports:: Reporting bugs or suggestions
|
|
@end menu
|
|
|
|
@node Book Contents
|
|
@section What this Book Contains
|
|
|
|
The first part of this chapter introduces you to various terms that will
|
|
recur throughout the book. It also tells you who has worked on @GNUTAR{}
|
|
and its documentation, and where you should send bug reports
|
|
or comments.
|
|
|
|
The second chapter is a tutorial (@pxref{Tutorial}) which provides a
|
|
gentle introduction for people who are new to using @command{tar}. It is
|
|
meant to be self-contained, not requiring any reading from subsequent
|
|
chapters to make sense. It moves from topic to topic in a logical,
|
|
progressive order, building on information already explained.
|
|
|
|
Although the tutorial is paced and structured to allow beginners to
|
|
learn how to use @command{tar}, it is not intended solely for beginners.
|
|
The tutorial explains how to use the three most frequently used
|
|
operations (@samp{create}, @samp{list}, and @samp{extract}) as well as
|
|
two frequently used options (@samp{file} and @samp{verbose}). The other
|
|
chapters do not refer to the tutorial frequently; however, if a section
|
|
discusses something which is a complex variant of a basic concept, there
|
|
may be a cross-reference to that basic concept. (The entire book,
|
|
including the tutorial, assumes that the reader understands some basic
|
|
concepts of using a Unix-type operating system; @pxref{Tutorial}.)
|
|
|
|
The third chapter presents the remaining five operations, and
|
|
information about using @command{tar} options and option syntax.
|
|
|
|
The other chapters are meant to be used as a reference. Each chapter
|
|
presents everything that needs to be said about a specific topic.
|
|
|
|
One of the chapters (@pxref{Date input formats}) exists in its
|
|
entirety in other @acronym{GNU} manuals, and is mostly self-contained.
|
|
In addition, one section of this manual (@pxref{Standard}) contains a
|
|
big quote which is taken directly from @command{tar} sources.
|
|
|
|
In general, we give both long and short (abbreviated) option names
|
|
at least once in each section where the relevant option is covered, so
|
|
that novice readers will become familiar with both styles. (A few
|
|
options have no short versions, and the relevant sections will
|
|
indicate this.)
|
|
|
|
@node Definitions
|
|
@section Some Definitions
|
|
|
|
@cindex archive
|
|
@cindex tar archive
|
|
The @command{tar} program is used to create and manipulate @command{tar}
|
|
archives. An @dfn{archive} is a single file which contains the contents
|
|
of many files, while still identifying the names of the files, their
|
|
owner(s), and so forth. (In addition, archives record access
|
|
permissions, user and group, size in bytes, and data modification time.
|
|
Some archives also record the file names in each archived directory, as
|
|
well as other file and directory information.) You can use @command{tar}
|
|
to @dfn{create} a new archive in a specified directory.
|
|
|
|
@cindex member
|
|
@cindex archive member
|
|
@cindex file name
|
|
@cindex member name
|
|
The files inside an archive are called @dfn{members}. Within this
|
|
manual, we use the term @dfn{file} to refer only to files accessible in
|
|
the normal ways (by @command{ls}, @command{cat}, and so forth), and the term
|
|
@dfn{member} to refer only to the members of an archive. Similarly, a
|
|
@dfn{file name} is the name of a file, as it resides in the file system,
|
|
and a @dfn{member name} is the name of an archive member within the
|
|
archive.
|
|
|
|
@cindex extraction
|
|
@cindex unpacking
|
|
The term @dfn{extraction} refers to the process of copying an archive
|
|
member (or multiple members) into a file in the file system. Extracting
|
|
all the members of an archive is often called @dfn{extracting the
|
|
archive}. The term @dfn{unpack} can also be used to refer to the
|
|
extraction of many or all the members of an archive. Extracting an
|
|
archive does not destroy the archive's structure, just as creating an
|
|
archive does not destroy the copies of the files that exist outside of
|
|
the archive. You may also @dfn{list} the members in a given archive
|
|
(this is often thought of as ``printing'' them to the standard output,
|
|
or the command line), or @dfn{append} members to a pre-existing archive.
|
|
All of these operations can be performed using @command{tar}.
|
|
|
|
@node What tar Does
|
|
@section What @command{tar} Does
|
|
|
|
@cindex tar
|
|
The @command{tar} program provides the ability to create @command{tar}
|
|
archives, as well as various other kinds of manipulation. For example,
|
|
you can use @command{tar} on previously created archives to extract files,
|
|
to store additional files, or to update or list files which were already
|
|
stored.
|
|
|
|
Initially, @command{tar} archives were used to store files conveniently on
|
|
magnetic tape. The name @command{tar} comes from this use; it stands for
|
|
@code{t}ape @code{ar}chiver. Despite the utility's name, @command{tar} can
|
|
direct its output to available devices, files, or other programs (using
|
|
pipes). @command{tar} may even access remote devices or files (as archives).
|
|
|
|
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.}
|
|
@table @asis
|
|
@item Storage
|
|
Often, @command{tar} archives are used to store related files for
|
|
convenient file transfer over a network. For example, the
|
|
@acronym{GNU} Project distributes its software bundled into
|
|
@command{tar} archives, so that all the files relating to a particular
|
|
program (or set of related programs) can be transferred as a single
|
|
unit.
|
|
|
|
A magnetic tape can store several files in sequence. However, the tape
|
|
has no names for these files; it only knows their relative position on
|
|
the tape. One way to store several files on one tape and retain their
|
|
names is by creating a @command{tar} archive. Even when the basic transfer
|
|
mechanism can keep track of names, as FTP can, the nuisance of handling
|
|
multiple files, directories, and multiple links makes @command{tar}
|
|
archives useful.
|
|
|
|
Archive files are also used for long-term storage. You can think of
|
|
this as transportation from the present into the future. (It is a
|
|
science-fiction idiom that you can move through time as well as in
|
|
space; the idea here is that @command{tar} can be used to move archives in
|
|
all dimensions, even time!)
|
|
|
|
@item Backup
|
|
Because the archive created by @command{tar} is capable of preserving
|
|
file information and directory structure, @command{tar} is commonly
|
|
used for performing full and incremental backups of disks. A backup
|
|
puts a collection of files (possibly pertaining to many users and
|
|
projects) together on a disk or a tape. This guards against
|
|
accidental destruction of the information in those files.
|
|
@GNUTAR{} has special features that allow it to be
|
|
used to make incremental and full dumps of all the files in a
|
|
file system.
|
|
|
|
@item Transportation
|
|
You can create an archive on one system, transfer it to another system,
|
|
and extract the contents there. This allows you to transport a group of
|
|
files from one system to another.
|
|
@end table
|
|
|
|
@node Naming tar Archives
|
|
@section How @command{tar} Archives are Named
|
|
|
|
Conventionally, @command{tar} archives are given names ending with
|
|
@samp{.tar}. This is not necessary for @command{tar} to operate properly,
|
|
but this manual follows that convention in order to accustom readers to
|
|
it and to make examples more clear.
|
|
|
|
@cindex tar file
|
|
@cindex entry
|
|
@cindex tar entry
|
|
Often, people refer to @command{tar} archives as ``@command{tar} files,'' and
|
|
archive members as ``files'' or ``entries''. For people familiar with
|
|
the operation of @command{tar}, this causes no difficulty. However, in
|
|
this manual, we consistently refer to ``archives'' and ``archive
|
|
members'' to make learning to use @command{tar} easier for novice users.
|
|
|
|
@node Authors
|
|
@section @GNUTAR{} Authors
|
|
|
|
@GNUTAR{} was originally written by John Gilmore,
|
|
and modified by many people. The @acronym{GNU} enhancements were
|
|
written by Jay Fenlason, then Joy Kendall, and the whole package has
|
|
been further maintained by Thomas Bushnell, n/BSG, Fran@,{c}ois
|
|
Pinard, Paul Eggert, and finally Sergey Poznyakoff with the help of
|
|
numerous and kind users.
|
|
|
|
We wish to stress that @command{tar} is a collective work, and owes much to
|
|
all those people who reported problems, offered solutions and other
|
|
insights, or shared their thoughts and suggestions. An impressive, yet
|
|
partial list of those contributors can be found in the @file{THANKS}
|
|
file from the @GNUTAR{} distribution.
|
|
|
|
@FIXME{i want all of these names mentioned, Absolutely. BUT, i'm not
|
|
sure i want to spell out the history in this detail, at least not for
|
|
the printed book. i'm just not sure it needs to be said this way.
|
|
i'll think about it.}
|
|
|
|
@FIXME{History is more important, and surely more interesting, than
|
|
actual names. Quoting names without history would be meaningless. FP}
|
|
|
|
Jay Fenlason put together a draft of a @GNUTAR{}
|
|
manual, borrowing notes from the original man page from John Gilmore.
|
|
This was withdrawn in version 1.11. Thomas Bushnell, n/BSG and Amy
|
|
Gorin worked on a tutorial and manual for @GNUTAR{}.
|
|
Fran@,{c}ois Pinard put version 1.11.8 of the manual together by
|
|
taking information from all these sources and merging them. Melissa
|
|
Weisshaus finally edited and redesigned the book to create version
|
|
1.12. The book for versions from 1.14 up to @value{VERSION} were edited
|
|
by the current maintainer, Sergey Poznyakoff.
|
|
|
|
For version 1.12, Daniel Hagerty contributed a great deal of technical
|
|
consulting. In particular, he is the primary author of @ref{Backups}.
|
|
|
|
In July, 2003 @GNUTAR{} was put on CVS at savannah.gnu.org
|
|
(see @url{http://savannah.gnu.org/projects/tar}), and
|
|
active development and maintenance work has started
|
|
again. Currently @GNUTAR{} is being maintained by Paul Eggert, Sergey
|
|
Poznyakoff and Jeff Bailey.
|
|
|
|
Support for @acronym{POSIX} archives was added by Sergey Poznyakoff.
|
|
|
|
@node Reports
|
|
@section Reporting bugs or suggestions
|
|
|
|
@cindex bug reports
|
|
@cindex reporting bugs
|
|
If you find problems or have suggestions about this program or manual,
|
|
please report them to @file{bug-tar@@gnu.org}.
|
|
|
|
When reporting a bug, please be sure to include as much detail as
|
|
possible, in order to reproduce it.
|
|
@FIXME{Be more specific, I'd like to make this node as detailed as
|
|
'Bug reporting' node in Emacs manual.}
|
|
|
|
@node Tutorial
|
|
@chapter Tutorial Introduction to @command{tar}
|
|
|
|
This chapter guides you through some basic examples of three @command{tar}
|
|
operations: @option{--create}, @option{--list}, and @option{--extract}. If
|
|
you already know how to use some other version of @command{tar}, then you
|
|
may not need to read this chapter. This chapter omits most complicated
|
|
details about how @command{tar} works.
|
|
|
|
@menu
|
|
* assumptions::
|
|
* stylistic conventions::
|
|
* basic tar options:: Basic @command{tar} Operations and Options
|
|
* frequent operations::
|
|
* Two Frequent Options::
|
|
* create:: How to Create Archives
|
|
* list:: How to List Archives
|
|
* extract:: How to Extract Members from an Archive
|
|
* going further::
|
|
@end menu
|
|
|
|
@node assumptions
|
|
@section Assumptions this Tutorial Makes
|
|
|
|
This chapter is paced to allow beginners to learn about @command{tar}
|
|
slowly. At the same time, we will try to cover all the basic aspects of
|
|
these three operations. In order to accomplish both of these tasks, we
|
|
have made certain assumptions about your knowledge before reading this
|
|
manual, and the hardware you will be using:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Before you start to work through this tutorial, you should understand
|
|
what the terms ``archive'' and ``archive member'' mean
|
|
(@pxref{Definitions}). In addition, you should understand something
|
|
about how Unix-type operating systems work, and you should know how to
|
|
use some basic utilities. For example, you should know how to create,
|
|
list, copy, rename, edit, and delete files and directories; how to
|
|
change between directories; and how to figure out where you are in the
|
|
file system. You should have some basic understanding of directory
|
|
structure and how files are named according to which directory they are
|
|
in. You should understand concepts such as standard output and standard
|
|
input, what various definitions of the term @samp{argument} mean, and the
|
|
differences between relative and absolute file names.
|
|
@FIXME{and what else?}
|
|
|
|
@item
|
|
This manual assumes that you are working from your own home directory
|
|
(unless we state otherwise). In this tutorial, you will create a
|
|
directory to practice @command{tar} commands in. When we show file names,
|
|
we will assume that those names are relative to your home directory.
|
|
For example, my home directory is @file{/home/fsf/melissa}. All of
|
|
my examples are in a subdirectory of the directory named by that file
|
|
name; the subdirectory is called @file{practice}.
|
|
|
|
@item
|
|
In general, we show examples of archives which exist on (or can be
|
|
written to, or worked with from) a directory on a hard disk. In most
|
|
cases, you could write those archives to, or work with them on any other
|
|
device, such as a tape drive. However, some of the later examples in
|
|
the tutorial and next chapter will not work on tape drives.
|
|
Additionally, working with tapes is much more complicated than working
|
|
with hard disks. For these reasons, the tutorial does not cover working
|
|
with tape drives. @xref{Media}, for complete information on using
|
|
@command{tar} archives with tape drives.
|
|
|
|
@FIXME{this is a cop out. need to add some simple tape drive info.}
|
|
@end itemize
|
|
|
|
@node stylistic conventions
|
|
@section Stylistic Conventions
|
|
|
|
In the examples, @samp{$} represents a typical shell prompt. It
|
|
precedes lines you should type; to make this more clear, those lines are
|
|
shown in @kbd{this font}, as opposed to lines which represent the
|
|
computer's response; those lines are shown in @code{this font}, or
|
|
sometimes @samp{like this}.
|
|
|
|
@c When we have lines which are too long to be
|
|
@c displayed in any other way, we will show them like this:
|
|
|
|
@node basic tar options
|
|
@section Basic @command{tar} Operations and Options
|
|
|
|
@command{tar} can take a wide variety of arguments which specify and define
|
|
the actions it will have on the particular set of files or the archive.
|
|
The main types of arguments to @command{tar} fall into one of two classes:
|
|
operations, and options.
|
|
|
|
Some arguments fall into a class called @dfn{operations}; exactly one of
|
|
these is both allowed and required for any instance of using @command{tar};
|
|
you may @emph{not} specify more than one. People sometimes speak of
|
|
@dfn{operating modes}. You are in a particular operating mode when you
|
|
have specified the operation which specifies it; there are eight
|
|
operations in total, and thus there are eight operating modes.
|
|
|
|
The other arguments fall into the class known as @dfn{options}. You are
|
|
not required to specify any options, and you are allowed to specify more
|
|
than one at a time (depending on the way you are using @command{tar} at
|
|
that time). Some options are used so frequently, and are so useful for
|
|
helping you type commands more carefully that they are effectively
|
|
``required''. We will discuss them in this chapter.
|
|
|
|
You can write most of the @command{tar} operations and options in any
|
|
of three forms: long (mnemonic) form, short form, and old style. Some
|
|
of the operations and options have no short or ``old'' forms; however,
|
|
the operations and options which we will cover in this tutorial have
|
|
corresponding abbreviations. We will indicate those abbreviations
|
|
appropriately to get you used to seeing them. Note, that the ``old
|
|
style'' option forms 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{Long Options}, and
|
|
@pxref{Short Options}).
|
|
|
|
In the examples and in the text of this tutorial, we usually use the
|
|
long forms of operations and options; but the ``short'' forms produce
|
|
the same result and can make typing long @command{tar} commands easier.
|
|
For example, instead of typing
|
|
|
|
@smallexample
|
|
@kbd{tar --create --verbose --file=afiles.tar apple angst aspic}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
you can type
|
|
@smallexample
|
|
@kbd{tar -c -v -f afiles.tar apple angst aspic}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
or even
|
|
@smallexample
|
|
@kbd{tar -cvf afiles.tar apple angst aspic}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
For more information on option syntax, see @ref{Advanced tar}. In
|
|
discussions in the text, when we name an option by its long form, we
|
|
also give the corresponding short option in parentheses.
|
|
|
|
The term, ``option'', can be confusing at times, since ``operations''
|
|
are often lumped in with the actual, @emph{optional} ``options'' in certain
|
|
general class statements. For example, we just talked about ``short and
|
|
long forms of options and operations''. However, experienced @command{tar}
|
|
users often refer to these by shorthand terms such as, ``short and long
|
|
options''. This term assumes that the ``operations'' are included, also.
|
|
Context will help you determine which definition of ``options'' to use.
|
|
|
|
Similarly, the term ``command'' can be confusing, as it is often used in
|
|
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,
|
|
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.
|
|
Again, use context to figure out which of the meanings the speaker
|
|
intends.
|
|
|
|
@node frequent operations
|
|
@section The Three Most Frequently Used Operations
|
|
|
|
Here are the three most frequently used operations (both short and long
|
|
forms), as well as a brief description of their meanings. The rest of
|
|
this chapter will cover how to use these operations in detail. We will
|
|
present the rest of the operations in the next chapter.
|
|
|
|
@table @option
|
|
@item --create
|
|
@itemx -c
|
|
Create a new @command{tar} archive.
|
|
@item --list
|
|
@itemx -t
|
|
List the contents of an archive.
|
|
@item --extract
|
|
@itemx -x
|
|
Extract one or more members from an archive.
|
|
@end table
|
|
|
|
@node Two Frequent Options
|
|
@section Two Frequently Used Options
|
|
|
|
To understand how to run @command{tar} in the three operating modes listed
|
|
previously, you also need to understand how to use two of the options to
|
|
@command{tar}: @option{--file} (which takes an archive file as an argument)
|
|
and @option{--verbose}. (You are usually not @emph{required} to specify
|
|
either of these options when you run @command{tar}, but they can be very
|
|
useful in making things more clear and helping you avoid errors.)
|
|
|
|
@menu
|
|
* file tutorial::
|
|
* verbose tutorial::
|
|
* help tutorial::
|
|
@end menu
|
|
|
|
@node file tutorial
|
|
@unnumberedsubsec The @option{--file} Option
|
|
|
|
@table @option
|
|
@xopindex{file, tutorial}
|
|
@item --file=@var{archive-name}
|
|
@itemx -f @var{archive-name}
|
|
Specify the name of an archive file.
|
|
@end table
|
|
|
|
You can specify an argument for the @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) option whenever you
|
|
use @command{tar}; this option determines the name of the archive file
|
|
that @command{tar} will work on.
|
|
|
|
@vrindex TAPE
|
|
If you don't specify this argument, then @command{tar} will examine
|
|
the environment variable @env{TAPE}. If it is set, its value will be
|
|
used as the archive name. Otherwise, @command{tar} will use the
|
|
default archive, determined at compile time. Usually it is
|
|
standard output or some physical tape drive attached to your machine
|
|
(you can verify what the default is by running @kbd{tar
|
|
--show-defaults}, @pxref{defaults}). If there is no tape drive
|
|
attached, or the default is not meaningful, then @command{tar} will
|
|
print an error message. The error message might look roughly like one
|
|
of the following:
|
|
|
|
@smallexample
|
|
tar: can't open /dev/rmt8 : No such device or address
|
|
tar: can't open /dev/rsmt0 : I/O error
|
|
@end smallexample
|
|
|
|
@noindent
|
|
To avoid confusion, we recommend that you always specify an archive file
|
|
name by using @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) when writing your @command{tar} commands.
|
|
For more information on using the @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) option, see
|
|
@ref{file}.
|
|
|
|
@node verbose tutorial
|
|
@unnumberedsubsec The @option{--verbose} Option
|
|
|
|
@table @option
|
|
@xopindex{verbose, introduced}
|
|
@item --verbose
|
|
@itemx -v
|
|
Show the files being worked on as @command{tar} is running.
|
|
@end table
|
|
|
|
@option{--verbose} (@option{-v}) shows details about the results of running
|
|
@command{tar}. This can be especially useful when the results might not be
|
|
obvious. For example, if you want to see the progress of @command{tar} as
|
|
it writes files into the archive, you can use the @option{--verbose}
|
|
option. In the beginning, you may find it useful to use
|
|
@option{--verbose} at all times; when you are more accustomed to
|
|
@command{tar}, you will likely want to use it at certain times but not at
|
|
others. We will use @option{--verbose} at times to help make something
|
|
clear, and we will give many examples both using and not using
|
|
@option{--verbose} to show the differences.
|
|
|
|
Each instance of @option{--verbose} on the command line increases the
|
|
verbosity level by one, so if you need more details on the output,
|
|
specify it twice.
|
|
|
|
When reading archives (@option{--list}, @option{--extract},
|
|
@option{--diff}), @command{tar} by default prints only the names of
|
|
the members being extracted. Using @option{--verbose} will show a full,
|
|
@command{ls} style member listing.
|
|
|
|
In contrast, when writing archives (@option{--create}, @option{--append},
|
|
@option{--update}), @command{tar} does not print file names by
|
|
default. So, a single @option{--verbose} option shows the file names
|
|
being added to the archive, while two @option{--verbose} options
|
|
enable the full listing.
|
|
|
|
For example, to create an archive in verbose mode:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cvf afiles.tar apple angst aspic}
|
|
apple
|
|
angst
|
|
aspic
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Creating the same archive with the verbosity level 2 could give:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cvvf afiles.tar apple angst aspic}
|
|
-rw-r--r-- gray/staff 62373 2006-06-09 12:06 apple
|
|
-rw-r--r-- gray/staff 11481 2006-06-09 12:06 angst
|
|
-rw-r--r-- gray/staff 23152 2006-06-09 12:06 aspic
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This works equally well using short or long forms of options. Using
|
|
long forms, you would simply write out the mnemonic form of the option
|
|
twice, like this:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --verbose --verbose @dots{}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Note that you must double the hyphens properly each time.
|
|
|
|
Later in the tutorial, we will give examples using @w{@option{--verbose
|
|
--verbose}}.
|
|
|
|
The @option{--verbose} option also enables several @dfn{warning
|
|
messages}, that tar does not issue otherwise, such as the
|
|
warning about record size being used (@pxref{Blocking Factor}), selecting
|
|
the decompress program and the like. If these are of no interest to
|
|
you, you can suppress them using the @option{--warning} option
|
|
@emph{after} @option{--verbose}, e.g.:
|
|
|
|
@example
|
|
$ @kbd{tar -c -v --warning=no-verbose -f afiles.tar apple angst aspic}
|
|
@end example
|
|
|
|
@xref{Warning Classes, verbose}, for details.
|
|
|
|
@anchor{verbose member listing}
|
|
The full output consists of six fields:
|
|
|
|
@itemize @bullet
|
|
@item File type and permissions in symbolic form.
|
|
These are displayed in the same format as the first column of
|
|
@command{ls -l} output (@pxref{What information is listed,
|
|
format=verbose, Verbose listing, fileutils, GNU file utilities}).
|
|
|
|
@item Owner name and group separated by a slash character.
|
|
If these data are not available (for example, when listing a @samp{v7} format
|
|
archive), numeric @acronym{ID} values are printed instead.
|
|
|
|
@item Size of the file, in bytes.
|
|
|
|
@item File modification date in ISO 8601 format.
|
|
|
|
@item File modification time.
|
|
|
|
@item File name.
|
|
If the name contains any special characters (white space, newlines,
|
|
etc.)@: these are displayed in an unambiguous form using so called
|
|
@dfn{quoting style}. For the detailed discussion of available styles
|
|
and on how to use them, see @ref{quoting styles}.
|
|
|
|
Depending on the file type, the name can be followed by some
|
|
additional information, described in the following table:
|
|
|
|
@table @samp
|
|
@item -> @var{link-name}
|
|
The file or archive member is a @dfn{symbolic link} and
|
|
@var{link-name} is the name of file it links to.
|
|
|
|
@item link to @var{link-name}
|
|
The file or archive member is a @dfn{hard link} and @var{link-name} is
|
|
the name of file it links to.
|
|
|
|
@item --Long Link--
|
|
The archive member is an old GNU format long link. You will normally
|
|
not encounter this.
|
|
|
|
@item --Long Name--
|
|
The archive member is an old GNU format long name. You will normally
|
|
not encounter this.
|
|
|
|
@item --Volume Header--
|
|
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 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.
|
|
|
|
@item unknown file type @var{c}
|
|
An archive member of unknown type. @var{c} is the type character from
|
|
the archive header. If you encounter such a message, it means that
|
|
either your archive contains proprietary member types @GNUTAR{} is not
|
|
able to handle, or the archive is corrupted.
|
|
@end table
|
|
|
|
@end itemize
|
|
|
|
For example, here is an archive listing containing most of the special
|
|
suffixes explained above:
|
|
|
|
@smallexample
|
|
@group
|
|
V--------- 0/0 1536 2006-06-09 13:07 MyVolume--Volume Header--
|
|
-rw-r--r-- gray/staff 456783 2006-06-09 12:06 aspic--Continued at byte 32456--
|
|
-rw-r--r-- gray/staff 62373 2006-06-09 12:06 apple
|
|
lrwxrwxrwx gray/staff 0 2006-06-09 13:01 angst -> apple
|
|
-rw-r--r-- gray/staff 35793 2006-06-09 12:06 blues
|
|
hrw-r--r-- gray/staff 0 2006-06-09 12:06 music link to blues
|
|
@end group
|
|
@end smallexample
|
|
|
|
@node help tutorial
|
|
@unnumberedsubsec Getting Help: Using the @option{--help} Option
|
|
|
|
@table @option
|
|
@opindex help
|
|
@item --help
|
|
|
|
The @option{--help} option to @command{tar} prints out a very brief list of
|
|
all operations and option available for the current version of
|
|
@command{tar} available on your system.
|
|
@end table
|
|
|
|
@node create
|
|
@section How to Create Archives
|
|
|
|
@cindex Creation of the archive
|
|
@cindex Archive, creation of
|
|
One of the basic operations of @command{tar} is @option{--create} (@option{-c}), which
|
|
you use to create a @command{tar} archive. We will explain
|
|
@option{--create} first because, in order to learn about the other
|
|
operations, you will find it useful to have an archive available to
|
|
practice on.
|
|
|
|
To make this easier, in this section you will first create a directory
|
|
containing three files. Then, we will show you how to create an
|
|
@emph{archive} (inside the new directory). Both the directory, and
|
|
the archive are specifically for you to practice on. The rest of this
|
|
chapter and the next chapter will show many examples using this
|
|
directory and the files you will create: some of those files may be
|
|
other directories and other archives.
|
|
|
|
The three files you will archive in this example are called
|
|
@file{blues}, @file{folk}, and @file{jazz}. The archive is called
|
|
@file{collection.tar}.
|
|
|
|
This section will proceed slowly, detailing how to use @option{--create}
|
|
in @code{verbose} mode, and showing examples using both short and long
|
|
forms. In the rest of the tutorial, and in the examples in the next
|
|
chapter, we will proceed at a slightly quicker pace. This section
|
|
moves more slowly to allow beginning users to understand how
|
|
@command{tar} works.
|
|
|
|
@menu
|
|
* prepare for examples::
|
|
* Creating the archive::
|
|
* create verbose::
|
|
* short create::
|
|
* create dir::
|
|
@end menu
|
|
|
|
@node prepare for examples
|
|
@subsection Preparing a Practice Directory for Examples
|
|
|
|
To follow along with this and future examples, create a new directory
|
|
called @file{practice} containing files called @file{blues}, @file{folk}
|
|
and @file{jazz}. The files can contain any information you like:
|
|
ideally, they should contain information which relates to their names,
|
|
and be of different lengths. Our examples assume that @file{practice}
|
|
is a subdirectory of your home directory.
|
|
|
|
Now @command{cd} to the directory named @file{practice}; @file{practice}
|
|
is now your @dfn{working directory}. (@emph{Please note}: Although
|
|
the full file name of this directory is
|
|
@file{/@var{homedir}/practice}, in our examples we will refer to
|
|
this directory as @file{practice}; the @var{homedir} is presumed.)
|
|
|
|
In general, you should check that the files to be archived exist where
|
|
you think they do (in the working directory) by running @command{ls}.
|
|
Because you just created the directory and the files and have changed to
|
|
that directory, you probably don't need to do that this time.
|
|
|
|
It is very important to make sure there isn't already a file in the
|
|
working directory with the archive name you intend to use (in this case,
|
|
@samp{collection.tar}), or that you don't care about its contents.
|
|
Whenever you use @samp{create}, @command{tar} will erase the current
|
|
contents of the file named by @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) if it exists. @command{tar}
|
|
will not tell you if you are about to overwrite an archive unless you
|
|
specify an option which does this (@pxref{backup}, for the
|
|
information on how to do so). To add files to an existing archive,
|
|
you need to use a different option, such as @option{--append} (@option{-r}); see
|
|
@ref{append} for information on how to do this.
|
|
|
|
@node Creating the archive
|
|
@subsection Creating the Archive
|
|
|
|
@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:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --file=collection.tar blues folk jazz}
|
|
@end smallexample
|
|
|
|
The order of the arguments is not very important, @emph{when using long
|
|
option forms}, however you should always remember to use option as the
|
|
first argument to tar. For example, the following is wrong:
|
|
|
|
@smallexample
|
|
$ @kbd{tar blues -c folk -f collection.tar jazz}
|
|
tar: -c: Invalid blocking factor
|
|
Try 'tar --help' or 'tar --usage' for more information.
|
|
@end smallexample
|
|
|
|
The error message is produced because @command{tar} always treats its
|
|
first argument as an option (or cluster of options), even if it does
|
|
not start with dash. This is @dfn{traditional} or @dfn{old option}
|
|
style, called so because all implementations of @command{tar} have
|
|
used it since the very inception of the tar archiver in 1970s. This
|
|
option style will be explained later (@pxref{Old Options}), for now
|
|
just remember to always place option as the first argument.
|
|
|
|
That being said, you could issue the following command:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create folk blues --file=collection.tar jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
However, you can see that this order is harder to understand; this is
|
|
why we will list the arguments in the order that makes the commands
|
|
easiest to understand (and we encourage you to do the same when you use
|
|
@command{tar}, to avoid errors).
|
|
|
|
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.
|
|
|
|
The order of the options becomes more important when you begin to use
|
|
short forms. With short forms, if you type commands in the wrong order
|
|
(even if you type them correctly in all other ways), you may end up with
|
|
results you don't expect. For this reason, it is a good idea to get
|
|
into the habit of typing options in the order that makes inherent sense.
|
|
@xref{short create}, for more information on this.
|
|
|
|
In this example, you type the command as shown above: @option{--create}
|
|
is the operation which creates the new archive
|
|
(@file{collection.tar}), and @option{--file} is the option which lets
|
|
you give it the name you chose. The files, @file{blues}, @file{folk},
|
|
and @file{jazz}, are now members of the archive, @file{collection.tar}
|
|
(they are @dfn{file name arguments} to the @option{--create} operation.
|
|
@xref{Choosing}, for the detailed discussion on these.) Now that they are
|
|
in the archive, they are called @emph{archive members}, not files.
|
|
(@pxref{Definitions,members}).
|
|
|
|
When you create an archive, you @emph{must} specify which files you
|
|
want placed in the archive. If you do not specify any archive
|
|
members, @GNUTAR{} will complain.
|
|
|
|
If you now list the contents of the working directory (@command{ls}), you will
|
|
find the archive file listed as well as the files you saw previously:
|
|
|
|
@smallexample
|
|
blues folk jazz collection.tar
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Creating the archive @samp{collection.tar} did not destroy the copies of
|
|
the files in the directory.
|
|
|
|
Keep in mind that if you don't indicate an operation, @command{tar} will not
|
|
run and will prompt you for one. If you don't name any files, @command{tar}
|
|
will complain. You must have write access to the working directory,
|
|
or else you will not be able to create an archive in that directory.
|
|
|
|
@emph{Caution}: Do not attempt to use @option{--create} (@option{-c}) to add files to
|
|
an existing archive; it will delete the archive and write a new one.
|
|
Use @option{--append} (@option{-r}) instead. @xref{append}.
|
|
|
|
@node create verbose
|
|
@subsection Running @option{--create} with @option{--verbose}
|
|
|
|
@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:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --verbose --file=collection.tar blues folk jazz}
|
|
blues
|
|
folk
|
|
jazz
|
|
@end smallexample
|
|
|
|
This example is just like the example we showed which did not use
|
|
@option{--verbose}, except that @command{tar} generated three output
|
|
lines.
|
|
|
|
In the rest of the examples in this chapter, we will frequently use
|
|
@code{verbose} mode so we can show actions or @command{tar} responses that
|
|
you would otherwise not see, and which are important for you to
|
|
understand.
|
|
|
|
@node short create
|
|
@subsection Short Forms with @samp{create}
|
|
|
|
As we said before, the @option{--create} (@option{-c}) operation is one of the most
|
|
basic uses of @command{tar}, and you will use it countless times.
|
|
Eventually, you will probably want to use abbreviated (or ``short'')
|
|
forms of options. A full discussion of the three different forms that
|
|
options can take appears in @ref{Styles}; for now, here is what the
|
|
previous example (including the @option{--verbose} (@option{-v}) option) looks like
|
|
using short option forms:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cvf collection.tar blues folk jazz}
|
|
blues
|
|
folk
|
|
jazz
|
|
@end smallexample
|
|
|
|
@noindent
|
|
As you can see, the system responds the same no matter whether you use
|
|
long or short option forms.
|
|
|
|
@FIXME{i don't like how this is worded:} One difference between using
|
|
short and long option forms is that, although the exact placement of
|
|
arguments following options is no more specific when using short forms,
|
|
it is easier to become confused and make a mistake when using short
|
|
forms. For example, suppose you attempted the above example in the
|
|
following way:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cfv collection.tar blues folk jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
In this case, @command{tar} will make an archive file called @file{v},
|
|
containing the files @file{blues}, @file{folk}, and @file{jazz}, because
|
|
the @samp{v} is the closest ``file name'' to the @option{-f} option, and
|
|
is thus taken to be the chosen archive file name. @command{tar} will try
|
|
to add a file called @file{collection.tar} to the @file{v} archive file;
|
|
if the file @file{collection.tar} did not already exist, @command{tar} will
|
|
report an error indicating that this file does not exist. If the file
|
|
@file{collection.tar} does already exist (e.g., from a previous command
|
|
you may have run), then @command{tar} will add this file to the archive.
|
|
Because the @option{-v} option did not get registered, @command{tar} will not
|
|
run under @samp{verbose} mode, and will not report its progress.
|
|
|
|
The end result is that you may be quite confused about what happened,
|
|
and possibly overwrite a file. To illustrate this further, we will show
|
|
you how an example we showed previously would look using short forms.
|
|
|
|
This example,
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create folk blues --file=collection.tar jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
is confusing as it is. It becomes even more so when using short forms:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c folk blues -f collection.tar jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
It would be very easy to put the wrong string of characters
|
|
immediately following the @option{-f}, but doing that could sacrifice
|
|
valuable data.
|
|
|
|
For this reason, we recommend that you pay very careful attention to
|
|
the order of options and placement of file and archive names,
|
|
especially when using short option forms. Not having the option name
|
|
written out mnemonically can affect how well you remember which option
|
|
does what, and therefore where different names have to be placed.
|
|
|
|
@node create dir
|
|
@subsection Archiving Directories
|
|
|
|
@cindex Archiving Directories
|
|
@cindex Directories, Archiving
|
|
You can archive a directory by specifying its directory name as a
|
|
file name argument to @command{tar}. The files in the directory will be
|
|
archived relative to the working directory, and the directory will be
|
|
re-created along with its contents when the archive is extracted.
|
|
|
|
To archive a directory, first move to its superior directory. If you
|
|
have followed the previous instructions in this tutorial, you should
|
|
type:
|
|
|
|
@smallexample
|
|
$ @kbd{cd ..}
|
|
$
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This will put you into the directory which contains @file{practice},
|
|
i.e., your home directory. Once in the superior directory, you can
|
|
specify the subdirectory, @file{practice}, as a file name argument. To
|
|
store @file{practice} in the new archive file @file{music.tar}, type:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --verbose --file=music.tar practice}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
@command{tar} should output:
|
|
|
|
@smallexample
|
|
practice/
|
|
practice/blues
|
|
practice/folk
|
|
practice/jazz
|
|
practice/collection.tar
|
|
@end smallexample
|
|
|
|
Note that the archive thus created is not in the subdirectory
|
|
@file{practice}, but rather in the current working directory---the
|
|
directory from which @command{tar} was invoked. Before trying to archive a
|
|
directory from its superior directory, you should make sure you have
|
|
write access to the superior directory itself, not only the directory
|
|
you are trying archive with @command{tar}. For example, you will probably
|
|
not be able to store your home directory in an archive by invoking
|
|
@command{tar} from the root directory; @xref{absolute}. (Note
|
|
also that @file{collection.tar}, the original archive file, has itself
|
|
been archived. @command{tar} will accept any file as a file to be
|
|
archived, regardless of its content. When @file{music.tar} is
|
|
extracted, the archive file @file{collection.tar} will be re-written
|
|
into the file system).
|
|
|
|
If you give @command{tar} a command such as
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --file=foo.tar .}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
@command{tar} will report @samp{tar: ./foo.tar is the archive; not
|
|
dumped}. This happens because @command{tar} creates the archive
|
|
@file{foo.tar} in the current directory before putting any files into
|
|
it. Then, when @command{tar} attempts to add all the files in the
|
|
directory @file{.} to the archive, it notices that the file
|
|
@file{./foo.tar} is the same as the archive @file{foo.tar}, and skips
|
|
it. (It makes no sense to put an archive into itself.) @GNUTAR{}
|
|
will continue in this case, and create the archive
|
|
normally, except for the exclusion of that one file. (@emph{Please
|
|
note:} Other implementations of @command{tar} may not be so clever;
|
|
they will enter an infinite loop when this happens, so you should not
|
|
depend on this behavior unless you are certain you are running
|
|
@GNUTAR{}. In general, it is wise to always place the archive outside
|
|
of the directory being dumped.)
|
|
|
|
@node list
|
|
@section How to List Archives
|
|
|
|
@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, assuming @file{practice} is
|
|
your working directory, 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}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
The output of @command{tar} would then be:
|
|
|
|
@smallexample
|
|
blues
|
|
folk
|
|
jazz
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Be sure to use a @option{--file=@var{archive-name}} (@option{-f
|
|
@var{archive-name}}) option just as with @option{--create}
|
|
(@option{-c}) to specify the name of the archive.
|
|
|
|
@cindex File name arguments, using @option{--list} with
|
|
@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=collection.tar folk}} would only print @file{folk}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --file=collection.tar folk}
|
|
folk
|
|
@end smallexample
|
|
|
|
@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. 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:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --verbose --file=collection.tar folk}
|
|
-rw-r--r-- myself/user 62 1990-05-23 10:55 folk
|
|
@end smallexample
|
|
|
|
@cindex listing member and file names
|
|
@anchor{listing member and file names}
|
|
It is important to notice that the output of @kbd{tar --list
|
|
--verbose} does not necessarily match that produced by @kbd{tar
|
|
--create --verbose} while creating the archive. It is because
|
|
@GNUTAR{}, unless told explicitly not to do so, removes some directory
|
|
prefixes from file names before storing them in the archive
|
|
(@xref{absolute}, for more information). In other
|
|
words, in verbose mode @GNUTAR{} shows @dfn{file names} when creating
|
|
an archive and @dfn{member names} when listing it. Consider this
|
|
example, run from your home directory:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --create --verbose --file practice.tar ~/practice}
|
|
tar: Removing leading '/' from member names
|
|
/home/myself/practice/
|
|
/home/myself/practice/blues
|
|
/home/myself/practice/folk
|
|
/home/myself/practice/jazz
|
|
/home/myself/practice/collection.tar
|
|
$ @kbd{tar --list --file practice.tar}
|
|
home/myself/practice/
|
|
home/myself/practice/blues
|
|
home/myself/practice/folk
|
|
home/myself/practice/jazz
|
|
home/myself/practice/collection.tar
|
|
@end group
|
|
@end smallexample
|
|
|
|
@opindex show-stored-names
|
|
This default behavior can sometimes be inconvenient. You can force
|
|
@GNUTAR{} show member names when creating archive by supplying
|
|
@option{--show-stored-names} option.
|
|
|
|
@table @option
|
|
@item --show-stored-names
|
|
Print member (as opposed to @emph{file}) names when creating the archive.
|
|
@end table
|
|
|
|
With this option, both commands produce the same output:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --create --verbose --show-stored-names \
|
|
--file practice.tar ~/practice}
|
|
tar: Removing leading '/' from member names
|
|
home/myself/practice/
|
|
home/myself/practice/blues
|
|
home/myself/practice/folk
|
|
home/myself/practice/jazz
|
|
home/myself/practice/collection.tar
|
|
$ @kbd{tar --list --file practice.tar}
|
|
home/myself/practice/
|
|
home/myself/practice/blues
|
|
home/myself/practice/folk
|
|
home/myself/practice/jazz
|
|
home/myself/practice/collection.tar
|
|
@end group
|
|
@end smallexample
|
|
|
|
Since @command{tar} preserves file names, those you wish to list must be
|
|
specified as they appear in the archive (i.e., relative to the
|
|
directory from which the archive was created). Continuing the example
|
|
above:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --list --file=practice.tar folk}
|
|
tar: folk: Not found in archive
|
|
tar: Exiting with failure status due to previous errors
|
|
@end group
|
|
@end smallexample
|
|
|
|
the error message is produced because there is no member named
|
|
@file{folk}, only one named @file{home/myself/folk}.
|
|
|
|
If you are not sure of the exact file name, use @dfn{globbing
|
|
patterns}, for example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --file=practice.tar --wildcards '*/folk'}
|
|
home/myself/practice/folk
|
|
@end smallexample
|
|
|
|
@noindent
|
|
@xref{wildcards}, for a detailed discussion of globbing patterns and related
|
|
@command{tar} command line options.
|
|
|
|
@menu
|
|
* list dir::
|
|
@end menu
|
|
|
|
@node list dir
|
|
@unnumberedsubsec Listing the Contents of a Stored Directory
|
|
|
|
To get information about the contents of an archived directory,
|
|
use the directory name as a file name argument in conjunction with
|
|
@option{--list} (@option{-t}). To find out file attributes, include the
|
|
@option{--verbose} (@option{-v}) option.
|
|
|
|
For example, to find out about files in the directory @file{practice}, in
|
|
the archive file @file{music.tar}, type:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --verbose --file=music.tar practice}
|
|
@end smallexample
|
|
|
|
@command{tar} responds:
|
|
|
|
@smallexample
|
|
drwxrwxrwx myself/user 0 1990-05-31 21:49 practice/
|
|
-rw-r--r-- myself/user 42 1990-05-21 13:29 practice/blues
|
|
-rw-r--r-- myself/user 62 1990-05-23 10:55 practice/folk
|
|
-rw-r--r-- myself/user 40 1990-05-21 13:30 practice/jazz
|
|
-rw-r--r-- myself/user 10240 1990-05-31 21:49 practice/collection.tar
|
|
@end smallexample
|
|
|
|
When you use a directory name as a file name argument, @command{tar} acts on
|
|
all the files (including sub-directories) in that directory.
|
|
|
|
@node extract
|
|
@section How to Extract Members from an Archive
|
|
@cindex Extraction
|
|
@cindex Retrieving files from an archive
|
|
@cindex Resurrecting files from an archive
|
|
|
|
@opindex extract
|
|
Creating an archive is only half the job---there is no point in storing
|
|
files in an archive if you can't retrieve them. The act of retrieving
|
|
members from an archive so they can be used and manipulated as
|
|
unarchived files again is called @dfn{extraction}. To extract files
|
|
from an archive, use the @option{--extract} (@option{--get} or
|
|
@option{-x}) operation. As with @option{--create}, specify the name
|
|
of the archive with @option{--file} (@option{-f}) option. Extracting
|
|
an archive does not modify the archive in any way; you can extract it
|
|
multiple times if you want or need to.
|
|
|
|
Using @option{--extract}, you can extract an entire archive, or specific
|
|
files. The files can be directories containing other files, or not. As
|
|
with @option{--create} (@option{-c}) and @option{--list} (@option{-t}), you may use the short or the
|
|
long form of the operation without affecting the performance.
|
|
|
|
@menu
|
|
* extracting archives::
|
|
* extracting files::
|
|
* extract dir::
|
|
* extracting untrusted archives::
|
|
* failing commands::
|
|
@end menu
|
|
|
|
@node extracting archives
|
|
@subsection Extracting an Entire Archive
|
|
|
|
To extract an entire archive, specify the archive file name only, with
|
|
no individual file names as arguments. For example,
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xvf collection.tar}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
produces this:
|
|
|
|
@smallexample
|
|
-rw-r--r-- myself/user 28 1996-10-18 16:31 jazz
|
|
-rw-r--r-- myself/user 21 1996-09-23 16:44 blues
|
|
-rw-r--r-- myself/user 20 1996-09-23 16:44 folk
|
|
@end smallexample
|
|
|
|
@node extracting files
|
|
@subsection Extracting Specific Files
|
|
|
|
To extract specific archive members, give their exact member names as
|
|
arguments, as printed by @option{--list} (@option{-t}). If you had
|
|
mistakenly deleted one of the files you had placed in the archive
|
|
@file{collection.tar} earlier (say, @file{blues}), you can extract it
|
|
from the archive without changing the archive's structure. Its
|
|
contents will be identical to the original file @file{blues} that you
|
|
deleted.
|
|
|
|
First, make sure you are in the @file{practice} directory, and list the
|
|
files in the directory. Now, delete the file, @samp{blues}, and list
|
|
the files in the directory again.
|
|
|
|
You can now extract the member @file{blues} from the archive file
|
|
@file{collection.tar} like this:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --extract --file=collection.tar blues}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
If you list the files in the directory again, you will see that the file
|
|
@file{blues} has been restored, with its original permissions, data
|
|
modification times, and owner.@footnote{This is only accidentally
|
|
true, but not in general. Whereas modification times are always
|
|
restored, in most cases, one has to be root for restoring the owner,
|
|
and use a special option for restoring permissions. Here, it just
|
|
happens that the restoring user is also the owner of the archived
|
|
members, and that the current @code{umask} is compatible with original
|
|
permissions.} (These parameters will be identical to those which
|
|
the file had when you originally placed it in the archive; any changes
|
|
you may have made before deleting the file from the file system,
|
|
however, will @emph{not} have been made to the archive member.) The
|
|
archive file, @samp{collection.tar}, is the same as it was before you
|
|
extracted @samp{blues}. You can confirm this by running @command{tar} with
|
|
@option{--list} (@option{-t}).
|
|
|
|
Remember that as with other operations, specifying the exact member
|
|
name is important (@xref{failing commands}, for more examples).
|
|
|
|
You can extract a file to standard output by combining the above options
|
|
with the @option{--to-stdout} (@option{-O}) option (@pxref{Writing to Standard
|
|
Output}).
|
|
|
|
If you give the @option{--verbose} option, then @option{--extract}
|
|
will print the names of the archive members as it extracts them.
|
|
|
|
@node extract dir
|
|
@subsection Extracting Files that are Directories
|
|
|
|
Extracting directories which are members of an archive is similar to
|
|
extracting other files. The main difference to be aware of is that if
|
|
the extracted directory has the same name as any directory already in
|
|
the working directory, then files in the extracted directory will be
|
|
placed into the directory of the same name. Likewise, if there are
|
|
files in the pre-existing directory with the same names as the members
|
|
which you extract, the files from the extracted archive will replace
|
|
the files already in the working directory (and possible
|
|
subdirectories). This will happen regardless of whether or not the
|
|
files in the working directory were more recent than those extracted
|
|
(there exist, however, special options that alter this behavior
|
|
@pxref{Writing}).
|
|
|
|
However, if a file was stored with a directory name as part of its file
|
|
name, and that directory does not exist under the working directory when
|
|
the file is extracted, @command{tar} will create the directory.
|
|
|
|
We can demonstrate how to use @option{--extract} to extract a directory
|
|
file with an example. Change to the @file{practice} directory if you
|
|
weren't there, and remove the files @file{folk} and @file{jazz}. Then,
|
|
go back to the parent directory and extract the archive
|
|
@file{music.tar}. You may either extract the entire archive, or you may
|
|
extract only the files you just deleted. To extract the entire archive,
|
|
don't give any file names as arguments after the archive name
|
|
@file{music.tar}. To extract only the files you deleted, use the
|
|
following command:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xvf music.tar practice/folk practice/jazz}
|
|
practice/folk
|
|
practice/jazz
|
|
@end smallexample
|
|
|
|
@noindent
|
|
If you were to specify two @option{--verbose} (@option{-v}) options, @command{tar}
|
|
would have displayed more detail about the extracted files, as shown
|
|
in the example below:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xvvf music.tar practice/folk practice/jazz}
|
|
-rw-r--r-- me/user 28 1996-10-18 16:31 practice/jazz
|
|
-rw-r--r-- me/user 20 1996-09-23 16:44 practice/folk
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Because you created the directory with @file{practice} as part of the
|
|
file names of each of the files by archiving the @file{practice}
|
|
directory as @file{practice}, you must give @file{practice} as part
|
|
of the file names when you extract those files from the archive.
|
|
|
|
@node extracting untrusted archives
|
|
@subsection Extracting Archives from Untrusted Sources
|
|
|
|
Extracting files from archives can overwrite files that already exist.
|
|
If you receive an archive from an untrusted source, you should make a
|
|
new directory and extract into that directory, so that you don't have
|
|
to worry about the extraction overwriting one of your existing files.
|
|
For example, if @file{untrusted.tar} came from somewhere else on the
|
|
Internet, and you don't necessarily trust its contents, you can
|
|
extract it as follows:
|
|
|
|
@smallexample
|
|
$ @kbd{mkdir newdir}
|
|
$ @kbd{cd newdir}
|
|
$ @kbd{tar -xvf ../untrusted.tar}
|
|
@end smallexample
|
|
|
|
It is also a good practice to examine contents of the archive
|
|
before extracting it, using @option{--list} (@option{-t}) option, possibly combined
|
|
with @option{--verbose} (@option{-v}).
|
|
|
|
@node failing commands
|
|
@subsection Commands That Will Fail
|
|
|
|
Here are some sample commands you might try which will not work, and why
|
|
they won't work.
|
|
|
|
If you try to use this command,
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xvf music.tar folk jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
you will get the following response:
|
|
|
|
@smallexample
|
|
tar: folk: Not found in archive
|
|
tar: jazz: Not found in archive
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This is because these files were not originally @emph{in} the parent
|
|
directory @file{..}, where the archive is located; they were in the
|
|
@file{practice} directory, and their file names reflect this:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -tvf music.tar}
|
|
practice/blues
|
|
practice/folk
|
|
practice/jazz
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Likewise, if you try to use this command,
|
|
|
|
@smallexample
|
|
$ @kbd{tar -tvf music.tar folk jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
you would get a similar response. Members with those names are not in the
|
|
archive. You must use the correct member names, or wildcards, in order
|
|
to extract the files from the archive.
|
|
|
|
If you have forgotten the correct names of the files in the archive,
|
|
use @w{@kbd{tar --list --verbose}} to list them correctly.
|
|
|
|
To extract the member named @file{practice/folk}, you must specify
|
|
|
|
@smallexample
|
|
$ @kbd{tar --extract --file=music.tar practice/folk}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice also, that as explained above, the @file{practice} directory
|
|
will be created, if it didn't already exist. There are options that
|
|
allow you to strip away a certain number of leading directory
|
|
components (@pxref{transform}). For example,
|
|
|
|
@smallexample
|
|
$ @kbd{tar --extract --file=music.tar --strip-components=1 folk}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
will extract the file @file{folk} into the current working directory.
|
|
|
|
@node going further
|
|
@section Going Further Ahead in this Manual
|
|
@UNREVISED{}
|
|
|
|
@FIXME{need to write up a node here about the things that are going to
|
|
be in the rest of the manual.}
|
|
|
|
@node tar invocation
|
|
@chapter Invoking @GNUTAR{}
|
|
|
|
This chapter is about how one invokes the @GNUTAR{}
|
|
command, from the command synopsis (@pxref{Synopsis}). There are
|
|
numerous options, and many styles for writing them. One mandatory
|
|
option specifies the operation @command{tar} should perform
|
|
(@pxref{Operation Summary}), other options are meant to detail how
|
|
this operation should be performed (@pxref{Option Summary}).
|
|
Non-option arguments are not always interpreted the same way,
|
|
depending on what the operation is.
|
|
|
|
You will find in this chapter everything about option styles and rules for
|
|
writing them (@pxref{Styles}). On the other hand, operations and options
|
|
are fully described elsewhere, in other chapters. Here, you will find
|
|
only synthetic descriptions for operations and options, together with
|
|
pointers to other parts of the @command{tar} manual.
|
|
|
|
Some options are so special they are fully described right in this
|
|
chapter. They have the effect of inhibiting the normal operation of
|
|
@command{tar} or else, they globally alter the amount of feedback the user
|
|
receives about what is going on. These are the @option{--help} and
|
|
@option{--version} (@pxref{help}), @option{--verbose} (@pxref{verbose})
|
|
and @option{--interactive} options (@pxref{interactive}).
|
|
|
|
@menu
|
|
* Synopsis::
|
|
* using tar options::
|
|
* Styles::
|
|
* All Options:: All @command{tar} Options.
|
|
* help:: Where to Get Help.
|
|
* defaults:: What are the Default Values.
|
|
* verbose:: Checking @command{tar} progress.
|
|
* checkpoints:: Checkpoints.
|
|
* warnings:: Controlling Warning Messages.
|
|
* interactive:: Asking for Confirmation During Operations.
|
|
* external:: Running External Commands.
|
|
@end menu
|
|
|
|
@node Synopsis
|
|
@section General Synopsis of @command{tar}
|
|
|
|
The @GNUTAR{} program is invoked as either one of:
|
|
|
|
@smallexample
|
|
@kbd{tar @var{option}@dots{} [@var{name}]@dots{}}
|
|
@kbd{tar @var{letter}@dots{} [@var{argument}]@dots{} [@var{option}]@dots{} [@var{name}]@dots{}}
|
|
@end smallexample
|
|
|
|
The second form is for when old options are being used.
|
|
|
|
You can use @command{tar} to store files in an archive, to extract them from
|
|
an archive, and to do other types of archive manipulation. The primary
|
|
argument to @command{tar}, which is called the @dfn{operation}, specifies
|
|
which action to take. The other arguments to @command{tar} are either
|
|
@dfn{options}, which change the way @command{tar} performs an operation,
|
|
or file names or archive members, which specify the files or members
|
|
@command{tar} is to act on.
|
|
|
|
You can actually type in arguments in any order, even if in this manual
|
|
the options always precede the other arguments, to make examples easier
|
|
to understand. Further, the option stating the main operation mode
|
|
(the @command{tar} main command) is usually given first.
|
|
|
|
Each @var{name} in the synopsis above is interpreted as an archive member
|
|
name when the main command is one of @option{--compare}
|
|
(@option{--diff}, @option{-d}), @option{--delete}, @option{--extract}
|
|
(@option{--get}, @option{-x}), @option{--list} (@option{-t}) or
|
|
@option{--update} (@option{-u}). When naming archive members, you
|
|
must give the exact name of the member in the archive, as it is
|
|
printed by @option{--list}. For @option{--append} (@option{-r}) and
|
|
@option{--create} (@option{-c}), these @var{name} arguments specify
|
|
the names of either files or directory hierarchies to place in the archive.
|
|
These files or hierarchies should already exist in the file system,
|
|
prior to the execution of the @command{tar} command.
|
|
|
|
@command{tar} interprets relative file names as being relative to the
|
|
working directory. @command{tar} will make all file names relative
|
|
(by removing leading slashes when archiving or restoring files),
|
|
unless you specify otherwise (using the @option{--absolute-names}
|
|
option). @xref{absolute}, for more information about
|
|
@option{--absolute-names}.
|
|
|
|
If you give the name of a directory as either a file name or a member
|
|
name, then @command{tar} acts recursively on all the files and directories
|
|
beneath that directory. For example, the name @file{/} identifies all
|
|
the files in the file system to @command{tar}.
|
|
|
|
The distinction between file names and archive member names is especially
|
|
important when shell globbing is used, and sometimes a source of confusion
|
|
for newcomers. @xref{wildcards}, for more information about globbing.
|
|
The problem is that shells may only glob using existing files in the
|
|
file system. Only @command{tar} itself may glob on archive members, so when
|
|
needed, you must ensure that wildcard characters reach @command{tar} without
|
|
being interpreted by the shell first. Using a backslash before @samp{*}
|
|
or @samp{?}, or putting the whole argument between quotes, is usually
|
|
sufficient for this.
|
|
|
|
Even if @var{name}s are often specified on the command line, they
|
|
can also be read from a text file in the file system, using the
|
|
@option{--files-from=@var{file-of-names}} (@option{-T @var{file-of-names}}) option.
|
|
|
|
If you don't use any file name arguments, @option{--append} (@option{-r}),
|
|
@option{--delete} and @option{--concatenate} (@option{--catenate},
|
|
@option{-A}) will do nothing, while @option{--create} (@option{-c})
|
|
will usually yield a diagnostic and inhibit @command{tar} execution.
|
|
The other operations of @command{tar} (@option{--list},
|
|
@option{--extract}, @option{--compare}, and @option{--update})
|
|
will act on the entire contents of the archive.
|
|
|
|
@anchor{exit status}
|
|
@cindex exit status
|
|
@cindex return status
|
|
Besides successful exits, @GNUTAR{} may fail for
|
|
many reasons. Some reasons correspond to bad usage, that is, when the
|
|
@command{tar} command line is improperly written. Errors may be
|
|
encountered later, while processing the archive or the files. Some
|
|
errors are recoverable, in which case the failure is delayed until
|
|
@command{tar} has completed all its work. Some errors are such that
|
|
it would be not meaningful, or at least risky, to continue processing:
|
|
@command{tar} then aborts processing immediately. All abnormal exits,
|
|
whether immediate or delayed, should always be clearly diagnosed on
|
|
@code{stderr}, after a line stating the nature of the error.
|
|
|
|
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
|
|
|
|
@GNUTAR{} has a total of eight operating modes which
|
|
allow you to perform a variety of tasks. You are required to choose
|
|
one operating mode each time you employ the @command{tar} program by
|
|
specifying one, and only one operation as an argument to the
|
|
@command{tar} command (the corresponding options may be found
|
|
at @ref{frequent operations} and @ref{Operations}). Depending on
|
|
circumstances, you may also wish to customize how the chosen operating
|
|
mode behaves. For example, you may wish to change the way the output
|
|
looks, or the format of the files that you wish to archive may require
|
|
you to do something special in order to make the archive look right.
|
|
|
|
You can customize and control @command{tar}'s performance by running
|
|
@command{tar} with one or more options (such as @option{--verbose}
|
|
(@option{-v}), which we used in the tutorial). As we said in the
|
|
tutorial, @dfn{options} are arguments to @command{tar} which are (as
|
|
their name suggests) optional. Depending on the operating mode, you
|
|
may specify one or more options. Different options will have different
|
|
effects, but in general they all change details of the operation, such
|
|
as archive format, archive name, or level of user interaction. Some
|
|
options make sense with all operating modes, while others are
|
|
meaningful only with particular modes. You will likely use some
|
|
options frequently, while you will only use others infrequently, or
|
|
not at all. (A full list of options is available in @pxref{All Options}.)
|
|
|
|
@vrindex TAR_OPTIONS, environment variable
|
|
@anchor{TAR_OPTIONS}
|
|
The @env{TAR_OPTIONS} environment variable specifies default options to
|
|
be placed in front of any explicit options. For example, if
|
|
@code{TAR_OPTIONS} is @samp{-v --unlink-first}, @command{tar} behaves as
|
|
if the two options @option{-v} and @option{--unlink-first} had been
|
|
specified before any explicit options. Option specifications are
|
|
separated by whitespace. A backslash escapes the next character, so it
|
|
can be used to specify an option containing whitespace or a backslash.
|
|
|
|
Note that @command{tar} options are case sensitive. For example, the
|
|
options @option{-T} and @option{-t} are different; the first requires an
|
|
argument for stating the name of a file providing a list of @var{name}s,
|
|
while the second does not require an argument and is another way to
|
|
write @option{--list} (@option{-t}).
|
|
|
|
In addition to the eight operations, there are many options to
|
|
@command{tar}, and three different styles for writing both: long (mnemonic)
|
|
form, short form, and old style. These styles are discussed below.
|
|
Both the options and the operations can be written in any of these three
|
|
styles.
|
|
|
|
@FIXME{menu at end of this node. need to think of an actual outline
|
|
for this chapter; probably do that after stuff from chapter 4 is
|
|
incorporated.}
|
|
|
|
@node Styles
|
|
@section The Three Option Styles
|
|
|
|
There are three styles for writing operations and options to the command
|
|
line invoking @command{tar}. The different styles were developed at
|
|
different times during the history of @command{tar}. These styles will be
|
|
presented below, from the most recent to the oldest.
|
|
|
|
Some options must take an argument@footnote{For example, @option{--file}
|
|
(@option{-f}) takes the name of an archive file as an argument. If
|
|
you do not supply an archive file name, @command{tar} will use a
|
|
default, but this can be confusing; thus, we recommend that you always
|
|
supply a specific archive file name.}. Where you @emph{place} the
|
|
arguments generally depends on which style of options you choose. We
|
|
will detail specific information relevant to each option style in the
|
|
sections on the different option styles, below. The differences are
|
|
subtle, yet can often be very important; incorrect option placement
|
|
can cause you to overwrite a number of important files. We urge you
|
|
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. 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
|
|
* Long Options:: Long Option Style
|
|
* Short Options:: Short Option Style
|
|
* Old Options:: Old Option Style
|
|
* Mixing:: Mixing Option Styles
|
|
@end menu
|
|
|
|
@node Long Options
|
|
@subsection Long Option Style
|
|
|
|
@cindex long options
|
|
@cindex options, long style
|
|
@cindex options, GNU style
|
|
@cindex options, mnemonic names
|
|
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 long option has many 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 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
|
|
abbreviation won't work. You may also choose to run @samp{tar --help}
|
|
to see a list of options. Be aware that if you run @command{tar} with a
|
|
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.)
|
|
|
|
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:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --verbose --blocking-factor=20 --file=/dev/rmt0}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
gives a fairly good set of hints about what the command does, even
|
|
for those not fully acquainted with @command{tar}.
|
|
|
|
@cindex arguments to long options
|
|
@cindex long options with mandatory 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
|
|
white space characters. For example, the @option{--file} option (which
|
|
tells the name of the @command{tar} archive) is given a file such as
|
|
@file{archive.tar} as argument by using any of the following notations:
|
|
@option{--file=archive.tar} or @option{--file archive.tar}.
|
|
|
|
@cindex optional arguments to long options
|
|
@cindex long options with optional arguments
|
|
In contrast, optional arguments must always be introduced using
|
|
an equal sign. For example, the @option{--backup} option takes
|
|
an optional argument specifying backup type. It must be used
|
|
as @option{--backup=@var{backup-type}}.
|
|
|
|
@node Short Options
|
|
@subsection Short Option Style
|
|
|
|
@cindex short options
|
|
@cindex options, short style
|
|
@cindex options, traditional
|
|
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.
|
|
|
|
The short option names are faster to type than long option names.
|
|
|
|
@cindex arguments to short options
|
|
@cindex short options with mandatory arguments
|
|
Short options which require arguments take their arguments immediately
|
|
following the option, usually separated by white space. It is also
|
|
possible to stick the argument right after the short option name, using
|
|
no intervening space. For example, you might write @w{@option{-f
|
|
archive.tar}} or @option{-farchive.tar} instead of using
|
|
@option{--file=archive.tar}. Both @option{--file=@var{archive-name}} and
|
|
@w{@option{-f @var{archive-name}}} denote the option which indicates a
|
|
specific archive, here named @file{archive.tar}.
|
|
|
|
@cindex optional arguments to short options
|
|
@cindex short options with optional arguments
|
|
Short options which take optional arguments take their arguments
|
|
immediately following the option letter, @emph{without any intervening
|
|
white space characters}.
|
|
|
|
Short options' letters may be clumped together, but you are not
|
|
required to do this (as compared to old options; see below). When
|
|
short options are clumped as a set, use one (single) dash for them
|
|
all, e.g., @w{@samp{@command{tar} -cvf}}. Only the last option in
|
|
such a set is allowed to have an argument@footnote{Clustering many
|
|
options, the last of which has an argument, is a rather opaque way to
|
|
write options. Some wonder if @acronym{GNU} @code{getopt} should not
|
|
even be made helpful enough for considering such usages as invalid.}.
|
|
|
|
When the options are separated, the argument for each option which requires
|
|
an argument directly follows that option, as is usual for Unix programs.
|
|
For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -v -b 20 -f /dev/rmt0}
|
|
@end smallexample
|
|
|
|
If you reorder short options' locations, be sure to move any arguments
|
|
that belong to them. If you do not move the arguments properly, you may
|
|
end up overwriting files.
|
|
|
|
@node Old Options
|
|
@subsection Old Option Style
|
|
@cindex options, old style
|
|
@cindex old option style
|
|
@cindex option syntax, traditional
|
|
|
|
As far as we know, all @command{tar} programs, @acronym{GNU} and
|
|
non-@acronym{GNU}, support @dfn{old options}: that is, if the first
|
|
argument does not start with @samp{-}, it is assumed to specify option
|
|
letters. @GNUTAR{} supports old options not only for historical
|
|
reasons, but also because many people are used to them. If the first
|
|
argument does not start with a dash, you are announcing the old option
|
|
style instead of the short option style; old options are decoded
|
|
differently.
|
|
|
|
Like short options, 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. This set
|
|
of letters must be the first to appear on the command line, after the
|
|
@command{tar} program name and some white space; old options cannot appear
|
|
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
|
|
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}.
|
|
|
|
@cindex arguments to old options
|
|
@cindex old options with mandatory arguments
|
|
When options that need arguments are given together with the command,
|
|
all the associated arguments follow, in the same order as the options.
|
|
Thus, the example given previously could also be written in the old
|
|
style as follows:
|
|
|
|
@smallexample
|
|
$ @kbd{tar cvbf 20 /dev/rmt0}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Here, @samp{20} is the argument of @option{-b} and @samp{/dev/rmt0} is
|
|
the argument of @option{-f}.
|
|
|
|
The old style syntax can make it difficult to match
|
|
option letters with their corresponding arguments, and is often
|
|
confusing. In the command @w{@samp{tar cvbf 20 /dev/rmt0}}, for example,
|
|
@samp{20} is the argument for @option{-b}, @samp{/dev/rmt0} is the
|
|
argument for @option{-f}, and @option{-v} does not have a corresponding
|
|
argument. Even using short options like in @w{@samp{tar -c -v -b 20 -f
|
|
/dev/rmt0}} is clearer, putting all arguments next to the option they
|
|
pertain to.
|
|
|
|
If you want to reorder the letters in the old option argument, be
|
|
sure to reorder any corresponding argument appropriately.
|
|
|
|
This old way of writing @command{tar} options can surprise even experienced
|
|
users. For example, the two commands:
|
|
|
|
@smallexample
|
|
@kbd{tar cfz archive.tar.gz file}
|
|
@kbd{tar -cfz archive.tar.gz file}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
are quite different. The first example uses @file{archive.tar.gz} as
|
|
the value for option @samp{f} and recognizes the option @samp{z}. The
|
|
second example, however, uses @file{z} as the value for option
|
|
@samp{f} --- probably not what was intended.
|
|
|
|
This second example could be corrected in many ways, among which the
|
|
following are equivalent:
|
|
|
|
@smallexample
|
|
@kbd{tar -czf archive.tar.gz file}
|
|
@kbd{tar -cf archive.tar.gz -z file}
|
|
@kbd{tar cf archive.tar.gz -z file}
|
|
@end smallexample
|
|
|
|
@node Mixing
|
|
@subsection Mixing Option Styles
|
|
|
|
@cindex options, mixing different styles
|
|
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 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,
|
|
following the rule for old options (old options must appear directly
|
|
after the @command{tar} command and some white space). Modern options
|
|
may be given only after all arguments to the old options have been
|
|
collected. If this rule is not respected, a modern option might be
|
|
falsely interpreted as the value of the argument to one of the old
|
|
style options.
|
|
|
|
For example, all the following commands are wholly equivalent, and
|
|
illustrate the many combinations and orderings of option styles.
|
|
|
|
@smallexample
|
|
@kbd{tar --create --file=archive.tar}
|
|
@kbd{tar --create -f archive.tar}
|
|
@kbd{tar --create -farchive.tar}
|
|
@kbd{tar --file=archive.tar --create}
|
|
@kbd{tar --file=archive.tar -c}
|
|
@kbd{tar -c --file=archive.tar}
|
|
@kbd{tar -c -f archive.tar}
|
|
@kbd{tar -c -farchive.tar}
|
|
@kbd{tar -cf archive.tar}
|
|
@kbd{tar -cfarchive.tar}
|
|
@kbd{tar -f archive.tar --create}
|
|
@kbd{tar -f archive.tar -c}
|
|
@kbd{tar -farchive.tar --create}
|
|
@kbd{tar -farchive.tar -c}
|
|
@kbd{tar c --file=archive.tar}
|
|
@kbd{tar c -f archive.tar}
|
|
@kbd{tar c -farchive.tar}
|
|
@kbd{tar cf archive.tar}
|
|
@kbd{tar f archive.tar --create}
|
|
@kbd{tar f archive.tar -c}
|
|
@kbd{tar fc archive.tar}
|
|
@end smallexample
|
|
|
|
On the other hand, the following commands are @emph{not} equivalent to
|
|
the previous set:
|
|
|
|
@smallexample
|
|
@kbd{tar -f -c archive.tar}
|
|
@kbd{tar -fc archive.tar}
|
|
@kbd{tar -fcarchive.tar}
|
|
@kbd{tar -farchive.tarc}
|
|
@kbd{tar cfarchive.tar}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
These last examples mean something completely different from what the
|
|
user intended (judging based on the example in the previous set which
|
|
uses long options, whose intent is therefore very clear). The first
|
|
four specify that the @command{tar} archive would be a file named
|
|
@option{-c}, @samp{c}, @samp{carchive.tar} or @samp{archive.tarc},
|
|
respectively. The first two examples also specify a single non-option,
|
|
@var{name} argument having the value @samp{archive.tar}. The last
|
|
example contains only old style option letters (repeating option
|
|
@samp{c} twice), not all of which are meaningful (eg., @samp{.},
|
|
@samp{h}, or @samp{i}), with no argument value.
|
|
@FIXME{not sure i liked
|
|
the first sentence of this paragraph..}
|
|
|
|
@node All Options
|
|
@section All @command{tar} Options
|
|
|
|
The coming manual sections contain an alphabetical listing of all
|
|
@command{tar} operations and options, with brief descriptions and
|
|
cross-references to more in-depth explanations in the body of the manual.
|
|
They also contain an alphabetically arranged table of the short option
|
|
forms with their corresponding long option. You can use this table as
|
|
a reference for deciphering @command{tar} commands in scripts.
|
|
|
|
@menu
|
|
* Operation Summary::
|
|
* Option Summary::
|
|
* Short Option Summary::
|
|
* Position-Sensitive Options::
|
|
@end menu
|
|
|
|
@node Operation Summary
|
|
@subsection Operations
|
|
|
|
@table @option
|
|
|
|
@opsummary{append}
|
|
@item --append
|
|
@itemx -r
|
|
|
|
Appends files to the end of the archive. @xref{append}.
|
|
|
|
@opsummary{catenate}
|
|
@item --catenate
|
|
@itemx -A
|
|
|
|
Same as @option{--concatenate}. @xref{concatenate}.
|
|
|
|
@opsummary{compare}
|
|
@item --compare
|
|
@itemx -d
|
|
|
|
Compares archive members with their counterparts in the file
|
|
system, and reports differences in file size, mode, owner,
|
|
modification date and contents. @xref{compare}.
|
|
|
|
@opsummary{concatenate}
|
|
@item --concatenate
|
|
@itemx -A
|
|
|
|
Appends other @command{tar} archives to the end of the archive.
|
|
@xref{concatenate}.
|
|
|
|
@opsummary{create}
|
|
@item --create
|
|
@itemx -c
|
|
|
|
Creates a new @command{tar} archive. @xref{create}.
|
|
|
|
@opsummary{delete}
|
|
@item --delete
|
|
|
|
Deletes members from the archive. Don't try this on an archive on a
|
|
tape! @xref{delete}.
|
|
|
|
@opsummary{diff}
|
|
@item --diff
|
|
@itemx -d
|
|
|
|
Same as @option{--compare}. @xref{compare}.
|
|
|
|
@opsummary{extract}
|
|
@item --extract
|
|
@itemx -x
|
|
|
|
Extracts members from the archive into the file system. @xref{extract}.
|
|
|
|
@opsummary{get}
|
|
@item --get
|
|
@itemx -x
|
|
|
|
Same as @option{--extract}. @xref{extract}.
|
|
|
|
@opsummary{list}
|
|
@item --list
|
|
@itemx -t
|
|
|
|
Lists the members in an archive. @xref{list}.
|
|
|
|
@opsummary{update}
|
|
@item --update
|
|
@itemx -u
|
|
|
|
Adds files to the end of the archive, but only if they are newer than
|
|
their counterparts already in the archive, or if they do not already
|
|
exist in the archive. @xref{update}.
|
|
|
|
@end table
|
|
|
|
@node Option Summary
|
|
@subsection @command{tar} Options
|
|
|
|
@table @option
|
|
|
|
@opsummary{absolute-names}
|
|
@item --absolute-names
|
|
@itemx -P
|
|
|
|
Normally when creating an archive, @command{tar} strips an initial
|
|
@samp{/} from member names, and when extracting from an archive @command{tar}
|
|
treats names specially if they have initial @samp{/} or internal
|
|
@samp{..}. This option disables that behavior. @xref{absolute}.
|
|
|
|
@opsummary{acls}
|
|
@item --acls
|
|
Enable POSIX ACLs support. @xref{Extended File Attributes, acls}.
|
|
|
|
@opsummary{after-date}
|
|
@item --after-date
|
|
|
|
(See @option{--newer}, @pxref{after})
|
|
|
|
@opsummary{anchored}
|
|
@item --anchored
|
|
A pattern must match an initial subsequence of the name's components.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{atime-preserve}
|
|
@item --atime-preserve
|
|
@itemx --atime-preserve=replace
|
|
@itemx --atime-preserve=system
|
|
|
|
Attempt to preserve the access time of files when reading them. This
|
|
option currently is effective only on files that you own, unless you
|
|
have superuser privileges.
|
|
|
|
@option{--atime-preserve=replace} remembers the access time of a file
|
|
before reading it, and then restores the access time afterwards. This
|
|
may cause problems if other programs are reading the file at the same
|
|
time, as the times of their accesses will be lost. On most platforms
|
|
restoring the access time also requires @command{tar} to restore the
|
|
data modification time too, so this option may also cause problems if
|
|
other programs are writing the file at the same time (@command{tar} attempts
|
|
to detect this situation, but cannot do so reliably due to race
|
|
conditions). Worse, on most platforms restoring the access time also
|
|
updates the status change time, which means that this option is
|
|
incompatible with incremental backups.
|
|
|
|
@option{--atime-preserve=system} avoids changing time stamps on files,
|
|
without interfering with time stamp updates
|
|
caused by other programs, so it works better with incremental backups.
|
|
However, it requires a special @code{O_NOATIME} option from the
|
|
underlying operating and file system implementation, and it also requires
|
|
that searching directories does not update their access times. As of
|
|
this writing (November 2005) this works only with Linux, and only with
|
|
Linux kernels 2.6.8 and later. Worse, there is currently no reliable
|
|
way to know whether this feature actually works. Sometimes
|
|
@command{tar} knows that it does not work, and if you use
|
|
@option{--atime-preserve=system} then @command{tar} complains and
|
|
exits right away. But other times @command{tar} might think that the
|
|
option works when it actually does not.
|
|
|
|
Currently @option{--atime-preserve} with no operand defaults to
|
|
@option{--atime-preserve=replace}, but this may change in the future
|
|
as support for @option{--atime-preserve=system} improves.
|
|
|
|
If your operating or file system does not support
|
|
@option{--atime-preserve=@-system}, you might be able to preserve access
|
|
times reliably 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.
|
|
|
|
@opsummary{auto-compress}
|
|
@item --auto-compress
|
|
@itemx -a
|
|
|
|
During a @option{--create} operation, enables automatic compressed
|
|
format recognition based on the archive suffix. The effect of this
|
|
option is cancelled by @option{--no-auto-compress}. @xref{gzip}.
|
|
|
|
@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}.
|
|
|
|
@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}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{bzip2}
|
|
@item --bzip2
|
|
@itemx -j
|
|
|
|
This option tells @command{tar} to read or write archives through
|
|
@code{bzip2}. @xref{gzip}.
|
|
|
|
@opsummary{check-device}
|
|
@item --check-device
|
|
Check device numbers when creating a list of modified files for
|
|
incremental archiving. This is the default. @xref{device numbers},
|
|
for a detailed description.
|
|
|
|
@opsummary{checkpoint}
|
|
@item --checkpoint[=@var{number}]
|
|
|
|
This option directs @command{tar} to print periodic checkpoint
|
|
messages as it reads through the archive. It is intended for when you
|
|
want a visual indication that @command{tar} is still running, but
|
|
don't want to see @option{--verbose} output. You can also instruct
|
|
@command{tar} to execute a list of actions on each checkpoint, see
|
|
@option{--checkpoint-action} below. For a detailed description, see
|
|
@ref{checkpoints}.
|
|
|
|
@opsummary{checkpoint-action}
|
|
@item --checkpoint-action=@var{action}
|
|
Instruct @command{tar} to execute an action upon hitting a
|
|
breakpoint. Here we give only a brief outline. @xref{checkpoints},
|
|
for a complete description.
|
|
|
|
The @var{action} argument can be one of the following:
|
|
|
|
@table @asis
|
|
@item bell
|
|
Produce an audible bell on the console.
|
|
|
|
@item dot
|
|
@itemx .
|
|
Print a single dot on the standard listing stream.
|
|
|
|
@item echo
|
|
Display a textual message on the standard error, with the status and
|
|
number of the checkpoint. This is the default.
|
|
|
|
@item echo=@var{string}
|
|
Display @var{string} on the standard error. Before output, the string
|
|
is subject to meta-character expansion.
|
|
|
|
@item exec=@var{command}
|
|
Execute the given @var{command}.
|
|
|
|
@item sleep=@var{time}
|
|
Wait for @var{time} seconds.
|
|
|
|
@item ttyout=@var{string}
|
|
Output @var{string} on the current console (@file{/dev/tty}).
|
|
|
|
@item totals
|
|
Print statistics (see @pxref{totals}).
|
|
|
|
@item wait=@var{signo}
|
|
Wait for signal @var{signo}.
|
|
@end table
|
|
|
|
Several @option{--checkpoint-action} options can be specified. The
|
|
supplied actions will be executed in order of their appearance in the
|
|
command line.
|
|
|
|
Using @option{--checkpoint-action} without @option{--checkpoint}
|
|
assumes default checkpoint frequency of one checkpoint per 10 records.
|
|
|
|
@opsummary{check-links}
|
|
@item --check-links
|
|
@itemx -l
|
|
If this option was given, @command{tar} will check the number of links
|
|
dumped for each processed file. If this number does not match the
|
|
total number of hard links for the file, a warning message will be
|
|
output @footnote{Earlier versions of @GNUTAR{} understood @option{-l} as a
|
|
synonym for @option{--one-file-system}. The current semantics, which
|
|
complies to UNIX98, was introduced with version
|
|
1.15.91. @xref{Changes}, for more information.}.
|
|
|
|
@xref{hard links}.
|
|
|
|
@opsummary{compress}
|
|
@opsummary{uncompress}
|
|
@item --compress
|
|
@itemx --uncompress
|
|
@itemx -Z
|
|
|
|
@command{tar} will use the @command{compress} program when reading or
|
|
writing the archive. This allows you to directly act on archives
|
|
while saving space. @xref{gzip}.
|
|
|
|
@opsummary{clamp-mtime}
|
|
@item --clamp-mtime
|
|
|
|
(See @option{--mtime}.)
|
|
|
|
@opsummary{confirmation}
|
|
@item --confirmation
|
|
|
|
(See @option{--interactive}.) @xref{interactive}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{dereference}
|
|
@item --dereference
|
|
@itemx -h
|
|
|
|
When reading or writing a file to be archived, @command{tar} accesses
|
|
the file that a symbolic link points to, rather than the symlink
|
|
itself. @xref{dereference}.
|
|
|
|
@opsummary{directory}
|
|
@item --directory=@var{dir}
|
|
@itemx -C @var{dir}
|
|
|
|
When this option is specified, @command{tar} will change its current directory
|
|
to @var{dir} before performing any operations. When this option is used
|
|
during archive creation, it is order sensitive. @xref{directory}.
|
|
|
|
@opsummary{exclude}
|
|
@item --exclude=@var{pattern}
|
|
|
|
When performing operations, @command{tar} will skip files that match
|
|
@var{pattern}. @xref{exclude}.
|
|
|
|
@opsummary{exclude-backups}
|
|
@item --exclude-backups
|
|
Exclude backup and lock files. @xref{exclude,, exclude-backups}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{exclude-caches}
|
|
@item --exclude-caches
|
|
|
|
Exclude from dump any directory containing a valid cache directory
|
|
tag file, but still dump the directory node and the tag file itself.
|
|
|
|
@xref{exclude,, exclude-caches}.
|
|
|
|
@opsummary{exclude-caches-under}
|
|
@item --exclude-caches-under
|
|
|
|
Exclude from dump any directory containing a valid cache directory
|
|
tag file, but still dump the directory node itself.
|
|
|
|
@xref{exclude}.
|
|
|
|
@opsummary{exclude-caches-all}
|
|
@item --exclude-caches-all
|
|
|
|
Exclude from dump any directory containing a valid cache directory
|
|
tag file. @xref{exclude}.
|
|
|
|
@opsummary{exclude-ignore}
|
|
@item --exclude-ignore=@var{file}
|
|
Before dumping a directory, @command{tar} checks if it contains
|
|
@var{file}. If so, exclusion patterns are read from this file.
|
|
The patterns affect only the directory itself. @xref{exclude}.
|
|
|
|
@opsummary{exclude-ignore-recursive}
|
|
@item --exclude-ignore-recursive=@var{file}
|
|
Before dumping a directory, @command{tar} checks if it contains
|
|
@var{file}. If so, exclusion patterns are read from this file.
|
|
The patterns affect the directory and all itssubdirectories.
|
|
@xref{exclude}.
|
|
|
|
@opsummary{exclude-tag}
|
|
@item --exclude-tag=@var{file}
|
|
|
|
Exclude from dump any directory containing file named @var{file}, but
|
|
dump the directory node and @var{file} itself. @xref{exclude,, exclude-tag}.
|
|
|
|
@opsummary{exclude-tag-under}
|
|
@item --exclude-tag-under=@var{file}
|
|
|
|
Exclude from dump the contents of any directory containing file
|
|
named @var{file}, but dump the directory node itself. @xref{exclude,,
|
|
exclude-tag-under}.
|
|
|
|
@opsummary{exclude-tag-all}
|
|
@item --exclude-tag-all=@var{file}
|
|
|
|
Exclude from dump any directory containing file named @var{file}.
|
|
@xref{exclude,,exclude-tag-all}.
|
|
|
|
@opsummary{exclude-vcs}
|
|
@item --exclude-vcs
|
|
|
|
Exclude from dump directories and files, that are internal for some
|
|
widely used version control systems.
|
|
|
|
@xref{exclude-vcs}.
|
|
|
|
@opsummary{exclude-vcs-ignores}
|
|
@item --exclude-vcs-ignores
|
|
Exclude files that match patterns read from VCS-specific ignore
|
|
files. Supported files are: @file{.cvsignore}, @file{.gitignore},
|
|
@file{.bzrignore}, and @file{.hgignore}. The semantics of each file
|
|
is the same as for the corresponding VCS, e.g. patterns read from
|
|
@file{.gitignore} affect the directory and all its subdirectories.
|
|
@xref{exclude-vcs-ignores}.
|
|
|
|
@opsummary{file}
|
|
@item --file=@var{archive}
|
|
@itemx -f @var{archive}
|
|
|
|
@command{tar} will use the file @var{archive} as the @command{tar} archive it
|
|
performs operations on, rather than @command{tar}'s compilation dependent
|
|
default. @xref{file tutorial}.
|
|
|
|
@opsummary{files-from}
|
|
@item --files-from=@var{file}
|
|
@itemx -T @var{file}
|
|
|
|
@command{tar} will use the contents of @var{file} as a list of archive members
|
|
or files to operate on, in addition to those specified on the
|
|
command-line. @xref{files}.
|
|
|
|
@opsummary{force-local}
|
|
@item --force-local
|
|
|
|
Forces @command{tar} to interpret the file name given to @option{--file}
|
|
as a local file, even if it looks like a remote tape drive name.
|
|
@xref{local and remote archives}.
|
|
|
|
@opsummary{format}
|
|
@item --format=@var{format}
|
|
@itemx -H @var{format}
|
|
|
|
Selects output archive format. @var{Format} may be one of the
|
|
following:
|
|
|
|
@table @samp
|
|
@item v7
|
|
Creates an archive that is compatible with Unix V7 @command{tar}.
|
|
|
|
@item oldgnu
|
|
Creates an archive that is compatible with GNU @command{tar} version
|
|
1.12 or earlier.
|
|
|
|
@item gnu
|
|
Creates archive in GNU tar 1.13 format. Basically it is the same as
|
|
@samp{oldgnu} with the only difference in the way it handles long
|
|
numeric fields.
|
|
|
|
@item ustar
|
|
Creates a @acronym{POSIX.1-1988} compatible archive.
|
|
|
|
@item posix
|
|
Creates a @acronym{POSIX.1-2001 archive}.
|
|
|
|
@end table
|
|
|
|
@xref{Formats}, for a detailed discussion of these formats.
|
|
|
|
@opsummary{full-time}
|
|
@item --full-time
|
|
This option instructs @command{tar} to print file times to their full
|
|
resolution. Usually this means 1-second resolution, but that depends
|
|
on the underlying file system. The @option{--full-time} option takes
|
|
effect only when detailed output (verbosity level 2 or higher) has
|
|
been requested using the @option{--verbose} option, e.g., when listing
|
|
or extracting archives:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -t -v --full-time -f archive.tar}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
or, when creating an archive:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -vv --full-time -f archive.tar .}
|
|
@end smallexample
|
|
|
|
Notice, thar when creating the archive you need to specify
|
|
@option{--verbose} twice to get a detailed output (@pxref{verbose
|
|
tutorial}).
|
|
|
|
@opsummary{group}
|
|
@item --group=@var{group}
|
|
|
|
Files added to the @command{tar} archive will have a group @acronym{ID} of @var{group},
|
|
rather than the group from the source file. @var{group} can specify a
|
|
symbolic name, or a numeric @acronym{ID}, or both as
|
|
@var{name}:@var{id}. @xref{override}.
|
|
|
|
Also see the @option{--group-map} option and comments for the
|
|
@option{--owner=@var{user}} option.
|
|
|
|
@opsummary{group-map}
|
|
@item --group-map=@var{file}
|
|
|
|
Read owner group translation map from @var{file}. This option allows to
|
|
translate only certain group names and/or UIDs. @xref{override}, for a
|
|
detailed description. When used together with @option{--group}
|
|
option, the latter affects only those files whose owner group is not listed
|
|
in the @var{file}.
|
|
|
|
This option does not affect extraction from archives.
|
|
|
|
@opsummary{gzip}
|
|
@opsummary{gunzip}
|
|
@opsummary{ungzip}
|
|
@item --gzip
|
|
@itemx --gunzip
|
|
@itemx --ungzip
|
|
@itemx -z
|
|
|
|
This option tells @command{tar} to read or write archives through
|
|
@command{gzip}, allowing @command{tar} to directly operate on several
|
|
kinds of compressed archives transparently. @xref{gzip}.
|
|
|
|
@opsummary{hard-dereference}
|
|
@item --hard-dereference
|
|
When creating an archive, dereference hard links and store the files
|
|
they refer to, instead of creating usual hard link members.
|
|
|
|
@xref{hard links}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{hole-detection}
|
|
@item --hole-detection=@var{method}
|
|
Use @var{method} to detect holes in sparse files. This option implies
|
|
@option{--sparse}. Valid methods are @samp{seek} and @samp{raw}.
|
|
Default is @samp{seek} with fallback to @samp{raw} when not
|
|
applicable. @xref{sparse}.
|
|
|
|
@opsummary{ignore-case}
|
|
@item --ignore-case
|
|
Ignore case when matching member or file names with
|
|
patterns. @xref{controlling pattern-matching}.
|
|
|
|
@opsummary{ignore-command-error}
|
|
@item --ignore-command-error
|
|
Ignore exit codes of subprocesses. @xref{Writing to an External Program}.
|
|
|
|
@opsummary{ignore-failed-read}
|
|
@item --ignore-failed-read
|
|
|
|
Do not exit unsuccessfully merely because reading failed.
|
|
@xref{Ignore Failed Read}.
|
|
|
|
@opsummary{ignore-zeros}
|
|
@item --ignore-zeros
|
|
@itemx -i
|
|
|
|
With this option, @command{tar} will ignore zeroed blocks in the
|
|
archive, which normally signals EOF. This option also suppresses
|
|
warnings about missing or incomplete zero blocks at the end of the
|
|
archive. @xref{Ignore Zeros}.
|
|
|
|
@opsummary{incremental}
|
|
@item --incremental
|
|
@itemx -G
|
|
|
|
Informs @command{tar} that it is working with an old
|
|
@acronym{GNU}-format incremental backup archive. It is intended
|
|
primarily for backwards compatibility only. @xref{Incremental Dumps},
|
|
for a detailed discussion of incremental archives.
|
|
|
|
@opsummary{index-file}
|
|
@item --index-file=@var{file}
|
|
|
|
Send verbose output to @var{file} instead of to standard output.
|
|
|
|
@opsummary{info-script}
|
|
@opsummary{new-volume-script}
|
|
@item --info-script=@var{command}
|
|
@itemx --new-volume-script=@var{command}
|
|
@itemx -F @var{command}
|
|
|
|
When @command{tar} is performing multi-tape backups, @var{command} is run
|
|
at the end of each tape. If it exits with nonzero status,
|
|
@command{tar} fails immediately. @xref{info-script}, for a detailed
|
|
discussion of this feature.
|
|
|
|
@opsummary{interactive}
|
|
@item --interactive
|
|
@itemx --confirmation
|
|
@itemx -w
|
|
|
|
Specifies that @command{tar} should ask the user for confirmation before
|
|
performing potentially destructive options, such as overwriting files.
|
|
@xref{interactive}.
|
|
|
|
@opsummary{keep-directory-symlink}
|
|
@item --keep-directory-symlink
|
|
|
|
This option changes the behavior of tar when it encounters a symlink
|
|
with the same name as the directory that it is about to extract. By
|
|
default, in this case tar would first remove the symlink and then
|
|
proceed extracting the directory.
|
|
|
|
The @option{--keep-directory-symlink} option disables this behavior
|
|
and instructs tar to follow symlinks to directories when extracting
|
|
from the archive.
|
|
|
|
It is mainly intended to provide compatibility with the Slackware
|
|
installation scripts.
|
|
|
|
@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.
|
|
|
|
@opsummary{keep-old-files}
|
|
@item --keep-old-files
|
|
@itemx -k
|
|
|
|
Do not overwrite existing files when extracting files from an
|
|
archive. Return error if such files exist. See also
|
|
@ref{--skip-old-files}.
|
|
|
|
@xref{Keep Old Files}.
|
|
|
|
@opsummary{label}
|
|
@item --label=@var{name}
|
|
@itemx -V @var{name}
|
|
|
|
When creating an archive, instructs @command{tar} to write @var{name}
|
|
as a name record in the archive. When extracting or listing archives,
|
|
@command{tar} will only operate on archives that have a label matching
|
|
the pattern specified in @var{name}. @xref{Tape Files}.
|
|
|
|
@opsummary{level}
|
|
@item --level=@var{n}
|
|
Force incremental backup of level @var{n}. As of @GNUTAR{} version
|
|
@value{VERSION}, the option @option{--level=0} truncates the snapshot
|
|
file, thereby forcing the level 0 dump. Other values of @var{n} are
|
|
effectively ignored. @xref{--level=0}, for details and examples.
|
|
|
|
The use of this option is valid only in conjunction with the
|
|
@option{--listed-incremental} option. @xref{Incremental Dumps},
|
|
for a detailed description.
|
|
|
|
@opsummary{listed-incremental}
|
|
@item --listed-incremental=@var{snapshot-file}
|
|
@itemx -g @var{snapshot-file}
|
|
|
|
During a @option{--create} operation, specifies that the archive that
|
|
@command{tar} creates is a new @acronym{GNU}-format incremental
|
|
backup, using @var{snapshot-file} to determine which files to backup.
|
|
With other operations, informs @command{tar} that the archive is in
|
|
incremental format. @xref{Incremental Dumps}.
|
|
|
|
@opsummary{lzip}
|
|
@item --lzip
|
|
|
|
This option tells @command{tar} to read or write archives through
|
|
@command{lzip}. @xref{gzip}.
|
|
|
|
@opsummary{lzma}
|
|
@item --lzma
|
|
|
|
This option tells @command{tar} to read or write archives through
|
|
@command{lzma}. @xref{gzip}.
|
|
|
|
@item --lzop
|
|
|
|
This option tells @command{tar} to read or write archives through
|
|
@command{lzop}. @xref{gzip}.
|
|
|
|
@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. @var{permissions} can be specified either as an octal
|
|
number or as symbolic permissions, like with
|
|
@command{chmod}. @xref{override}.
|
|
|
|
@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}.
|
|
|
|
When @command{--clamp-mtime} is also specified, files with
|
|
modification times earlier than @var{date} will retain their actual
|
|
modification times, and @var{date} will only be used for files whose
|
|
modification times are later than @var{date}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{new-volume-script}
|
|
@item --new-volume-script
|
|
|
|
(see @option{--info-script})
|
|
|
|
@opsummary{newer}
|
|
@item --newer=@var{date}
|
|
@itemx --after-date=@var{date}
|
|
@itemx -N
|
|
|
|
When creating an archive, @command{tar} will only add files that have changed
|
|
since @var{date}. If @var{date} begins with @samp{/} or @samp{.}, it
|
|
is taken to be the name of a file whose data modification time specifies
|
|
the date. @xref{after}.
|
|
|
|
@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). @xref{after}.
|
|
|
|
@opsummary{no-acls}
|
|
@item --no-acls
|
|
Disable the POSIX ACLs support. @xref{Extended File Attributes, acls}.
|
|
|
|
@opsummary{no-anchored}
|
|
@item --no-anchored
|
|
An exclude pattern can match any subsequence of the name's components.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{no-auto-compress}
|
|
@item --no-auto-compress
|
|
|
|
Disables automatic compressed format recognition based on the archive
|
|
suffix. @xref{--auto-compress}. @xref{gzip}.
|
|
|
|
@opsummary{no-check-device}
|
|
@item --no-check-device
|
|
Do not check device numbers when creating a list of modified files
|
|
for incremental archiving. @xref{device numbers}, for
|
|
a detailed description.
|
|
|
|
@opsummary{no-delay-directory-restore}
|
|
@item --no-delay-directory-restore
|
|
|
|
Modification times and permissions of extracted
|
|
directories are set when all files from this directory have been
|
|
extracted. This is the default.
|
|
@xref{Directory Modification Times and Permissions}.
|
|
|
|
@opsummary{no-ignore-case}
|
|
@item --no-ignore-case
|
|
Use case-sensitive matching.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{no-ignore-command-error}
|
|
@item --no-ignore-command-error
|
|
Print warnings about subprocesses that terminated with a nonzero exit
|
|
code. @xref{Writing to an External Program}.
|
|
|
|
@opsummary{no-null}
|
|
@item --no-null
|
|
|
|
If the @option{--null} option was given previously, this option
|
|
cancels its effect, so that any following @option{--files-from}
|
|
options will expect their file lists to be newline-terminated.
|
|
|
|
@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}).
|
|
|
|
@opsummary{no-recursion}
|
|
@item --no-recursion
|
|
|
|
With this option, @command{tar} will not recurse into directories.
|
|
@xref{recurse}.
|
|
|
|
@opsummary{no-same-owner}
|
|
@item --no-same-owner
|
|
@itemx -o
|
|
|
|
When extracting an archive, do not attempt to preserve the owner
|
|
specified in the @command{tar} archive. This the default behavior
|
|
for ordinary users.
|
|
|
|
@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.
|
|
|
|
@opsummary{no-seek}
|
|
@item --no-seek
|
|
|
|
The archive media does not support seeks to arbitrary
|
|
locations. Usually @command{tar} determines automatically whether
|
|
the archive can be seeked or not. Use this option to disable this
|
|
mechanism.
|
|
|
|
@opsummary{no-selinux}
|
|
@item --no-selinux
|
|
Disable SELinux context support. @xref{Extended File Attributes, SELinux}.
|
|
|
|
@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-verbatim-files-from}
|
|
@item --no-verbatim-files-from
|
|
|
|
Instructs @GNUTAR{} to treat each line read from a file list as if it
|
|
were supplied in the command line. I.e., leading and trailing
|
|
whitespace is removed and, if the result begins with a dash, it is
|
|
treated as a @GNUTAR{} command line option.
|
|
|
|
This is default behavior. This option is provided as a way to restore
|
|
it after @option{--verbatim-files-from} option.
|
|
|
|
It is implied by the @option{--no-null} option.
|
|
|
|
@xref{no-verbatim-files-from}.
|
|
|
|
@opsummary{no-wildcards}
|
|
@item --no-wildcards
|
|
Do not use wildcards.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{no-wildcards-match-slash}
|
|
@item --no-wildcards-match-slash
|
|
Wildcards do not match @samp{/}.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{no-xattrs}
|
|
@item --no-xattrs
|
|
Disable extended attributes support. @xref{Extended File Attributes, xattrs}.
|
|
|
|
@opsummary{null}
|
|
@item --null
|
|
|
|
When @command{tar} is using the @option{--files-from} option, this option
|
|
instructs @command{tar} to expect file names terminated with
|
|
@acronym{NUL}, and to process file names verbatim.
|
|
|
|
This means that @command{tar} correctly works with file names that
|
|
contain newlines or begin with a dash.
|
|
|
|
@xref{nul}.
|
|
|
|
See also @ref{verbatim-files-from}.
|
|
|
|
@opsummary{numeric-owner}
|
|
@item --numeric-owner
|
|
|
|
This option will notify @command{tar} that it should use numeric user
|
|
and group IDs when creating a @command{tar} file, rather than names.
|
|
@xref{Attributes}.
|
|
|
|
@item -o
|
|
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, it is a synonym for
|
|
@option{--old-archive}. This behavior is for compatibility
|
|
with previous versions of @GNUTAR{}, and will be
|
|
removed in future releases.
|
|
|
|
@xref{Changes}, for more information.
|
|
|
|
@opsummary{occurrence}
|
|
@item --occurrence[=@var{number}]
|
|
|
|
This option can be used in conjunction with one of the subcommands
|
|
@option{--delete}, @option{--diff}, @option{--extract} or
|
|
@option{--list} when a list of files is given either on the command
|
|
line or via @option{-T} option.
|
|
|
|
This option instructs @command{tar} to process only the @var{number}th
|
|
occurrence of each named file. @var{Number} defaults to 1, so
|
|
|
|
@smallexample
|
|
tar -x -f archive.tar --occurrence filename
|
|
@end smallexample
|
|
|
|
@noindent
|
|
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.
|
|
|
|
@opsummary{old-archive}
|
|
@item --old-archive
|
|
Synonym for @option{--format=v7}.
|
|
|
|
@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
|
|
directory.
|
|
|
|
@opsummary{one-top-level}
|
|
@item --one-top-level[=@var{dir}]
|
|
Tells @command{tar} to create a new directory beneath the extraction directory
|
|
(or the one passed to @option{-C}) and use it to guard against
|
|
tarbombs. In the absence of @var{dir} argument, the name of the new directory
|
|
will be equal to the base name of the archive (file name minus the
|
|
archive suffix, if recognized). Any member names that do not begin
|
|
with that directory name (after
|
|
transformations from @option{--transform} and
|
|
@option{--strip-components}) will be prefixed with it. Recognized
|
|
file name suffixes are @samp{.tar}, and any compression suffixes
|
|
recognizable by @xref{--auto-compress}.
|
|
|
|
@opsummary{overwrite}
|
|
@item --overwrite
|
|
|
|
Overwrite existing files and directory metadata when extracting files
|
|
from an archive. @xref{Overwrite Old Files}.
|
|
|
|
@opsummary{overwrite-dir}
|
|
@item --overwrite-dir
|
|
|
|
Overwrite the metadata of existing directories when extracting files
|
|
from an archive. @xref{Overwrite Old Files}.
|
|
|
|
@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} can specify a symbolic name, or a numeric
|
|
@acronym{ID}, or both as @var{name}:@var{id}.
|
|
@xref{override}.
|
|
|
|
This option does not affect extraction from archives. See also
|
|
@option{--owner-map}, below.
|
|
|
|
@opsummary{owner-map}
|
|
@item --owner-map=@var{file}
|
|
|
|
Read owner translation map from @var{file}. This option allows to
|
|
translate only certain owner names or UIDs. @xref{override}, for a
|
|
detailed description. When used together with @option{--owner}
|
|
option, the latter affects only those files whose owner is not listed
|
|
in the @var{file}.
|
|
|
|
This option does not affect extraction from archives.
|
|
|
|
@opsummary{pax-option}
|
|
@item --pax-option=@var{keyword-list}
|
|
This option enables creation of the archive in @acronym{POSIX.1-2001}
|
|
format (@pxref{posix}) and modifies the way @command{tar} handles the
|
|
extended header keywords. @var{Keyword-list} is a comma-separated
|
|
list of keyword options. @xref{PAX keywords}, for a detailed
|
|
discussion.
|
|
|
|
@opsummary{portability}
|
|
@item --portability
|
|
@itemx --old-archive
|
|
Synonym for @option{--format=v7}.
|
|
|
|
@opsummary{posix}
|
|
@item --posix
|
|
Same as @option{--format=posix}.
|
|
|
|
@opsummary{preserve-order}
|
|
@item --preserve-order
|
|
|
|
(See @option{--same-order}; @pxref{Reading}.)
|
|
|
|
@opsummary{preserve-permissions}
|
|
@opsummary{same-permissions}
|
|
@item --preserve-permissions
|
|
@itemx --same-permissions
|
|
@itemx -p
|
|
|
|
When @command{tar} is extracting an archive, it normally subtracts the
|
|
users' umask from the permissions specified in the archive and uses
|
|
that number as the permissions to create the destination file.
|
|
Specifying this option instructs @command{tar} that it should use the
|
|
permissions directly from the archive. @xref{Setting Access Permissions}.
|
|
|
|
@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}).
|
|
|
|
@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:
|
|
@code{literal}, @code{shell}, @code{shell-always}, @code{c},
|
|
@code{escape}, @code{locale}, and @code{clocale}. Default quoting
|
|
style is @code{escape}, unless overridden while configuring the
|
|
package.
|
|
|
|
@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}.
|
|
|
|
@opsummary{record-size}
|
|
@item --record-size=@var{size}[@var{suf}]
|
|
|
|
Instructs @command{tar} to use @var{size} bytes per record when accessing the
|
|
archive. The argument can be suffixed with a @dfn{size suffix}, e.g.
|
|
@option{--record-size=10K} for 10 Kilobytes. @xref{size-suffixes},
|
|
for a list of valid suffixes. @xref{Blocking Factor}, for a detailed
|
|
description of this option.
|
|
|
|
@opsummary{recursion}
|
|
@item --recursion
|
|
|
|
With this option, @command{tar} recurses into directories (default).
|
|
@xref{recurse}.
|
|
|
|
@opsummary{recursive-unlink}
|
|
@item --recursive-unlink
|
|
|
|
Remove existing
|
|
directory hierarchies before extracting directories of the same name
|
|
from the archive. @xref{Recursive Unlink}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{restrict}
|
|
@item --restrict
|
|
|
|
Disable use of some potentially harmful @command{tar} options.
|
|
Currently this option disables shell invocation from multi-volume menu
|
|
(@pxref{Using Multiple Tapes}).
|
|
|
|
@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}).
|
|
|
|
@opsummary{rsh-command}
|
|
@item --rsh-command=@var{cmd}
|
|
|
|
Notifies @command{tar} that is should use @var{cmd} to communicate with remote
|
|
devices. @xref{Device}.
|
|
|
|
@opsummary{same-order}
|
|
@item --same-order
|
|
@itemx --preserve-order
|
|
@itemx -s
|
|
|
|
This option is an optimization for @command{tar} when running on machines with
|
|
small amounts of memory. It informs @command{tar} that the list of file
|
|
arguments has already been sorted to match the order of files in the
|
|
archive. @xref{Reading}.
|
|
|
|
@opsummary{same-owner}
|
|
@item --same-owner
|
|
|
|
When extracting an archive, @command{tar} will attempt to preserve the owner
|
|
specified in the @command{tar} archive with this option present.
|
|
This is the default behavior for the superuser; this option has an
|
|
effect only for ordinary users. @xref{Attributes}.
|
|
|
|
@opsummary{same-permissions}
|
|
@item --same-permissions
|
|
|
|
(See @option{--preserve-permissions}; @pxref{Setting Access Permissions}.)
|
|
|
|
@opsummary{seek}
|
|
@item --seek
|
|
@itemx -n
|
|
|
|
Assume that the archive media supports seeks to arbitrary
|
|
locations. Usually @command{tar} determines automatically whether
|
|
the archive can be seeked or not. This option is intended for use
|
|
in cases when such recognition fails. It takes effect only if the
|
|
archive is open for reading (e.g. with @option{--list} or
|
|
@option{--extract} options).
|
|
|
|
@opsummary{selinux}
|
|
@item --selinux
|
|
Enable the SELinux context support.
|
|
@xref{Extended File Attributes, selinux}.
|
|
|
|
@opsummary{show-defaults}
|
|
@item --show-defaults
|
|
|
|
Displays the default options used by @command{tar} and exits
|
|
successfully. This option is intended for use in shell scripts.
|
|
Here is an example of what you can see using this option:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --show-defaults}
|
|
--format=gnu -f- -b20 --quoting-style=escape
|
|
--rmt-command=/usr/libexec/rmt --rsh-command=/usr/bin/rsh
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice, that this option outputs only one line. The example output
|
|
above has been split to fit page boundaries. @xref{defaults}.
|
|
|
|
@opsummary{show-omitted-dirs}
|
|
@item --show-omitted-dirs
|
|
|
|
Instructs @command{tar} to mention the directories it is skipping when
|
|
operating on a @command{tar} archive. @xref{show-omitted-dirs}.
|
|
|
|
@opsummary{show-snapshot-field-ranges}
|
|
@item --show-snapshot-field-ranges
|
|
|
|
Displays the range of values allowed by this version of @command{tar}
|
|
for each field in the snapshot file, then exits successfully.
|
|
@xref{Snapshot Files}.
|
|
|
|
@opsummary{show-transformed-names}
|
|
@opsummary{show-stored-names}
|
|
@item --show-transformed-names
|
|
@itemx --show-stored-names
|
|
|
|
Display file or member names after applying any transformations
|
|
(@pxref{transform}). In particular, when used in conjunction with one of
|
|
the archive creation operations it instructs @command{tar} to list the
|
|
member names stored in the archive, as opposed to the actual file
|
|
names. @xref{listing member and file names}.
|
|
|
|
@opsummary{skip-old-files}
|
|
@item --skip-old-files
|
|
|
|
Do not overwrite existing files when extracting files from an
|
|
archive. @xref{Keep Old Files}.
|
|
|
|
This option differs from @option{--keep-old-files} in that it does not
|
|
treat such files as an error, instead it just silently avoids
|
|
overwriting them.
|
|
|
|
The @option{--warning=existing-file} option can be used together with
|
|
this option to produce warning messages about existing old files
|
|
(@pxref{warnings}).
|
|
|
|
@opsummary{sort}
|
|
@item --sort=@var{order}
|
|
Specify the directory sorting order when reading directories.
|
|
@var{Order} may be one of the following:
|
|
|
|
@table @samp
|
|
@item none
|
|
No directory sorting is performed. This is the default.
|
|
|
|
@item name
|
|
Sort the directory entries on name. The operating system may deliver
|
|
directory entries in a more or less random order, and sorting them
|
|
makes archive creation reproducible.
|
|
|
|
@item inode
|
|
Sort the directory entries on inode number. Sorting directories on
|
|
inode number may reduce the amount of disk seek operations when
|
|
creating an archive for some file systems.
|
|
|
|
@end table
|
|
|
|
@opsummary{sparse}
|
|
@item --sparse
|
|
@itemx -S
|
|
|
|
Invokes a @acronym{GNU} extension when adding files to an archive that handles
|
|
sparse files efficiently. @xref{sparse}.
|
|
|
|
@opsummary{sparse-version}
|
|
@item --sparse-version=@var{version}
|
|
|
|
Specifies 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}
|
|
|
|
This option affects extraction only; @command{tar} will skip extracting
|
|
files in the archive until it finds one that matches @var{name}.
|
|
@xref{Scarce}.
|
|
|
|
@opsummary{strip-components}
|
|
@item --strip-components=@var{number}
|
|
Strip given @var{number} of leading components from file names before
|
|
extraction. For example, if archive @file{archive.tar} contained
|
|
@file{/some/file/name}, then running
|
|
|
|
@smallexample
|
|
tar --extract --file archive.tar --strip-components=2
|
|
@end smallexample
|
|
|
|
@noindent
|
|
would extract this file to file @file{name}.
|
|
|
|
@xref{transform}.
|
|
|
|
@opsummary{suffix}
|
|
@item --suffix=@var{suffix}
|
|
|
|
Alters the suffix @command{tar} uses when backing up files from the default
|
|
@samp{~}. @xref{backup}.
|
|
|
|
@opsummary{tape-length}
|
|
@item --tape-length=@var{num}[@var{suf}]
|
|
@itemx -L @var{num}[@var{suf}]
|
|
|
|
Specifies the length of tapes that @command{tar} is writing as being
|
|
@w{@var{num} x 1024} bytes long. If optional @var{suf} is given, it
|
|
specifies a multiplicative factor to be used instead of 1024. For
|
|
example, @samp{-L2M} means 2 megabytes. @xref{size-suffixes}, for a
|
|
list of allowed suffixes. @xref{Using Multiple Tapes}, for a detailed
|
|
discussion of this option.
|
|
|
|
@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}.
|
|
|
|
@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}.
|
|
|
|
@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}.
|
|
|
|
@opsummary{totals}
|
|
@item --totals[=@var{signo}]
|
|
|
|
Displays the total number of bytes transferred when processing an
|
|
archive. If an argument is given, these data are displayed on
|
|
request, when signal @var{signo} is delivered to @command{tar}.
|
|
@xref{totals}.
|
|
|
|
@opsummary{touch}
|
|
@item --touch
|
|
@itemx -m
|
|
|
|
Sets the data modification time of extracted files to the extraction time,
|
|
rather than the data modification time stored in the archive.
|
|
@xref{Data Modification Times}.
|
|
|
|
@opsummary{transform}
|
|
@opsummary{xform}
|
|
@item --transform=@var{sed-expr}
|
|
@itemx --xform=@var{sed-expr}
|
|
Transform file or member names using @command{sed} replacement expression
|
|
@var{sed-expr}. For example,
|
|
|
|
@smallexample
|
|
$ @kbd{tar cf archive.tar --transform 's,^\./,usr/,' .}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
will add to @file{archive} files from the current working directory,
|
|
replacing initial @samp{./} prefix with @samp{usr/}. For the detailed
|
|
discussion, @xref{transform}.
|
|
|
|
To see transformed member names in verbose listings, use
|
|
@option{--show-transformed-names} option
|
|
(@pxref{show-transformed-names}).
|
|
|
|
@opsummary{uncompress}
|
|
@item --uncompress
|
|
|
|
(See @option{--compress}, @pxref{gzip})
|
|
|
|
@opsummary{ungzip}
|
|
@item --ungzip
|
|
|
|
(See @option{--gzip}, @pxref{gzip})
|
|
|
|
@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}.
|
|
|
|
@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}
|
|
@itemx -I=@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}.
|
|
|
|
@opsummary{utc}
|
|
@item --utc
|
|
|
|
Display file modification dates in @acronym{UTC}. This option implies
|
|
@option{--verbose}.
|
|
|
|
@opsummary{verbatim-files-from}
|
|
@item --verbatim-files-from
|
|
|
|
Instructs @GNUTAR{} to treat each line read from a file list as a file
|
|
name, even if it starts with a dash.
|
|
|
|
File lists are supplied with the @option{--files-from} (@option{-T})
|
|
option. By default, each line read from a file list is first trimmed
|
|
off the leading and trailing whitespace and, if the result begins with
|
|
a dash, it is treated as a @GNUTAR{} command line option.
|
|
|
|
Use the @option{--verbatim-files-from} option to disable this special
|
|
handling. This facilitates the use of @command{tar} with file lists
|
|
created by @command{file} command.
|
|
|
|
This option affects all @option{--files-from} options that occur after
|
|
it in the command line. Its effect is reverted by the
|
|
@option{--no-verbatim-files-from} option.
|
|
|
|
This option is implied by the @option{--null} option.
|
|
|
|
@xref{verbatim-files-from}.
|
|
|
|
@opsummary{verbose}
|
|
@item --verbose
|
|
@itemx -v
|
|
|
|
Specifies that @command{tar} should be more verbose about the
|
|
operations it is performing. This option can be specified multiple
|
|
times for some operations to increase the amount of information displayed.
|
|
@xref{verbose}.
|
|
|
|
@opsummary{verify}
|
|
@item --verify
|
|
@itemx -W
|
|
|
|
Verifies that the archive was correctly written when creating an
|
|
archive. @xref{verify}.
|
|
|
|
@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}.
|
|
|
|
@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 it is working in
|
|
@var{file}. @xref{volno-file}.
|
|
|
|
@opsummary{warning}
|
|
@item --warning=@var{keyword}
|
|
|
|
Enable or disable warning messages identified by @var{keyword}. The
|
|
messages are suppressed if @var{keyword} is prefixed with @samp{no-}.
|
|
@xref{warnings}.
|
|
|
|
@opsummary{wildcards}
|
|
@item --wildcards
|
|
Use wildcards when matching member names with patterns.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{wildcards-match-slash}
|
|
@item --wildcards-match-slash
|
|
Wildcards match @samp{/}.
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@opsummary{xattrs}
|
|
@item --xattrs
|
|
Enable extended attributes support. @xref{Extended File Attributes, xattrs}.
|
|
|
|
@opsummary{xattrs-exclude}
|
|
@item --xattrs-exclude=@var{pattern}
|
|
Specify exclude pattern for xattr keys.
|
|
@xref{Extended File Attributes, xattrs-exclude}.
|
|
|
|
@opsummary{xattrs-include}
|
|
@item --xattrs-include=@var{pattern}.
|
|
Specify include pattern for xattr keys. @var{pattern} is a globbing
|
|
pattern, e.g. @samp{--xattrs-include='user.*'} to include
|
|
only attributes from the user namespace.
|
|
@xref{Extended File Attributes, xattrs-include}.
|
|
|
|
@opsummary{xz}
|
|
@item --xz
|
|
@itemx -J
|
|
Use @command{xz} for compressing or decompressing the archives. @xref{gzip}.
|
|
|
|
@item --zstd
|
|
Use @command{zstd} for compressing or decompressing the archives. @xref{gzip}.
|
|
|
|
@end table
|
|
|
|
@node Short Option Summary
|
|
@subsection Short Options Cross Reference
|
|
|
|
Here is an alphabetized list of all of the short option forms, matching
|
|
them with the equivalent long option.
|
|
|
|
@multitable @columnfractions 0.20 0.80
|
|
@headitem Short Option @tab Reference
|
|
|
|
@item -A @tab @ref{--concatenate}.
|
|
|
|
@item -B @tab @ref{--read-full-records}.
|
|
|
|
@item -C @tab @ref{--directory}.
|
|
|
|
@item -F @tab @ref{--info-script}.
|
|
|
|
@item -G @tab @ref{--incremental}.
|
|
|
|
@item -J @tab @ref{--xz}.
|
|
|
|
@item -K @tab @ref{--starting-file}.
|
|
|
|
@item -L @tab @ref{--tape-length}.
|
|
|
|
@item -M @tab @ref{--multi-volume}.
|
|
|
|
@item -N @tab @ref{--newer}.
|
|
|
|
@item -O @tab @ref{--to-stdout}.
|
|
|
|
@item -P @tab @ref{--absolute-names}.
|
|
|
|
@item -R @tab @ref{--block-number}.
|
|
|
|
@item -S @tab @ref{--sparse}.
|
|
|
|
@item -T @tab @ref{--files-from}.
|
|
|
|
@item -U @tab @ref{--unlink-first}.
|
|
|
|
@item -V @tab @ref{--label}.
|
|
|
|
@item -W @tab @ref{--verify}.
|
|
|
|
@item -X @tab @ref{--exclude-from}.
|
|
|
|
@item -Z @tab @ref{--compress}.
|
|
|
|
@item -b @tab @ref{--blocking-factor}.
|
|
|
|
@item -c @tab @ref{--create}.
|
|
|
|
@item -d @tab @ref{--compare}.
|
|
|
|
@item -f @tab @ref{--file}.
|
|
|
|
@item -g @tab @ref{--listed-incremental}.
|
|
|
|
@item -h @tab @ref{--dereference}.
|
|
|
|
@item -i @tab @ref{--ignore-zeros}.
|
|
|
|
@item -j @tab @ref{--bzip2}.
|
|
|
|
@item -k @tab @ref{--keep-old-files}.
|
|
|
|
@item -l @tab @ref{--check-links}.
|
|
|
|
@item -m @tab @ref{--touch}.
|
|
|
|
@item -o @tab When extracting, same as @ref{--no-same-owner}. When creating,
|
|
-- @ref{--old-archive}.
|
|
|
|
The latter usage is deprecated. It is retained for compatibility with
|
|
the earlier versions of @GNUTAR{}. In future releases
|
|
@option{-o} will be equivalent to @option{--no-same-owner} only.
|
|
|
|
@item -p @tab @ref{--preserve-permissions}.
|
|
|
|
@item -r @tab @ref{--append}.
|
|
|
|
@item -s @tab @ref{--same-order}.
|
|
|
|
@item -t @tab @ref{--list}.
|
|
|
|
@item -u @tab @ref{--update}.
|
|
|
|
@item -v @tab @ref{--verbose}.
|
|
|
|
@item -w @tab @ref{--interactive}.
|
|
|
|
@item -x @tab @ref{--extract}.
|
|
|
|
@item -z @tab @ref{--gzip}.
|
|
|
|
@end multitable
|
|
|
|
@node Position-Sensitive Options
|
|
@subsection Position-Sensitive Options
|
|
|
|
Some @GNUTAR{} options can be used multiple times in the same
|
|
invocation and affect all arguments that appear after them. These are
|
|
options that control how file names are selected and what kind of
|
|
pattern matching is used.
|
|
|
|
The most obvious example is the @option{-C} option. It instructs @command{tar}
|
|
to change to the directory given as its argument prior to processing
|
|
the rest of command line (@pxref{directory}). Thus, in the following
|
|
command:
|
|
|
|
@example
|
|
@kbd{tar -c -f a.tar -C /etc passwd -C /var log spool}
|
|
@end example
|
|
|
|
@noindent
|
|
the file @file{passwd} will be searched in the directory @file{/etc},
|
|
and files @file{log} and @file{spool} -- in @file{/var}.
|
|
|
|
These options can also be used in a file list supplied with the
|
|
@option{--files-from} (@option{-T}) option (@pxref{files}). In that
|
|
case they affect all files (patterns) appearing in that file after
|
|
them and remain in effect for any arguments processed after that file.
|
|
For example, if the file @file{list.txt} contained:
|
|
|
|
@example
|
|
README
|
|
-C src
|
|
main.c
|
|
@end example
|
|
|
|
@noindent
|
|
and @command{tar} were invoked as follows:
|
|
|
|
@example
|
|
@kbd{tar -c -f a.tar -T list.txt Makefile}
|
|
@end example
|
|
|
|
@noindent
|
|
then the file @file{README} would be looked up in the current working
|
|
directory, and files @file{main.c} and @file{Makefile} would be looked
|
|
up in the directory @file{src}.
|
|
|
|
Many options can be prefixed with @option{--no-} to cancel the effect
|
|
of the original option.
|
|
|
|
For example, the @option{--recursion} option controls whether to
|
|
recurse in the subdirectories. It's counterpart
|
|
@option{--no-recursion} disables this. Consider the command below. It will
|
|
store in the archive the directory @file{/usr} with all files and
|
|
directories that are located in it as well as any files and
|
|
directories in @file{/var}, without recursing into them@footnote{The @option{--recursion}
|
|
option is the default and is used here for clarity. The same example
|
|
can be written as:
|
|
|
|
@example
|
|
tar -cf a.tar /usr --no-recursion /var/*
|
|
@end example
|
|
}:
|
|
|
|
@example
|
|
tar -cf a.tar --recursion /usr --no-recursion /var/*
|
|
@end example
|
|
|
|
During archive creation, @GNUTAR{} keeps track of positional options
|
|
used and arguments affected by them. If it finds out that any such
|
|
options are used in an obviously erroneous way, the fact is reported
|
|
and exit code is set to 2. E.g.:
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{tar -cf a.tar . --exclude '*.o'}
|
|
tar: The following options were used after any non-optional
|
|
arguments in archive create or update mode. These options are
|
|
positional and affect only arguments that follow them. Please,
|
|
rearrange them properly.
|
|
tar: --exclude '*.o' has no effect
|
|
tar: Exiting with failure status due to previous errors
|
|
@end group
|
|
@end example
|
|
|
|
The following table summarizes all position-sensitive options.
|
|
|
|
@table @option
|
|
@item --directory=@var{dir}
|
|
@itemx -C @var{dir}
|
|
@xref{directory}.
|
|
|
|
@item --null
|
|
@itemx --no-null
|
|
@xref{nul}.
|
|
|
|
@item --unquote
|
|
@itemx --no-unquote
|
|
@xref{input name quoting}.
|
|
|
|
@item --verbatim-files-from
|
|
@itemx --no-verbatim-files-from
|
|
@xref{verbatim-files-from}.
|
|
|
|
@item --recursion
|
|
@itemx --no-recursion
|
|
@xref{recurse}.
|
|
|
|
@item --anchored
|
|
@itemx --no-anchored
|
|
@xref{anchored patterns}.
|
|
|
|
@item --ignore-case
|
|
@itemx --no-ignore-case
|
|
@xref{case-insensitive matches}.
|
|
|
|
@item --wildcards
|
|
@itemx --no-wildcards
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@item --wildcards-match-slash
|
|
@itemx --no-wildcards-match-slash
|
|
@xref{controlling pattern-matching}.
|
|
|
|
@item --exclude
|
|
@xref{exclude}.
|
|
|
|
@item --exclude-from
|
|
@itemx -X
|
|
@itemx --exclude-caches
|
|
@itemx --exclude-caches-under
|
|
@itemx --exclude-caches-all
|
|
@itemx --exclude-tag
|
|
@itemx --exclude-ignore
|
|
@itemx --exclude-ignore-recursive
|
|
@itemx --exclude-tag-under
|
|
@itemx --exclude-tag-all
|
|
@itemx --exclude-vcs
|
|
@itemx --exclude-vcs-ignores
|
|
@itemx --exclude-backups
|
|
@xref{exclude}.
|
|
@end table
|
|
|
|
@node help
|
|
@section @GNUTAR{} documentation
|
|
|
|
@cindex Getting program version number
|
|
@opindex version
|
|
@cindex Version of the @command{tar} program
|
|
Being careful, the first thing is really checking that you are using
|
|
@GNUTAR{}, indeed. The @option{--version} option
|
|
causes @command{tar} to print information about its name, version,
|
|
origin and legal status, all on standard output, and then exit
|
|
successfully. For example, @w{@samp{tar --version}} might print:
|
|
|
|
@smallexample
|
|
tar (GNU tar) @value{VERSION}
|
|
Copyright (C) 2013-2020 Free Software Foundation, Inc.
|
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
|
|
This is free software: you are free to change and redistribute it.
|
|
There is NO WARRANTY, to the extent permitted by law.
|
|
|
|
Written by John Gilmore and Jay Fenlason.
|
|
@end smallexample
|
|
|
|
@noindent
|
|
The first occurrence of @samp{tar} in the result above is the program
|
|
name in the package (for example, @command{rmt} is another program),
|
|
while the second occurrence of @samp{tar} is the name of the package
|
|
itself, containing possibly many programs. The package is currently
|
|
named @samp{tar}, after the name of the main program it
|
|
contains@footnote{There are plans to merge the @command{cpio} and
|
|
@command{tar} packages into a single one which would be called
|
|
@code{paxutils}. So, who knows if, one of this days, the
|
|
@option{--version} would not output @w{@samp{tar (@acronym{GNU}
|
|
paxutils) 3.2}}.}.
|
|
|
|
@cindex Obtaining help
|
|
@cindex Listing all @command{tar} options
|
|
@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{}
|
|
has a short help feature, triggerable through the
|
|
@option{--help} option. By using this option, @command{tar} will
|
|
print a usage message listing all available options on standard
|
|
output, then exit successfully, without doing anything else and
|
|
ignoring all other options. Even if this is only a brief summary, it
|
|
may be several screens long. So, if you are not using some kind of
|
|
scrollable window, you might prefer to use something like:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --help | less}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
presuming, here, that you like using @command{less} for a pager. Other
|
|
popular pagers are @command{more} and @command{pg}. If you know about some
|
|
@var{keyword} which interests you and do not want to read all the
|
|
@option{--help} output, another common idiom is doing:
|
|
|
|
@smallexample
|
|
tar --help | grep @var{keyword}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
for getting only the pertinent lines. Notice, however, that some
|
|
@command{tar} options have long description lines and the above
|
|
command will list only the first of them.
|
|
|
|
The exact look of the option summary displayed by @kbd{tar --help} is
|
|
configurable. @xref{Configuring Help Summary}, for a detailed description.
|
|
|
|
@opindex usage
|
|
If you only wish to check the spelling of an option, running @kbd{tar
|
|
--usage} may be a better choice. This will display a terse list of
|
|
@command{tar} options without accompanying explanations.
|
|
|
|
The short help output is quite succinct, and you might have to get
|
|
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 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
|
|
usual way (contact your local guru to know how). If @GNUTAR{}
|
|
has been conveniently installed at your place, this
|
|
manual is also available in interactive, hypertextual form as an Info
|
|
file. Just call @w{@samp{info tar}} or, if you do not have the
|
|
@command{info} program handy, use the Info reader provided within
|
|
@acronym{GNU} Emacs, calling @samp{tar} from the main Info menu.
|
|
|
|
There is currently no @code{man} page for @GNUTAR{}.
|
|
If you observe such a @code{man} page on the system you are running,
|
|
either it does not belong to @GNUTAR{}, or it has not
|
|
been produced by @acronym{GNU}. Some package maintainers convert
|
|
@kbd{tar --help} output to a man page, using @command{help2man}. In
|
|
any case, please bear in mind that the authoritative source of
|
|
information about @GNUTAR{} is this Texinfo documentation.
|
|
|
|
@node defaults
|
|
@section Obtaining @GNUTAR{} default values
|
|
|
|
@opindex show-defaults
|
|
@GNUTAR{} has some predefined defaults that are used when you do not
|
|
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 --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
|
|
output as the archive, if no @option{--file} option has been given
|
|
(@pxref{file tutorial}), the default blocking factor is 20
|
|
(@pxref{Blocking Factor}). It also shows the default locations where
|
|
@command{tar} will look for @command{rmt} and @command{rsh} binaries.
|
|
|
|
@node verbose
|
|
@section Checking @command{tar} progress
|
|
|
|
Typically, @command{tar} performs most operations without reporting any
|
|
information to the user except error messages. When using @command{tar}
|
|
with many options, particularly ones with complicated or
|
|
difficult-to-predict behavior, it is possible to make serious mistakes.
|
|
@command{tar} provides several options that make observing @command{tar}
|
|
easier. These options cause @command{tar} to print information as it
|
|
progresses in its job, and you might want to use them just for being
|
|
more careful about what is going on, or merely for entertaining
|
|
yourself. If you have encountered a problem when operating on an
|
|
archive, however, you may need more information than just an error
|
|
message in order to solve the problem. The following options can be
|
|
helpful diagnostic tools.
|
|
|
|
@cindex Verbose operation
|
|
@opindex verbose
|
|
Normally, the @option{--list} (@option{-t}) command to list an archive
|
|
prints just the file names (one per line) and the other commands are
|
|
silent. When used with most operations, the @option{--verbose}
|
|
(@option{-v}) option causes @command{tar} to print the name of each
|
|
file or archive member as it is processed. This and the other options
|
|
which make @command{tar} print status information can be useful in
|
|
monitoring @command{tar}.
|
|
|
|
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
|
|
(@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}
|
|
$ @kbd{tar xvvf archive.tar}
|
|
@end smallexample
|
|
|
|
Verbose output appears on the standard output except when an archive is
|
|
being written to the standard output, as with @samp{tar --create
|
|
--file=- --verbose} (@samp{tar cvf -}, or even @samp{tar cv}---if the
|
|
installer let standard output be the default archive). In that case
|
|
@command{tar} writes verbose output to the standard error stream.
|
|
|
|
If @option{--index-file=@var{file}} is specified, @command{tar} sends
|
|
verbose output to @var{file} rather than to standard output or standard
|
|
error.
|
|
|
|
@anchor{totals}
|
|
@cindex Obtaining total status information
|
|
@opindex totals
|
|
The @option{--totals} option causes @command{tar} to print on the
|
|
standard error the total amount of bytes transferred when processing
|
|
an archive. When creating or appending to an archive, this option
|
|
prints the number of bytes written to the archive and the average
|
|
speed at which they have been written, e.g.:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar -c -f archive.tar --totals /home}
|
|
Total bytes written: 7924664320 (7.4GiB, 85MiB/s)
|
|
@end group
|
|
@end smallexample
|
|
|
|
When reading an archive, this option displays the number of bytes
|
|
read:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar -x -f archive.tar --totals}
|
|
Total bytes read: 7924664320 (7.4GiB, 95MiB/s)
|
|
@end group
|
|
@end smallexample
|
|
|
|
Finally, when deleting from an archive, the @option{--totals} option
|
|
displays both numbers plus number of bytes removed from the archive:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --delete -f foo.tar --totals --wildcards '*~'}
|
|
Total bytes read: 9543680 (9.2MiB, 201MiB/s)
|
|
Total bytes written: 3829760 (3.7MiB, 81MiB/s)
|
|
Total bytes deleted: 1474048
|
|
@end group
|
|
@end smallexample
|
|
|
|
You can also obtain this information on request. When
|
|
@option{--totals} is used with an argument, this argument is
|
|
interpreted as a symbolic name of a signal, upon delivery of which the
|
|
statistics is to be printed:
|
|
|
|
@table @option
|
|
@item --totals=@var{signo}
|
|
Print statistics upon delivery of signal @var{signo}. Valid arguments
|
|
are: @code{SIGHUP}, @code{SIGQUIT}, @code{SIGINT}, @code{SIGUSR1} and
|
|
@code{SIGUSR2}. Shortened names without @samp{SIG} prefix are also
|
|
accepted.
|
|
@end table
|
|
|
|
Both forms of @option{--totals} option can be used simultaneously.
|
|
Thus, @kbd{tar -x --totals --totals=USR1} instructs @command{tar} to
|
|
extract all members from its default archive and print statistics
|
|
after finishing the extraction, as well as when receiving signal
|
|
@code{SIGUSR1}.
|
|
|
|
@anchor{Progress information}
|
|
@cindex Progress information
|
|
The @option{--checkpoint} option prints an occasional message
|
|
as @command{tar} reads or writes the archive. It is designed for
|
|
those who don't need the more detailed (and voluminous) output of
|
|
@option{--block-number} (@option{-R}), but do want visual confirmation
|
|
that @command{tar} is actually making forward progress. By default it
|
|
prints a message each 10 records read or written. This can be changed
|
|
by giving it a numeric argument after an equal sign:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=1000} /var
|
|
tar: Write checkpoint 1000
|
|
tar: Write checkpoint 2000
|
|
tar: Write checkpoint 3000
|
|
@end smallexample
|
|
|
|
This example shows the default checkpoint message used by
|
|
@command{tar}. If you place a dot immediately after the equal
|
|
sign, it will print a @samp{.} at each checkpoint@footnote{This is
|
|
actually a shortcut for @option{--checkpoint=@var{n}
|
|
--checkpoint-action=dot}. @xref{checkpoints, dot}.}. For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=.1000} /var
|
|
...
|
|
@end smallexample
|
|
|
|
The @option{--checkpoint} option provides a flexible mechanism for
|
|
executing arbitrary actions upon hitting checkpoints, see the next
|
|
section (@pxref{checkpoints}), for more information on it.
|
|
|
|
@opindex show-omitted-dirs
|
|
@anchor{show-omitted-dirs}
|
|
The @option{--show-omitted-dirs} option, when reading an archive---with
|
|
@option{--list} or @option{--extract}, for example---causes a message
|
|
to be printed for each directory in the archive which is skipped.
|
|
This happens regardless of the reason for skipping: the directory might
|
|
not have been named on the command line (implicitly or explicitly),
|
|
it might be excluded by the use of the
|
|
@option{--exclude=@var{pattern}} option, or some other reason.
|
|
|
|
@opindex block-number
|
|
@cindex Block number where error occurred
|
|
@anchor{block-number}
|
|
If @option{--block-number} (@option{-R}) is used, @command{tar} prints, along with
|
|
every message it would normally produce, the block number within the
|
|
archive where the message was triggered. Also, supplementary messages
|
|
are triggered when reading blocks full of NULs, or when hitting end of
|
|
file on the archive. As of now, if the archive is properly terminated
|
|
with a NUL block, the reading of the file may stop before end of file
|
|
is met, so the position of end of file will not usually show when
|
|
@option{--block-number} (@option{-R}) is used. Note that @GNUTAR{}
|
|
drains the archive before exiting when reading the
|
|
archive from a pipe.
|
|
|
|
@cindex Error message, block number of
|
|
This option is especially useful when reading damaged archives, since
|
|
it helps pinpoint the damaged sections. It can also be used with
|
|
@option{--list} (@option{-t}) when listing a file-system backup tape, allowing you to
|
|
choose among several backup tapes when retrieving a file later, in
|
|
favor of the tape where the file appears earliest (closest to the
|
|
front of the tape). @xref{backup}.
|
|
|
|
@node checkpoints
|
|
@section Checkpoints
|
|
@cindex checkpoints, defined
|
|
@opindex checkpoint
|
|
@opindex checkpoint-action
|
|
|
|
A @dfn{checkpoint} is a moment of time before writing @var{n}th record to
|
|
the archive (a @dfn{write checkpoint}), or before reading @var{n}th record
|
|
from the archive (a @dfn{read checkpoint}). Checkpoints allow to
|
|
periodically execute arbitrary actions.
|
|
|
|
The checkpoint facility is enabled using the following option:
|
|
|
|
@table @option
|
|
@xopindex{checkpoint, defined}
|
|
@item --checkpoint[=@var{n}]
|
|
Schedule checkpoints before writing or reading each @var{n}th record.
|
|
The default value for @var{n} is 10.
|
|
@end table
|
|
|
|
A list of arbitrary @dfn{actions} can be executed at each checkpoint.
|
|
These actions include: pausing, displaying textual messages, and
|
|
executing arbitrary external programs. Actions are defined using
|
|
the @option{--checkpoint-action} option.
|
|
|
|
@table @option
|
|
@xopindex{checkpoint-action, defined}
|
|
@item --checkpoint-action=@var{action}
|
|
Execute an @var{action} at each checkpoint.
|
|
@end table
|
|
|
|
@cindex @code{echo}, checkpoint action
|
|
The simplest value of @var{action} is @samp{echo}. It instructs
|
|
@command{tar} to display the default message on the standard error
|
|
stream upon arriving at each checkpoint. The default message is (in
|
|
@acronym{POSIX} locale) @samp{Write checkpoint @var{n}}, for write
|
|
checkpoints, and @samp{Read checkpoint @var{n}}, for read checkpoints.
|
|
Here, @var{n} represents ordinal number of the checkpoint.
|
|
|
|
In another locales, translated versions of this message are used.
|
|
|
|
This is the default action, so running:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=echo} /var
|
|
@end smallexample
|
|
|
|
@noindent
|
|
is equivalent to:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=1000} /var
|
|
@end smallexample
|
|
|
|
The @samp{echo} action also allows to supply a customized message.
|
|
You do so by placing an equals sign and the message right after it,
|
|
e.g.:
|
|
|
|
@smallexample
|
|
--checkpoint-action="echo=Hit %s checkpoint #%u"
|
|
@end smallexample
|
|
|
|
The @samp{%s} and @samp{%u} in the above example are
|
|
@dfn{format specifiers}. The @samp{%s} specifier is replaced with
|
|
the @dfn{type} of the checkpoint: @samp{write} or
|
|
@samp{read} (or a corresponding translated version in locales other
|
|
than @acronym{POSIX}). The @samp{%u} specifier is replaced with
|
|
the ordinal number of the checkpoint. Thus, the above example could
|
|
produce the following output when used with the @option{--create}
|
|
option:
|
|
|
|
@smallexample
|
|
tar: Hit write checkpoint #10
|
|
tar: Hit write checkpoint #20
|
|
tar: Hit write checkpoint #30
|
|
@end smallexample
|
|
|
|
The complete list of available format specifiers follows. Some of
|
|
them can take optional arguments. These arguments, if given, are
|
|
supplied in curly braces between the percent sign and the specifier
|
|
letter.
|
|
|
|
@table @samp
|
|
@item %s
|
|
Print type of the checkpoint (@samp{write} or @samp{read}).
|
|
|
|
@item %u
|
|
Print number of the checkpoint.
|
|
|
|
@item %@{r,w,d@}T
|
|
Print number of bytes transferred so far and approximate transfer
|
|
speed. Optional arguments supply prefixes to be used before number
|
|
of bytes read, written and deleted, correspondingly. If absent,
|
|
they default to @samp{R}. @samp{W}, @samp{D}. Any or all of them can
|
|
be omitted, so, that e.g. @samp{%@{@}T} means to print corresponding
|
|
statistics without any prefixes. Any surplus arguments, if present,
|
|
are silently ignored.
|
|
|
|
@example
|
|
$ @kbd{tar --delete -f f.tar --checkpoint-action=echo="#%u: %T" main.c}
|
|
tar: #1: R: 0 (0B, 0B/s),W: 0 (0B, 0B/s),D: 0
|
|
tar: #2: R: 10240 (10KiB, 19MiB/s),W: 0 (0B, 0B/s),D: 10240
|
|
@end example
|
|
|
|
@noindent
|
|
See also the @samp{totals} action, described below.
|
|
|
|
@item %@{@var{fmt}@}t
|
|
Output current local time using @var{fmt} as format for @command{strftime}
|
|
(@pxref{strftime, strftime,,strftime(3), strftime(3) man page}). The
|
|
@samp{@{@var{fmt}@}} part is optional. If not present, the default
|
|
format is @samp{%c}, i.e. the preferred date and time representation
|
|
for the current locale.
|
|
|
|
@item %@{@var{n}@}*
|
|
Pad output with spaces to the @var{n}th column. If the
|
|
@samp{@{@var{n}@}} part is omitted, the current screen width
|
|
is assumed.
|
|
|
|
@item %c
|
|
This is a shortcut for @samp{%@{%Y-%m-%d %H:%M:%S@}t: %ds, %@{read,wrote@}T%*\r},
|
|
intended mainly for use with @samp{ttyout} action (see below).
|
|
@end table
|
|
|
|
Aside from format expansion, the message string is subject to
|
|
@dfn{unquoting}, during which the backslash @dfn{escape sequences} are
|
|
replaced with their corresponding @acronym{ASCII} characters
|
|
(@pxref{escape sequences}). E.g. the following action will produce an
|
|
audible bell and the message described above at each checkpoint:
|
|
|
|
@smallexample
|
|
--checkpoint-action='echo=\aHit %s checkpoint #%u'
|
|
@end smallexample
|
|
|
|
@cindex @code{bell}, checkpoint action
|
|
There is also a special action which produces an audible signal:
|
|
@samp{bell}. It is not equivalent to @samp{echo='\a'}, because
|
|
@samp{bell} sends the bell directly to the console (@file{/dev/tty}),
|
|
whereas @samp{echo='\a'} sends it to the standard error.
|
|
|
|
@cindex @code{ttyout}, checkpoint action
|
|
The @samp{ttyout=@var{string}} action outputs @var{string} to
|
|
@file{/dev/tty}, so it can be used even if the standard output is
|
|
redirected elsewhere. The @var{string} is subject to the same
|
|
modifications as with @samp{echo} action. In contrast to the latter,
|
|
@samp{ttyout} does not prepend @command{tar} executable name to the
|
|
string, nor does it output a newline after it. For example, the
|
|
following action will print the checkpoint message at the same screen
|
|
line, overwriting any previous message:
|
|
|
|
@smallexample
|
|
--checkpoint-action="ttyout=Hit %s checkpoint #%u%*\r"
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice the use of @samp{%*} specifier to clear out any eventual
|
|
remains of the prior output line. As as more complex example,
|
|
consider this:
|
|
|
|
@smallexample
|
|
--checkpoint-action=ttyout='%@{%Y-%m-%d %H:%M:%S@}t (%d sec): #%u, %T%*\r'
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This prints the current local time, number of seconds expired since
|
|
tar was started, the checkpoint ordinal number, transferred bytes and
|
|
average computed I/O speed.
|
|
|
|
@cindex @code{dot}, checkpoint action
|
|
Another available checkpoint action is @samp{dot} (or @samp{.}). It
|
|
instructs @command{tar} to print a single dot on the standard listing
|
|
stream, e.g.:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=dot} /var
|
|
...
|
|
@end smallexample
|
|
|
|
For compatibility with previous @GNUTAR{} versions, this action can
|
|
be abbreviated by placing a dot in front of the checkpoint frequency,
|
|
as shown in the previous section.
|
|
|
|
@cindex @code{totals}, checkpoint action
|
|
The @samp{totals} action prints the total number of bytes transferred
|
|
so far. The format of the data is the same as for the
|
|
@option{--totals} option (@pxref{totals}). See also @samp{%T} format
|
|
specifier of the @samp{echo} or @samp{ttyout} action.
|
|
|
|
@cindex @code{sleep}, checkpoint action
|
|
Yet another action, @samp{sleep}, pauses @command{tar} for a specified
|
|
amount of seconds. The following example will stop for 30 seconds at each
|
|
checkpoint:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=sleep=30}
|
|
@end smallexample
|
|
|
|
@anchor{checkpoint wait}
|
|
@cindex @code{wait}, checkpoint action
|
|
The @code{wait=@var{signo}} action stops further execution until the
|
|
signal @var{signo} is delivered. Valid values for @var{signo} are:
|
|
@code{SIGHUP}, @code{SIGQUIT}, @code{SIGINT}, @code{SIGUSR1} and
|
|
@code{SIGUSR2}. The @samp{SIG} prefix is optional. For example:
|
|
|
|
@example
|
|
$ @kbd{tar -c -f arc --checkpoint=1000 --checkpoint-action wait=USR1 .}
|
|
@end example
|
|
|
|
In this example, @GNUTAR{} will stop archivation at each 1000th
|
|
checkpoint. wait until the @samp{SIGUSR1} signal is delivered,
|
|
and resume processing.
|
|
|
|
This action is used by the @command{genfile} utility to perform
|
|
modifications on the input files upon hitting certain checkpoints
|
|
(@pxref{Exec Mode, genfile}).
|
|
|
|
@anchor{checkpoint exec}
|
|
@cindex @code{exec}, checkpoint action
|
|
Finally, the @code{exec} action executes a given external command.
|
|
For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=exec=/sbin/cpoint}
|
|
@end smallexample
|
|
|
|
The supplied command can be any valid command invocation, with or
|
|
without additional command line arguments. If it does contain
|
|
arguments, don't forget to quote it to prevent it from being split by
|
|
the shell. @xref{external, Running External Commands}, for more detail.
|
|
|
|
The command gets a copy of @command{tar}'s environment plus the
|
|
following variables:
|
|
|
|
@table @env
|
|
@vrindex TAR_VERSION, checkpoint script environment
|
|
@item TAR_VERSION
|
|
@GNUTAR{} version number.
|
|
|
|
@vrindex TAR_ARCHIVE, checkpoint script environment
|
|
@item TAR_ARCHIVE
|
|
The name of the archive @command{tar} is processing.
|
|
|
|
@vrindex TAR_BLOCKING_FACTOR, checkpoint script environment
|
|
@item TAR_BLOCKING_FACTOR
|
|
Current blocking factor (@pxref{Blocking}).
|
|
|
|
@vrindex TAR_CHECKPOINT, checkpoint script environment
|
|
@item TAR_CHECKPOINT
|
|
Number of the checkpoint.
|
|
|
|
@vrindex TAR_SUBCOMMAND, checkpoint script environment
|
|
@item TAR_SUBCOMMAND
|
|
A short option describing the operation @command{tar} is executing.
|
|
@xref{Operations}, for a complete list of subcommand options.
|
|
|
|
@vrindex TAR_FORMAT, checkpoint script environment
|
|
@item TAR_FORMAT
|
|
Format of the archive being processed. @xref{Formats}, for a complete
|
|
list of archive format names.
|
|
@end table
|
|
|
|
These environment variables can also be passed as arguments to the
|
|
command, provided that they are properly escaped, for example:
|
|
|
|
@smallexample
|
|
@kbd{tar -c -f arc.tar \
|
|
--checkpoint-action='exec=/sbin/cpoint $TAR_CHECKPOINT'}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice single quotes to prevent variable names from being expanded by
|
|
the shell when invoking @command{tar}.
|
|
|
|
Any number of actions can be defined, by supplying several
|
|
@option{--checkpoint-action} options in the command line. For
|
|
example, the command below displays two messages, pauses
|
|
execution for 30 seconds and executes the @file{/sbin/cpoint} script:
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{tar -c -f arc.tar \
|
|
--checkpoint-action='\aecho=Hit %s checkpoint #%u' \
|
|
--checkpoint-action='echo=Sleeping for 30 seconds' \
|
|
--checkpoint-action='sleep=30' \
|
|
--checkpoint-action='exec=/sbin/cpoint'}
|
|
@end group
|
|
@end example
|
|
|
|
This example also illustrates the fact that
|
|
@option{--checkpoint-action} can be used without
|
|
@option{--checkpoint}. In this case, the default checkpoint frequency
|
|
(at each 10th record) is assumed.
|
|
|
|
@node warnings
|
|
@section Controlling Warning Messages
|
|
|
|
Sometimes, while performing the requested task, @GNUTAR{} notices
|
|
some conditions that are not exactly errors, but which the user
|
|
should be aware of. When this happens, @command{tar} issues a
|
|
@dfn{warning message} describing the condition. Warning messages
|
|
are output to the standard error and they do not affect the exit
|
|
code of @command{tar} command.
|
|
|
|
@xopindex{warning, explained}
|
|
@GNUTAR{} allows the user to suppress some or all of its warning
|
|
messages:
|
|
|
|
@table @option
|
|
@item --warning=@var{keyword}
|
|
Control display of the warning messages identified by @var{keyword}.
|
|
If @var{keyword} starts with the prefix @samp{no-}, such messages are
|
|
suppressed. Otherwise, they are enabled.
|
|
|
|
Multiple @option{--warning} options accumulate.
|
|
@end table
|
|
|
|
By default, @GNUTAR enables all messages, except those that are
|
|
enabled in verbose mode (@pxref{verbose tutorial}). @xref{Warning
|
|
Defaults}, for details.
|
|
|
|
The subsections below discuss allowed values for @var{keyword} along with the
|
|
warning messages they control.
|
|
|
|
@menu
|
|
* General Warnings:: Keywords applicable for @command{tar --create}.
|
|
* Archive Creation Warnings:: Keywords applicable for @command{tar --create}.
|
|
* Archive Extraction Warnings:: Keywords applicable for @command{tar --extract}.
|
|
* Incremental Extraction Warnings:: Keywords controlling incremental extraction.
|
|
* Warning Classes:: Convenience keywords control multiple warnings.
|
|
* Warning Defaults:: Default settings for warnings.
|
|
@end menu
|
|
|
|
@node General Warnings
|
|
@subsection Keywords controlling @command{tar} operation
|
|
|
|
These keywords control warnings that may appear in any @GNUTAR{}
|
|
operation mode:
|
|
|
|
@defvr {warning} filename-with-nuls
|
|
@cindex @samp{file name read contains nul character}, warning message
|
|
@samp{file name read contains nul character}
|
|
@end defvr
|
|
|
|
@defvr {warning} filename-with-nuls
|
|
@cindex @samp{file name read contains nul character}, warning message
|
|
@samp{%s: file name read contains nul character}
|
|
@end defvr
|
|
|
|
@defvr {warning} alone-zero-block
|
|
@cindex @samp{A lone zero block at}, warning message
|
|
@samp{A lone zero block at %s}. Notice, that this warning is
|
|
suppressed if @option{--ignore-zeros} is in effect (@pxref{Ignore
|
|
Zeros}).
|
|
@end defvr
|
|
|
|
@defvr {warning} missing-zero-blocks
|
|
@cindex @samp{Terminating zero blocks missing}, warning message.
|
|
@samp{Terminating zero blocks missing at %s}. This warning is
|
|
suppressed if @option{--ignore-zeros} is in effect (@pxref{Ignore
|
|
Zeros}).
|
|
@end defvr
|
|
|
|
@node Archive Creation Warnings
|
|
@subsection Keywords applicable for @command{tar --create}
|
|
|
|
The following keywords control messages that can be issued while
|
|
creating archives.
|
|
|
|
@defvr {warning} cachedir
|
|
@cindex @samp{contains a cache directory tag}, warning message
|
|
@samp{%s: contains a cache directory tag %s; %s}
|
|
@end defvr
|
|
|
|
@defvr {warning} file-shrank
|
|
@cindex @samp{File shrank by %s bytes}, warning message
|
|
@samp{%s: File shrank by %s bytes; padding with zeros}
|
|
@end defvr
|
|
|
|
@defvr {warning} xdev
|
|
@cindex @samp{file is on a different filesystem}, warning message
|
|
@samp{%s: file is on a different filesystem; not dumped}
|
|
@end defvr
|
|
|
|
@defvr {warning} file-ignored
|
|
@cindex @samp{Unknown file type; file ignored}, warning message
|
|
@cindex @samp{socket ignored}, warning message
|
|
@cindex @samp{door ignored}, warning message
|
|
@samp{%s: Unknown file type; file ignored}
|
|
@*@samp{%s: socket ignored}
|
|
@*@samp{%s: door ignored}
|
|
@end defvr
|
|
|
|
@defvr {warning} file-unchanged
|
|
@cindex @samp{file is unchanged; not dumped}, warning message
|
|
@samp{%s: file is unchanged; not dumped}
|
|
@end defvr
|
|
|
|
@defvr {warning} ignore-archive
|
|
@cindex @samp{archive cannot contain itself; not dumped}, warning message
|
|
@samp{%s: archive cannot contain itself; not dumped}
|
|
@end defvr
|
|
|
|
@defvr {warning} file-removed
|
|
@cindex @samp{File removed before we read it}, warning message
|
|
@samp{%s: File removed before we read it}
|
|
@end defvr
|
|
|
|
@defvr {warning} file-changed
|
|
@cindex @samp{file changed as we read it}, warning message
|
|
@samp{%s: file changed as we read it}
|
|
|
|
Suppresses warnings about read failures, which can occur if files
|
|
or directories are unreadable, or if they change while being read. This
|
|
keyword applies only if used together with the @option{--ignore-failed-read}
|
|
option. @xref{Ignore Failed Read}.
|
|
@end defvr
|
|
|
|
@node Archive Extraction Warnings
|
|
@subsection Keywords applicable for @command{tar --extract}
|
|
|
|
The following keywords control warnings that can be issued during
|
|
archive extraction.
|
|
|
|
@defvr {warning} existing-file
|
|
@cindex @samp{%s: skipping existing file}, warning message
|
|
@samp{%s: skipping existing file}
|
|
@end defvr
|
|
|
|
@defvr {warning} timestamp
|
|
@cindex @samp{implausibly old time stamp %s}, warning message
|
|
@cindex @samp{time stamp %s is %s s in the future}, warning message
|
|
@samp{%s: implausibly old time stamp %s}
|
|
@*@samp{%s: time stamp %s is %s s in the future}
|
|
@end defvr
|
|
|
|
@defvr {warning} contiguous-cast
|
|
@cindex @samp{Extracting contiguous files as regular files}, warning message
|
|
@samp{Extracting contiguous files as regular files}
|
|
@end defvr
|
|
|
|
@defvr {warning} symlink-cast
|
|
@samp{Attempting extraction of symbolic links as hard links}, warning message
|
|
@samp{Attempting extraction of symbolic links as hard links}
|
|
@end defvr
|
|
|
|
@defvr {warning} unknown-cast
|
|
@cindex @samp{Unknown file type '%c', extracted as normal file}, warning message
|
|
@samp{%s: Unknown file type '%c', extracted as normal file}
|
|
@end defvr
|
|
|
|
@defvr {warning} ignore-newer
|
|
@cindex @samp{Current %s is newer or same age}, warning message
|
|
@samp{Current %s is newer or same age}
|
|
@end defvr
|
|
|
|
@defvr {warning} unknown-keyword
|
|
@cindex @samp{Ignoring unknown extended header keyword '%s'}, warning message
|
|
@samp{Ignoring unknown extended header keyword '%s'}
|
|
@end defvr
|
|
|
|
@defvr {warning} decompress-program
|
|
Controls verbose description of failures occurring when trying to run
|
|
alternative decompressor programs (@pxref{alternative decompression
|
|
programs}). This warning is disabled by default (unless
|
|
@option{--verbose} is used). A common example of what you can get
|
|
when using this warning is:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --warning=decompress-program -x -f archive.Z}
|
|
tar (child): cannot run compress: No such file or directory
|
|
tar (child): trying gzip
|
|
@end smallexample
|
|
|
|
This means that @command{tar} first tried to decompress
|
|
@file{archive.Z} using @command{compress}, and, when that
|
|
failed, switched to @command{gzip}.
|
|
@end defvr
|
|
|
|
@defvr {warning} record-size
|
|
@cindex @samp{Record size = %lu blocks}, warning message
|
|
@samp{Record size = %lu blocks}
|
|
@end defvr
|
|
|
|
@node Incremental Extraction Warnings
|
|
@subsection Keywords controlling incremental extraction
|
|
|
|
These keywords control warnings that may appear when extracting from
|
|
incremental archives.
|
|
|
|
@defvr {warning} rename-directory
|
|
@cindex @samp{%s: Directory has been renamed from %s}, warning message
|
|
@cindex @samp{%s: Directory has been renamed}, warning message
|
|
@samp{%s: Directory has been renamed from %s}
|
|
@*@samp{%s: Directory has been renamed}
|
|
@end defvr
|
|
|
|
@defvr {warning} new-directory
|
|
@cindex @samp{%s: Directory is new}, warning message
|
|
@samp{%s: Directory is new}
|
|
@end defvr
|
|
|
|
@defvr {warning} xdev
|
|
@cindex @samp{%s: directory is on a different device: not purging}, warning message
|
|
@samp{%s: directory is on a different device: not purging}
|
|
@end defvr
|
|
|
|
@defvr {warning} bad-dumpdir
|
|
@cindex @samp{Malformed dumpdir: 'X' never used}, warning message
|
|
@samp{Malformed dumpdir: 'X' never used}
|
|
@end defvr
|
|
|
|
@node Warning Classes
|
|
@subsection Warning Classes
|
|
|
|
These convenience keywords define @dfn{warning classes}. When used,
|
|
they affect several warnings at once.
|
|
|
|
@defvr {warning} all
|
|
Enable all warning messages.
|
|
@end defvr
|
|
|
|
@defvr {warning} none
|
|
Disable all warning messages.
|
|
@end defvr
|
|
|
|
@defvr {warning} verbose
|
|
A shorthand for all messages enabled when @option{--verbose}
|
|
(@pxref{verbose tutorial}) is in effect. These are:
|
|
@code{decompress-program}, @code{existing-file}, @code{new-directory},
|
|
@code{record-size}, @code{rename-directory}.
|
|
@end defvr
|
|
|
|
@node Warning Defaults
|
|
@subsection Default Warning Settings
|
|
@GNUTAR default settings correspond to:
|
|
|
|
@example
|
|
--warning=all --warning=no-verbose --warning=no-missing-zero-blocks
|
|
@end example
|
|
|
|
@node interactive
|
|
@section Asking for Confirmation During Operations
|
|
@cindex Interactive operation
|
|
|
|
Typically, @command{tar} carries out a command without stopping for
|
|
further instructions. In some situations however, you may want to
|
|
exclude some files and archive members from the operation (for instance
|
|
if disk or storage space is tight). You can do this by excluding
|
|
certain files automatically (@pxref{Choosing}), or by performing
|
|
an operation interactively, using the @option{--interactive} (@option{-w}) option.
|
|
@command{tar} also accepts @option{--confirmation} for this option.
|
|
|
|
@opindex interactive
|
|
When the @option{--interactive} (@option{-w}) option is specified, before
|
|
reading, writing, or deleting files, @command{tar} first prints a message
|
|
for each such file, telling what operation it intends to take, then asks
|
|
for confirmation on the terminal. The actions which require
|
|
confirmation include adding a file to the archive, extracting a file
|
|
from the archive, deleting a file from the archive, and deleting a file
|
|
from disk. To confirm the action, you must type a line of input
|
|
beginning with @samp{y}. If your input line begins with anything other
|
|
than @samp{y}, @command{tar} skips that file.
|
|
|
|
If @command{tar} is reading the archive from the standard input,
|
|
@command{tar} opens the file @file{/dev/tty} to support the interactive
|
|
communications.
|
|
|
|
Verbose output is normally sent to standard output, separate from
|
|
other error messages. However, if the archive is produced directly
|
|
on standard output, then verbose output is mixed with errors on
|
|
@code{stderr}. Producing the archive on standard output may be used
|
|
as a way to avoid using disk space, when the archive is soon to be
|
|
consumed by another process reading it, say. Some people felt the need
|
|
of producing an archive on stdout, still willing to segregate between
|
|
verbose output and error output. A possible approach would be using a
|
|
named pipe to receive the archive, and having the consumer process to
|
|
read from that named pipe. This has the advantage of letting standard
|
|
output free to receive verbose output, all separate from errors.
|
|
|
|
@node external
|
|
@section Running External Commands
|
|
|
|
Certain @GNUTAR{} operations imply running external commands that you
|
|
supply on the command line. One of such operations is checkpointing,
|
|
described above (@pxref{checkpoint exec}). Another example of this
|
|
feature is the @option{-I} option, which allows you to supply the
|
|
program to use for compressing or decompressing the archive
|
|
(@pxref{use-compress-program}).
|
|
|
|
Whenever such operation is requested, @command{tar} first splits the
|
|
supplied command into words much like the shell does. It then treats
|
|
the first word as the name of the program or the shell script to execute
|
|
and the rest of words as its command line arguments. The program,
|
|
unless given as an absolute file name, is searched in the shell's
|
|
@env{PATH}.
|
|
|
|
Any additional information is normally supplied to external commands
|
|
in environment variables, specific to each particular operation. For
|
|
example, the @option{--checkpoint-action=exec} option, defines the
|
|
@env{TAR_ARCHIVE} variable to the name of the archive being worked
|
|
upon. You can, should the need be, use these variables in the
|
|
command line of the external command. For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -x -f archive.tar \
|
|
--checkpoint-action=exec='printf "%04d in %32s\r" $TAR_CHECKPOINT $TAR_ARCHIVE'}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This command prints for each checkpoint its number and the name of the
|
|
archive, using the same output line on the screen.
|
|
|
|
Notice the use of single quotes to prevent variable names from being
|
|
expanded by the shell when invoking @command{tar}.
|
|
|
|
@node operations
|
|
@chapter @GNUTAR{} Operations
|
|
|
|
@menu
|
|
* Basic tar::
|
|
* Advanced tar::
|
|
* create options::
|
|
* extract options::
|
|
* backup::
|
|
* looking ahead::
|
|
@end menu
|
|
|
|
@node Basic tar
|
|
@section Basic @GNUTAR{} Operations
|
|
|
|
The basic @command{tar} operations, @option{--create} (@option{-c}),
|
|
@option{--list} (@option{-t}) and @option{--extract} (@option{--get},
|
|
@option{-x}), are currently presented and described in the tutorial
|
|
chapter of this manual. This section provides some complementary notes
|
|
for these operations.
|
|
|
|
@table @option
|
|
@xopindex{create, complementary notes}
|
|
@item --create
|
|
@itemx -c
|
|
|
|
Creating an empty archive would have some kind of elegance. One can
|
|
initialize an empty archive and later use @option{--append}
|
|
(@option{-r}) for adding all members. Some applications would not
|
|
welcome making an exception in the way of adding the first archive
|
|
member. On the other hand, many people reported that it is
|
|
dangerously too easy for @command{tar} to destroy a magnetic tape with
|
|
an empty archive@footnote{This is well described in @cite{Unix-haters
|
|
Handbook}, by Simson Garfinkel, Daniel Weise & Steven Strassmann, IDG
|
|
Books, ISBN 1-56884-203-1.}. The two most common errors are:
|
|
|
|
@enumerate
|
|
@item
|
|
Mistakingly using @code{create} instead of @code{extract}, when the
|
|
intent was to extract the full contents of an archive. This error
|
|
is likely: keys @kbd{c} and @kbd{x} are right next to each other on
|
|
the QWERTY keyboard. Instead of being unpacked, the archive then
|
|
gets wholly destroyed. When users speak about @dfn{exploding} an
|
|
archive, they usually mean something else :-).
|
|
|
|
@item
|
|
Forgetting the argument to @code{file}, when the intent was to create
|
|
an archive with a single file in it. This error is likely because a
|
|
tired user can easily add the @kbd{f} key to the cluster of option
|
|
letters, by the mere force of habit, without realizing the full
|
|
consequence of doing so. The usual consequence is that the single
|
|
file, which was meant to be saved, is rather destroyed.
|
|
@end enumerate
|
|
|
|
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
|
|
@option{--files-from} (@option{-T}) option is @emph{not} used. To get
|
|
around the cautiousness of @GNUTAR{} and nevertheless create an
|
|
archive with nothing in it, one may still use, as the value for the
|
|
@option{--files-from} option, a file with no names in it, as shown in
|
|
the following commands:
|
|
|
|
@smallexample
|
|
@kbd{tar --create --file=empty-archive.tar --files-from=/dev/null}
|
|
@kbd{tar -cf empty-archive.tar -T /dev/null}
|
|
@end smallexample
|
|
|
|
@xopindex{extract, complementary notes}
|
|
@item --extract
|
|
@itemx --get
|
|
@itemx -x
|
|
|
|
A socket is stored, within a @GNUTAR{} archive, as a pipe.
|
|
|
|
@item @option{--list} (@option{-t})
|
|
|
|
@GNUTAR{} now shows dates as @samp{1996-08-30},
|
|
while it used to show them as @samp{Aug 30 1996}. Preferably,
|
|
people should get used to ISO 8601 dates. Local American dates should
|
|
be made available again with full date localization support, once
|
|
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.cl.cam.ac.uk/@/~mgk25/@/iso-time.html} if you
|
|
are curious, it contains a detailed explanation of the ISO 8601 standard.
|
|
|
|
@end table
|
|
|
|
@node Advanced tar
|
|
@section Advanced @GNUTAR{} Operations
|
|
|
|
Now that you have learned the basics of using @GNUTAR{}, you may want
|
|
to learn about further ways in which @command{tar} can help you.
|
|
|
|
This chapter presents five, more advanced operations which you probably
|
|
won't use on a daily basis, but which serve more specialized functions.
|
|
We also explain the different styles of options and why you might want
|
|
to use one or another, or a combination of them in your @command{tar}
|
|
commands. Additionally, this chapter includes options which allow you to
|
|
define the output from @command{tar} more carefully, and provide help and
|
|
error correction in special circumstances.
|
|
|
|
@FIXME{check this after the chapter is actually revised to make sure
|
|
it still introduces the info in the chapter correctly : ).}
|
|
|
|
@menu
|
|
* Operations::
|
|
* append::
|
|
* update::
|
|
* concatenate::
|
|
* delete::
|
|
* compare::
|
|
@end menu
|
|
|
|
@node Operations
|
|
@subsection The Five Advanced @command{tar} Operations
|
|
|
|
@cindex basic operations
|
|
In the last chapter, you learned about the first three operations to
|
|
@command{tar}. This chapter presents the remaining five operations to
|
|
@command{tar}: @option{--append}, @option{--update}, @option{--concatenate},
|
|
@option{--delete}, and @option{--compare}.
|
|
|
|
You are not likely to use these operations as frequently as those
|
|
covered in the last chapter; however, since they perform specialized
|
|
functions, they are quite useful when you do need to use them. We
|
|
will give examples using the same directory and files that you created
|
|
in the last chapter. As you may recall, the directory is called
|
|
@file{practice}, the files are @samp{jazz}, @samp{blues}, @samp{folk},
|
|
and the two archive files you created are
|
|
@samp{collection.tar} and @samp{music.tar}.
|
|
|
|
We will also use the archive files @samp{afiles.tar} and
|
|
@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
|
|
in this chapter will take place in the @file{practice} directory that
|
|
you created in the previous chapter; see @ref{prepare for examples}.
|
|
(Below in this section, we will remind you of the state of the examples
|
|
where the last chapter left them.)
|
|
|
|
The five operations that we will cover in this chapter are:
|
|
|
|
@table @option
|
|
@item --append
|
|
@itemx -r
|
|
Add new entries to an archive that already exists.
|
|
@item --update
|
|
@itemx -u
|
|
Add more recent copies of archive members to the end of an archive, if
|
|
they exist.
|
|
@item --concatenate
|
|
@itemx --catenate
|
|
@itemx -A
|
|
Add one or more pre-existing archives to the end of another archive.
|
|
@item --delete
|
|
Delete items from an archive (does not work on tapes).
|
|
@item --compare
|
|
@itemx --diff
|
|
@itemx -d
|
|
Compare archive members to their counterparts in the file system.
|
|
@end table
|
|
|
|
@node append
|
|
@subsection How to Add Files to Existing Archives: @option{--append}
|
|
|
|
@cindex appending files to existing archive
|
|
@opindex append
|
|
If you want to add files to an existing archive, you don't need to
|
|
create a new archive; you can use @option{--append} (@option{-r}).
|
|
The archive must already exist in order to use @option{--append}. (A
|
|
related operation is the @option{--update} operation; you can use this
|
|
to add newer versions of archive members to an existing archive. To learn how to
|
|
do this with @option{--update}, @pxref{update}.)
|
|
|
|
If you use @option{--append} to add a file that has the same name as an
|
|
archive member to an archive containing that archive member, then the
|
|
old member is not deleted. What does happen, however, is somewhat
|
|
complex. @command{tar} @emph{allows} you to have infinite number of files
|
|
with the same name. Some operations treat these same-named members no
|
|
differently than any other set of archive members: for example, if you
|
|
view an archive with @option{--list} (@option{-t}), you will see all
|
|
of those members listed, with their data modification times, owners, etc.
|
|
|
|
Other operations don't deal with these members as perfectly as you might
|
|
prefer; if you were to use @option{--extract} to extract the archive,
|
|
only the most recently added copy of a member with the same name as
|
|
other members would end up in the working directory. This is because
|
|
@option{--extract} extracts an archive in the order the members appeared
|
|
in the archive; the most recently archived members will be extracted
|
|
last. Additionally, an extracted member will @emph{replace} a file of
|
|
the same name which existed in the directory already, and @command{tar}
|
|
will not prompt you about this@footnote{Unless you give it
|
|
@option{--keep-old-files} (or @option{--skip-old-files}) option, or
|
|
the disk copy is newer than the one in the archive and you invoke
|
|
@command{tar} with @option{--keep-newer-files} option.}. Thus, only
|
|
the most recently archived member will end up being extracted, as it
|
|
will replace the one extracted before it, and so on.
|
|
|
|
@cindex extracting @var{n}th copy of the file
|
|
@xopindex{occurrence, described}
|
|
There exists a special option that allows you to get around this
|
|
behavior and extract (or list) only a particular copy of the file.
|
|
This is @option{--occurrence} option. If you run @command{tar} with
|
|
this option, it will extract only the first copy of the file. You
|
|
may also give this option an argument specifying the number of
|
|
copy to be extracted. Thus, for example if the archive
|
|
@file{archive.tar} contained three copies of file @file{myfile}, then
|
|
the command
|
|
|
|
@smallexample
|
|
tar --extract --file archive.tar --occurrence=2 myfile
|
|
@end smallexample
|
|
|
|
@noindent
|
|
would extract only the second copy. @xref{Option
|
|
Summary,---occurrence}, for the description of @option{--occurrence}
|
|
option.
|
|
|
|
@FIXME{ hag -- you might want to incorporate some of the above into the
|
|
MMwtSN node; not sure. i didn't know how to make it simpler...
|
|
|
|
There are a few ways to get around this. Xref to Multiple Members
|
|
with the Same Name, maybe.}
|
|
|
|
@cindex Members, replacing with other members
|
|
@cindex Replacing members with other members
|
|
@xopindex{delete, using before --append}
|
|
If you want to replace an archive member, use @option{--delete} to
|
|
delete the member you want to remove from the archive, and then use
|
|
@option{--append} to add the member you want to be in the archive. Note
|
|
that you can not change the order of the archive; the most recently
|
|
added member will still appear last. In this sense, you cannot truly
|
|
``replace'' one member with another. (Replacing one member with another
|
|
will not work on certain types of media, such as tapes; see @ref{delete}
|
|
and @ref{Media}, for more information.)
|
|
|
|
@menu
|
|
* appending files:: Appending Files to an Archive
|
|
* multiple::
|
|
@end menu
|
|
|
|
@node appending files
|
|
@subsubsection Appending Files to an Archive
|
|
@cindex Adding files to an Archive
|
|
@cindex Appending files to an Archive
|
|
@cindex Archives, Appending files to
|
|
@opindex append
|
|
|
|
The simplest way to add a file to an already existing archive is the
|
|
@option{--append} (@option{-r}) operation, which writes specified
|
|
files into the archive whether or not they are already among the
|
|
archived files.
|
|
|
|
When you use @option{--append}, you @emph{must} specify file name
|
|
arguments, as there is no default. If you specify a file that already
|
|
exists in the archive, another copy of the file will be added to the
|
|
end of the archive. As with other operations, the member names of the
|
|
newly added files will be exactly the same as their names given on the
|
|
command line. The @option{--verbose} (@option{-v}) option will print
|
|
out the names of the files as they are written into the archive.
|
|
|
|
@option{--append} cannot be performed on some tape drives, unfortunately,
|
|
due to deficiencies in the formats those tape drives use. The archive
|
|
must be a valid @command{tar} archive, or else the results of using this
|
|
operation will be unpredictable. @xref{Media}.
|
|
|
|
To demonstrate using @option{--append} to add a file to an archive,
|
|
create a file called @file{rock} in the @file{practice} directory.
|
|
Make sure you are in the @file{practice} directory. Then, run the
|
|
following @command{tar} command to add @file{rock} to
|
|
@file{collection.tar}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --append --file=collection.tar rock}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
If you now use the @option{--list} (@option{-t}) operation, you will see that
|
|
@file{rock} has been added to the archive:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --file=collection.tar}
|
|
-rw-r--r-- me/user 28 1996-10-18 16:31 jazz
|
|
-rw-r--r-- me/user 21 1996-09-23 16:44 blues
|
|
-rw-r--r-- me/user 20 1996-09-23 16:44 folk
|
|
-rw-r--r-- me/user 20 1996-09-23 16:44 rock
|
|
@end smallexample
|
|
|
|
@node multiple
|
|
@subsubsection Multiple Members with the Same Name
|
|
@cindex members, multiple
|
|
@cindex multiple members
|
|
|
|
You can use @option{--append} (@option{-r}) to add copies of files
|
|
which have been updated since the archive was created. (However, we
|
|
do not recommend doing this since there is another @command{tar}
|
|
option called @option{--update}; @xref{update}, for more information.
|
|
We describe this use of @option{--append} here for the sake of
|
|
completeness.) When you extract the archive, the older version will
|
|
be effectively lost. This works because files are extracted from an
|
|
archive in the order in which they were archived. Thus, when the
|
|
archive is extracted, a file archived later in time will replace a
|
|
file of the same name which was archived earlier, even though the
|
|
older version of the file will remain in the archive unless you delete
|
|
all versions of the file.
|
|
|
|
Supposing you change the file @file{blues} and then append the changed
|
|
version to @file{collection.tar}. As you saw above, the original
|
|
@file{blues} is in the archive @file{collection.tar}. If you change the
|
|
file and append the new version of the file to the archive, there will
|
|
be two copies in the archive. When you extract the archive, the older
|
|
version of the file will be extracted first, and then replaced by the
|
|
newer version when it is extracted.
|
|
|
|
You can append the new, changed copy of the file @file{blues} to the
|
|
archive in this way:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --append --verbose --file=collection.tar blues}
|
|
blues
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Because you specified the @option{--verbose} option, @command{tar} has
|
|
printed the name of the file being appended as it was acted on. Now
|
|
list the contents of the archive:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --verbose --file=collection.tar}
|
|
-rw-r--r-- me/user 28 1996-10-18 16:31 jazz
|
|
-rw-r--r-- me/user 21 1996-09-23 16:44 blues
|
|
-rw-r--r-- me/user 20 1996-09-23 16:44 folk
|
|
-rw-r--r-- me/user 20 1996-09-23 16:44 rock
|
|
-rw-r--r-- me/user 58 1996-10-24 18:30 blues
|
|
@end smallexample
|
|
|
|
@noindent
|
|
The newest version of @file{blues} is now at the end of the archive
|
|
(note the different creation dates and file sizes). If you extract
|
|
the archive, the older version of the file @file{blues} will be
|
|
replaced by the newer version. You can confirm this by extracting
|
|
the archive and running @samp{ls} on the directory.
|
|
|
|
If you wish to extract the first occurrence of the file @file{blues}
|
|
from the archive, use @option{--occurrence} option, as shown in
|
|
the following example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --extract -vv --occurrence --file=collection.tar blues}
|
|
-rw-r--r-- me/user 21 1996-09-23 16:44 blues
|
|
@end smallexample
|
|
|
|
@xref{Writing}, for more information on @option{--extract} and
|
|
see @ref{Option Summary, --occurrence}, for a description of
|
|
@option{--occurrence} option.
|
|
|
|
@node update
|
|
@subsection Updating an Archive
|
|
@cindex Updating an archive
|
|
@opindex update
|
|
|
|
In the previous section, you learned how to use @option{--append} to
|
|
add a file to an existing archive. A related operation is
|
|
@option{--update} (@option{-u}). The @option{--update} operation
|
|
updates a @command{tar} archive by comparing the date of the specified
|
|
archive members against the date of the file with the same name. If
|
|
the file has been modified more recently than the archive member, then
|
|
the newer version of the file is added to the archive (as with
|
|
@option{--append}).
|
|
|
|
Unfortunately, you cannot use @option{--update} with magnetic tape drives.
|
|
The operation will fail.
|
|
|
|
@FIXME{other examples of media on which --update will fail? need to ask
|
|
charles and/or mib/thomas/dave shevett..}
|
|
|
|
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. @xref{multiple}, for a detailed discussion.
|
|
|
|
@menu
|
|
* how to update::
|
|
@end menu
|
|
|
|
@node how to update
|
|
@subsubsection How to Update an Archive Using @option{--update}
|
|
@opindex update
|
|
|
|
You must use file name arguments with the @option{--update}
|
|
(@option{-u}) operation. If you don't specify any files,
|
|
@command{tar} won't act on any files and won't tell you that it didn't
|
|
do anything (which may end up confusing you).
|
|
|
|
@c note: the above parenthetical added because in fact, this
|
|
@c behavior just confused the author. :-)
|
|
|
|
To see the @option{--update} option at work, create a new file,
|
|
@file{classical}, in your practice directory, and some extra text to the
|
|
file @file{blues}, using any text editor. Then invoke @command{tar} with
|
|
the @samp{update} operation and the @option{--verbose} (@option{-v})
|
|
option specified, using the names of all the files in the @file{practice}
|
|
directory as file name arguments:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --update -v -f collection.tar blues folk rock classical}
|
|
blues
|
|
classical
|
|
$
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Because we have specified verbose mode, @command{tar} prints out the names
|
|
of the files it is working on, which in this case are the names of the
|
|
files that needed to be updated. If you run @samp{tar --list} and look
|
|
at the archive, you will see @file{blues} and @file{classical} at its
|
|
end. There will be a total of two versions of the member @samp{blues};
|
|
the one at the end will be newer and larger, since you added text before
|
|
updating it.
|
|
|
|
The reason @command{tar} does not overwrite the older file when updating
|
|
it is that writing to the middle of a section of tape is a difficult
|
|
process. Tapes are not designed to go backward. @xref{Media}, for more
|
|
information about tapes.
|
|
|
|
@option{--update} (@option{-u}) is not suitable for performing backups for two
|
|
reasons: it does not change directory content entries, and it
|
|
lengthens the archive every time it is used. The @GNUTAR{}
|
|
options intended specifically for backups are more
|
|
efficient. If you need to run backups, please consult @ref{Backups}.
|
|
|
|
@node concatenate
|
|
@subsection Combining Archives with @option{--concatenate}
|
|
|
|
@cindex Adding archives to an archive
|
|
@cindex Concatenating Archives
|
|
@opindex concatenate
|
|
@opindex catenate
|
|
@c @cindex @option{-A} described
|
|
Sometimes it may be convenient to add a second archive onto the end of
|
|
an archive rather than adding individual files to the archive. To add
|
|
one or more archives to the end of another archive, you should use the
|
|
@option{--concatenate} (@option{--catenate}, @option{-A}) operation.
|
|
|
|
To use @option{--concatenate}, give the first archive with
|
|
@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@footnote{This can cause multiple members to have the same name. For
|
|
information on how this affects reading the archive, see @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
|
|
variable @env{TAPE}, or, if this has not been set, the default archive name.
|
|
|
|
@FIXME{There is no way to specify a new name...}
|
|
|
|
To demonstrate how @option{--concatenate} works, create two small archives
|
|
called @file{bluesrock.tar} and @file{folkjazz.tar}, using the relevant
|
|
files from @file{practice}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cvf bluesrock.tar blues rock}
|
|
blues
|
|
rock
|
|
$ @kbd{tar -cvf folkjazz.tar folk jazz}
|
|
folk
|
|
jazz
|
|
@end smallexample
|
|
|
|
@noindent
|
|
If you like, you can run @samp{tar --list} to make sure the archives
|
|
contain what they are supposed to:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -tvf bluesrock.tar}
|
|
-rw-r--r-- melissa/user 105 1997-01-21 19:42 blues
|
|
-rw-r--r-- melissa/user 33 1997-01-20 15:34 rock
|
|
$ @kbd{tar -tvf jazzfolk.tar}
|
|
-rw-r--r-- melissa/user 20 1996-09-23 16:44 folk
|
|
-rw-r--r-- melissa/user 65 1997-01-30 14:15 jazz
|
|
@end smallexample
|
|
|
|
We can concatenate these two archives with @command{tar}:
|
|
|
|
@smallexample
|
|
$ @kbd{cd ..}
|
|
$ @kbd{tar --concatenate --file=bluesrock.tar jazzfolk.tar}
|
|
@end smallexample
|
|
|
|
If you now list the contents of the @file{bluesrock.tar}, you will see
|
|
that now it also contains the archive members of @file{jazzfolk.tar}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --file=bluesrock.tar}
|
|
blues
|
|
rock
|
|
folk
|
|
jazz
|
|
@end smallexample
|
|
|
|
When you use @option{--concatenate}, the source and target archives must
|
|
already exist and must have been created using compatible format
|
|
parameters. Notice, that @command{tar} does not check whether the
|
|
archives it concatenates have compatible formats, it does not
|
|
even check if the files are really tar archives.
|
|
|
|
Like @option{--append} (@option{-r}), this operation cannot be performed on some
|
|
tape drives, due to deficiencies in the formats those tape drives use.
|
|
|
|
@cindex @code{concatenate} vs @command{cat}
|
|
@cindex @command{cat} vs @code{concatenate}
|
|
It may seem more intuitive to you to want or try to use @command{cat} to
|
|
concatenate two archives instead of using the @option{--concatenate}
|
|
operation; after all, @command{cat} is the utility for combining files.
|
|
|
|
However, @command{tar} archives incorporate an end-of-file marker which
|
|
must be removed if the concatenated archives are to be read properly as
|
|
one archive. @option{--concatenate} removes the end-of-archive marker
|
|
from the target archive before each new archive is appended. If you use
|
|
@command{cat} to combine the archives, the result will not be a valid
|
|
@command{tar} format archive. If you need to retrieve files from an
|
|
archive that was added to using the @command{cat} utility, use the
|
|
@option{--ignore-zeros} (@option{-i}) option. @xref{Ignore Zeros}, for further
|
|
information on dealing with archives improperly combined using the
|
|
@command{cat} shell utility.
|
|
|
|
@node delete
|
|
@subsection Removing Archive Members Using @option{--delete}
|
|
@cindex Deleting files from an archive
|
|
@cindex Removing files from an archive
|
|
|
|
@opindex delete
|
|
You can remove members from an archive by using the @option{--delete}
|
|
option. Specify the name of the archive with @option{--file}
|
|
(@option{-f}) and then specify the names of the members to be deleted;
|
|
if you list no member names, nothing will be deleted. The
|
|
@option{--verbose} option will cause @command{tar} to print the names
|
|
of the members as they are deleted. As with @option{--extract}, you
|
|
must give the exact member names when using @samp{tar --delete}.
|
|
@option{--delete} will remove all versions of the named file from the
|
|
archive. The @option{--delete} operation can run very slowly.
|
|
|
|
Unlike other operations, @option{--delete} has no short form.
|
|
|
|
@cindex Tapes, using @option{--delete} and
|
|
@cindex Deleting from tape archives
|
|
This operation will rewrite the archive. You can only use
|
|
@option{--delete} on an archive if the archive device allows you to
|
|
write to any point on the media, such as a disk; because of this, it
|
|
does not work on magnetic tapes. Do not try to delete an archive member
|
|
from a magnetic tape; the action will not succeed, and you will be
|
|
likely to scramble the archive and damage your tape. There is no safe
|
|
way (except by completely re-writing the archive) to delete files from
|
|
most kinds of magnetic tape. @xref{Media}.
|
|
|
|
To delete all versions of the file @file{blues} from the archive
|
|
@file{collection.tar} in the @file{practice} directory, make sure you
|
|
are in that directory, and then,
|
|
|
|
@smallexample
|
|
$ @kbd{tar --list --file=collection.tar}
|
|
blues
|
|
folk
|
|
jazz
|
|
rock
|
|
$ @kbd{tar --delete --file=collection.tar blues}
|
|
$ @kbd{tar --list --file=collection.tar}
|
|
folk
|
|
jazz
|
|
rock
|
|
@end smallexample
|
|
|
|
@FIXME{Check if the above listing is actually produced after running
|
|
all the examples on collection.tar.}
|
|
|
|
The @option{--delete} option has been reported to work properly when
|
|
@command{tar} acts as a filter from @code{stdin} to @code{stdout}.
|
|
|
|
@node compare
|
|
@subsection Comparing Archive Members with the File System
|
|
@cindex Verifying the currency of an archive
|
|
|
|
@opindex compare
|
|
The @option{--compare} (@option{-d}), or @option{--diff} operation compares
|
|
specified archive members against files with the same names, and then
|
|
reports differences in file size, mode, owner, modification date and
|
|
contents. You should @emph{only} specify archive member names, not file
|
|
names. If you do not name any members, then @command{tar} will compare the
|
|
entire archive. If a file is represented in the archive but does not
|
|
exist in the file system, @command{tar} reports a difference.
|
|
|
|
You have to specify the record size of the archive when modifying an
|
|
archive with a non-default record size.
|
|
|
|
@command{tar} ignores files in the file system that do not have
|
|
corresponding members in the archive.
|
|
|
|
The following example compares the archive members @file{rock},
|
|
@file{blues} and @file{funk} in the archive @file{bluesrock.tar} with
|
|
files of the same name in the file system. (Note that there is no file,
|
|
@file{funk}; @command{tar} will report an error message.)
|
|
|
|
@smallexample
|
|
$ @kbd{tar --compare --file=bluesrock.tar rock blues funk}
|
|
rock
|
|
blues
|
|
tar: funk not found in archive
|
|
@end smallexample
|
|
|
|
The spirit behind the @option{--compare} (@option{--diff},
|
|
@option{-d}) option is to check whether the archive represents the
|
|
current state of files on disk, more than validating the integrity of
|
|
the archive media. For this latter goal, see @ref{verify}.
|
|
|
|
@node create options
|
|
@section Options Used by @option{--create}
|
|
|
|
@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.
|
|
* Extended File Attributes::
|
|
* 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 an 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,
|
|
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
|
|
|
|
@noindent
|
|
When used with @option{--clamp-mtime} @GNUTAR{} will only set the
|
|
modification date to @var{date} on files whose actual modification
|
|
date is later than @var{date}. This is to make it easy to build
|
|
reproducible archives given a common timestamp for generated files
|
|
while still retaining the original timestamps of untouched files.
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f archive.tar --clamp-mtime --mtime=@@$SOURCE_DATE_EPOCH .}
|
|
@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.
|
|
|
|
If @var{user} contains a colon, it is taken to be of the form
|
|
@var{name}:@var{id} where a nonempty @var{name} specifies the user
|
|
name and a nonempty @var{id} specifies the decimal numeric user
|
|
@acronym{ID}. If @var{user} does not contain a colon, it is taken to
|
|
be a user number if it is one or more decimal digits; otherwise it is
|
|
taken to be a user name.
|
|
|
|
If a name is given but no number, the number is inferred from the
|
|
current host's user database if possible, and the file's user number
|
|
is used otherwise. If a number is given but no name, the name is
|
|
inferred from the number if possible, and an empty name is used
|
|
otherwise. If both name and number are given, the user database is
|
|
not consulted, and the name and number need not be valid on the
|
|
current host.
|
|
|
|
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
|
|
$ @kbd{tar -c -f archive.tar --owner=0 .}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
or:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f archive.tar --owner=root .}
|
|
@end smallexample
|
|
|
|
@item --group=@var{group}
|
|
@opindex group
|
|
|
|
Files added to the @command{tar} archive will have a group @acronym{ID} of @var{group},
|
|
rather than the group from the source file. As with @option{--owner},
|
|
the argument @var{group} can be an existing group symbolic name, or a
|
|
decimal numeric group @acronym{ID}, or @var{name}:@var{id}.
|
|
@end table
|
|
|
|
The @option{--owner} and @option{--group} options affect all files
|
|
added to the archive. @GNUTAR{} provides also two options that allow
|
|
for more detailed control over owner translation:
|
|
|
|
@table @option
|
|
@item --owner-map=@var{file}
|
|
Read UID translation map from @var{file}.
|
|
|
|
When reading, empty lines are ignored. The @samp{#} sign, unless
|
|
quoted, introduces a comment, which extends to the end of the line.
|
|
Each nonempty line defines mapping for a single UID. It must consist
|
|
of two fields separated by any amount of whitespace. The first field
|
|
defines original username and UID. It can be a valid user name or
|
|
a valid UID prefixed with a plus sign. In both cases the
|
|
corresponding UID or user name is inferred from the current host's
|
|
user database.
|
|
|
|
The second field defines the UID and username to map the original one
|
|
to. Its format can be the same as described above. Otherwise, it can
|
|
have the form @var{newname}:@var{newuid}, in which case neither
|
|
@var{newname} nor @var{newuid} are required to be valid as per the
|
|
user database.
|
|
|
|
For example, consider the following file:
|
|
|
|
@example
|
|
+10 bin
|
|
smith root:0
|
|
@end example
|
|
|
|
@noindent
|
|
Given this file, each input file that is owner by UID 10 will be
|
|
stored in archive with owner name @samp{bin} and owner UID
|
|
corresponding to @samp{bin}. Each file owned by user @samp{smith}
|
|
will be stored with owner name @samp{root} and owner ID 0. Other
|
|
files will remain unchanged.
|
|
|
|
When used together with @option{--owner-map}, the @option{--owner}
|
|
option affects only files whose owner is not listed in the map file.
|
|
|
|
@item --group-map=@var{file}
|
|
Read GID translation map from @var{file}.
|
|
|
|
The format of @var{file} is the same as for @option{--owner-map}
|
|
option:
|
|
|
|
Each nonempty line defines mapping for a single GID. It must consist
|
|
of two fields separated by any amount of whitespace. The first field
|
|
defines original group name and GID. It can be a valid group name or
|
|
a valid GID prefixed with a plus sign. In both cases the
|
|
corresponding GID or user name is inferred from the current host's
|
|
group database.
|
|
|
|
The second field defines the GID and group name to map the original one
|
|
to. Its format can be the same as described above. Otherwise, it can
|
|
have the form @var{newname}:@var{newgid}, in which case neither
|
|
@var{newname} nor @var{newgid} are required to be valid as per the
|
|
group database.
|
|
|
|
When used together with @option{--group-map}, the @option{--group}
|
|
option affects only files whose owner group is not rewritten using the
|
|
map file.
|
|
@end table
|
|
|
|
@node Extended File Attributes
|
|
@subsection Extended File Attributes
|
|
|
|
Extended file attributes are name-value pairs that can be
|
|
associated with each node in a file system. Despite the fact that
|
|
POSIX.1e draft which proposed them has been withdrawn, the extended
|
|
file attributes are supported by many file systems. @GNUTAR{} can
|
|
store extended file attributes along with the files. This feature is
|
|
controlled by the following command line arguments:
|
|
|
|
@table @option
|
|
@item --xattrs
|
|
Enable extended attributes support. When used with @option{--create},
|
|
this option instructs @GNUTAR{} to store extended file attribute in the
|
|
created archive. This implies POSIX.1-2001 archive format
|
|
(@option{--format=pax}).
|
|
|
|
When used with @option{--extract}, this option tells @command{tar},
|
|
for each file extracted, to read stored attributes from the archive
|
|
and to apply them to the file.
|
|
|
|
@item --no-xattrs
|
|
Disable extended attributes support. This is the default.
|
|
@end table
|
|
|
|
Attribute names are strings prefixed by a @dfn{namespace} name and a dot.
|
|
Currently, four namespaces exist: @samp{user}, @samp{trusted},
|
|
@samp{security} and @samp{system}. By default, when @option{--xattr}
|
|
is used, all names are stored in the archive (or extracted, if using
|
|
@option{--extract}). This can be controlled using the following
|
|
options:
|
|
|
|
@table @option
|
|
@item --xattrs-exclude=@var{pattern}
|
|
Specify exclude pattern for extended attributes.
|
|
|
|
@item --xattrs-include=@var{pattern}
|
|
Specify include pattern for extended attributes.
|
|
@end table
|
|
|
|
Here, the @var{pattern} is a globbing pattern. For example, the
|
|
following command:
|
|
|
|
@example
|
|
$ @kbd{tar --xattrs --xattrs-exclude='user.*' -cf a.tar .}
|
|
@end example
|
|
|
|
will include in the archive @file{a.tar} all attributes, except those
|
|
from the @samp{user} namespace.
|
|
|
|
Any number of these options can be given, thereby creating lists of
|
|
include and exclude patterns.
|
|
|
|
When both options are used, first @option{--xattrs-include} is applied
|
|
to select the set of attribute names to keep, and then
|
|
@option{--xattrs-exclude} is applied to the resulting set. In other
|
|
words, only those attributes will be stored, whose names match one
|
|
of the regexps in @option{--xattrs-include} and don't match any of
|
|
the regexps from @option{--xattrs-exclude}.
|
|
|
|
When listing the archive, if both @option{--xattrs} and
|
|
@option{--verbose} options are given, files that have extended
|
|
attributes are marked with an asterisk following their permission
|
|
mask. For example:
|
|
|
|
@example
|
|
-rw-r--r--* smith/users 110 2016-03-16 16:07 file
|
|
@end example
|
|
|
|
When two or more @option{--verbose} options are given, a detailed
|
|
listing of extended attributes is printed after each file entry. Each
|
|
attribute is listed on a separate line, which begins with two spaces
|
|
and the letter @samp{x} indicating extended attribute. It is followed
|
|
by a colon, length of the attribute and its name, e.g.:
|
|
|
|
@example
|
|
-rw-r--r--* smith/users 110 2016-03-16 16:07 file
|
|
x: 7 user.mime_type
|
|
x: 32 trusted.md5sum
|
|
@end example
|
|
|
|
File access control lists (@dfn{ACL}) are another actively used feature
|
|
proposed by the POSIX.1e standard. Each ACL consists of a set of ACL
|
|
entries, each of which describes the access permissions on the file for
|
|
an individual user or a group of users as a combination of read, write
|
|
and search/execute permissions.
|
|
|
|
Whether or not to use ACLs is controlled by the following two options:
|
|
|
|
@table @option
|
|
@item --acls
|
|
Enable POSIX ACLs support. When used with @option{--create},
|
|
this option instructs @GNUTAR{} to store ACLs in the
|
|
created archive. This implies POSIX.1-2001 archive format
|
|
(@option{--format=pax}).
|
|
|
|
When used with @option{--extract}, this option tells @command{tar},
|
|
to restore ACLs for each file extracted (provided they are present
|
|
in the archive).
|
|
|
|
@item --no-acls
|
|
Disable POSIX ACLs support. This is the default.
|
|
@end table
|
|
|
|
When listing the archive, if both @option{--acls} and
|
|
@option{--verbose} options are given, files that have ACLs are marked
|
|
with a plus sign following their permission mask. For example:
|
|
|
|
@example
|
|
-rw-r--r--+ smith/users 110 2016-03-16 16:07 file
|
|
@end example
|
|
|
|
When two or more @option{--verbose} options are given, a detailed
|
|
listing of ACL is printed after each file entry:
|
|
|
|
@example
|
|
@group
|
|
-rw-r--r--+ smith/users 110 2016-03-16 16:07 file
|
|
a: user::rw-,user:gray:-w-,group::r--,mask::rw-,other::r--
|
|
@end group
|
|
@end example
|
|
|
|
@dfn{Security-Enhanced Linux} (@dfn{SELinux} for short) is a Linux
|
|
kernel security module that provides a mechanism for supporting access
|
|
control security policies, including so-called mandatory access
|
|
controls (@dfn{MAC}). Support for SELinux attributes is controlled by
|
|
the following command line options:
|
|
|
|
@table @option
|
|
@item --selinux
|
|
Enable the SELinux context support.
|
|
|
|
@item --no-selinux
|
|
Disable SELinux context support.
|
|
@end table
|
|
|
|
@node Ignore Failed Read
|
|
@subsection Ignore Failed Read
|
|
|
|
@table @option
|
|
@item --ignore-failed-read
|
|
@opindex ignore-failed-read
|
|
Do not exit with nonzero if there are mild problems while reading.
|
|
@end table
|
|
|
|
This option has effect only during creation. It instructs tar to
|
|
treat as mild conditions any missing or unreadable files (directories),
|
|
or files that change while reading.
|
|
Such failures don't affect the program exit code, and the
|
|
corresponding diagnostic messages are marked as warnings, not errors.
|
|
These warnings can be suppressed using the
|
|
@option{--warning=failed-read} option (@pxref{warnings}).
|
|
|
|
@node extract options
|
|
@section Options Used by @option{--extract}
|
|
@cindex options for use with @option{--extract}
|
|
|
|
@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,
|
|
the permissions, the modification date, and so forth. This section
|
|
presents options to be used with @option{--extract} when certain special
|
|
considerations arise. You may review the information presented in
|
|
@ref{extract} for more basic information about the
|
|
@option{--extract} operation.
|
|
|
|
@menu
|
|
* Reading:: Options to Help Read Archives
|
|
* Writing:: Changing How @command{tar} Writes Files
|
|
* Scarce:: Coping with Scarce Resources
|
|
@end menu
|
|
|
|
@node Reading
|
|
@subsection Options to Help Read Archives
|
|
@cindex Options when reading archives
|
|
|
|
@cindex Reading incomplete records
|
|
@cindex Records, incomplete
|
|
@opindex read-full-records
|
|
Normally, @command{tar} will request data in full record increments from
|
|
an archive storage device. If the device cannot return a full record,
|
|
@command{tar} will report an error. However, some devices do not always
|
|
return full records, or do not require the last record of an archive to
|
|
be padded out to the next record boundary. To keep reading until you
|
|
obtain a full record, or to accept an incomplete record if it contains
|
|
an end-of-archive marker, specify the @option{--read-full-records} (@option{-B}) option
|
|
in conjunction with the @option{--extract} or @option{--list} operations.
|
|
@xref{Blocking}.
|
|
|
|
The @option{--read-full-records} (@option{-B}) option is turned on by default when
|
|
@command{tar} reads an archive from standard input, or from a remote
|
|
machine. This is because on @acronym{BSD} Unix systems, attempting to read a
|
|
pipe returns however much happens to be in the pipe, even if it is
|
|
less than was requested. If this option were not enabled, @command{tar}
|
|
would fail as soon as it read an incomplete record from the pipe.
|
|
|
|
If you're not sure of the blocking factor of an archive, you can
|
|
read the archive by specifying @option{--read-full-records} (@option{-B}) and
|
|
@option{--blocking-factor=@var{512-size}} (@option{-b
|
|
@var{512-size}}), using a blocking factor larger than what the archive
|
|
uses. This lets you avoid having to determine the blocking factor
|
|
of an archive. @xref{Blocking Factor}.
|
|
|
|
@menu
|
|
* read full records::
|
|
* Ignore Zeros::
|
|
@end menu
|
|
|
|
@node read full records
|
|
@unnumberedsubsubsec Reading Full Records
|
|
|
|
@FIXME{need sentence or so of intro here}
|
|
|
|
@table @option
|
|
@opindex read-full-records
|
|
@item --read-full-records
|
|
@item -B
|
|
Use in conjunction with @option{--extract} (@option{--get},
|
|
@option{-x}) to read an archive which contains incomplete records, or
|
|
one which has a blocking factor less than the one specified.
|
|
@end table
|
|
|
|
@node Ignore Zeros
|
|
@unnumberedsubsubsec Ignoring Blocks of Zeros
|
|
|
|
@cindex End-of-archive blocks, ignoring
|
|
@cindex Ignoring end-of-archive blocks
|
|
@opindex ignore-zeros
|
|
Normally, @command{tar} stops reading when it encounters a block of zeros
|
|
between file entries (which usually indicates the end of the archive).
|
|
@option{--ignore-zeros} (@option{-i}) allows @command{tar} to
|
|
completely read an archive which contains a block of zeros before the
|
|
end (i.e., a damaged archive, or one that was created by concatenating
|
|
several archives together). This option also suppresses warnings
|
|
about missing or incomplete zero blocks at the end of the archive.
|
|
This can be turned on, if the need be, using the
|
|
@option{--warning=alone-zero-block --warning=missing-zero-blocks}
|
|
options (@pxref{warnings}).
|
|
|
|
The @option{--ignore-zeros} (@option{-i}) option is turned off by default because many
|
|
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 compatibility among archiving utilities.
|
|
|
|
@table @option
|
|
@item --ignore-zeros
|
|
@itemx -i
|
|
To ignore blocks of zeros (i.e., end-of-archive entries) which may be
|
|
encountered while reading an archive. Use in conjunction with
|
|
@option{--extract} or @option{--list}.
|
|
@end table
|
|
|
|
@node Writing
|
|
@subsection Changing How @command{tar} Writes Files
|
|
@UNREVISED{}
|
|
|
|
@FIXME{Introductory paragraph}
|
|
|
|
@menu
|
|
* Dealing with Old Files::
|
|
* Overwrite Old Files::
|
|
* Keep Old Files::
|
|
* Keep Newer Files::
|
|
* Unlink First::
|
|
* Recursive Unlink::
|
|
* Data Modification Times::
|
|
* Setting Access Permissions::
|
|
* Directory Modification Times and Permissions::
|
|
* Writing to Standard Output::
|
|
* Writing to an External Program::
|
|
* remove files::
|
|
@end menu
|
|
|
|
@node Dealing with Old Files
|
|
@unnumberedsubsubsec Options Controlling the Overwriting of Existing Files
|
|
|
|
@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
|
|
links. (If the existing file is a symbolic link, it is removed, not
|
|
followed.) However, if a directory cannot be removed because it is
|
|
nonempty, @command{tar} normally overwrites its metadata (ownership,
|
|
permission, etc.). The @option{--overwrite-dir} option enables this
|
|
default behavior. To be more cautious and preserve the metadata of
|
|
such a directory, use the @option{--no-overwrite-dir} option.
|
|
|
|
@cindex Overwriting old files, prevention
|
|
@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. For
|
|
example:
|
|
|
|
@example
|
|
$ @kbd{ls}
|
|
blues
|
|
$ @kbd{tar -x -k -f archive.tar}
|
|
tar: blues: Cannot open: File exists
|
|
tar: Exiting with failure status due to previous errors
|
|
@end example
|
|
|
|
@xopindex{skip-old-files, introduced}
|
|
If you wish to preserve old files untouched, but don't want
|
|
@command{tar} to treat them as errors, use the
|
|
@option{--skip-old-files} option. This option causes @command{tar} to
|
|
silently skip extracting over existing files.
|
|
|
|
@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.
|
|
|
|
@cindex Protecting old files
|
|
Some people argue that @GNUTAR{} should not hesitate
|
|
to overwrite files with other files when extracting. When extracting
|
|
a @command{tar} archive, they expect to see a faithful copy of the
|
|
state of the file system when the archive was created. It is debatable
|
|
that this would always be a proper behavior. For example, suppose one
|
|
has an archive in which @file{usr/local} is a link to
|
|
@file{usr/local2}. Since then, maybe the site removed the link and
|
|
renamed the whole hierarchy from @file{/usr/local2} to
|
|
@file{/usr/local}. Such things happen all the time. I guess it would
|
|
not be welcome at all that @GNUTAR{} removes the
|
|
whole hierarchy just to make room for the link to be reinstated
|
|
(unless it @emph{also} simultaneously restores the full
|
|
@file{/usr/local2}, of course!) @GNUTAR{} is indeed
|
|
able to remove a whole hierarchy to reestablish a symbolic link, for
|
|
example, but @emph{only if} @option{--recursive-unlink} is specified
|
|
to allow this behavior. In any case, single files are silently
|
|
removed.
|
|
|
|
@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.
|
|
|
|
@node Overwrite Old Files
|
|
@unnumberedsubsubsec Overwrite Old Files
|
|
|
|
@table @option
|
|
@opindex overwrite
|
|
@item --overwrite
|
|
Overwrite existing files and directory metadata when extracting files
|
|
from an archive.
|
|
|
|
This causes @command{tar} to write extracted files into the file system without
|
|
regard to the files already on the system; i.e., files with the same
|
|
names as archive members are overwritten when the archive is extracted.
|
|
It also causes @command{tar} to extract the ownership, permissions,
|
|
and time stamps onto any preexisting files or directories.
|
|
If the name of a corresponding file name is a symbolic link, the file
|
|
pointed to by the symbolic link will be overwritten instead of the
|
|
symbolic link itself (if this is possible). Moreover, special devices,
|
|
empty directories and even symbolic links are automatically removed if
|
|
they are in the way of extraction.
|
|
|
|
Be careful when using the @option{--overwrite} option, particularly when
|
|
combined with the @option{--absolute-names} (@option{-P}) option, as this combination
|
|
can change the contents, ownership or permissions of any file on your
|
|
system. Also, many systems do not take kindly to overwriting files that
|
|
are currently being executed.
|
|
|
|
@opindex overwrite-dir
|
|
@item --overwrite-dir
|
|
Overwrite the metadata of directories when extracting files from an
|
|
archive, but remove other files before extracting.
|
|
@end table
|
|
|
|
@node Keep Old Files
|
|
@unnumberedsubsubsec Keep Old Files
|
|
|
|
@GNUTAR{} provides two options to control its actions in a situation
|
|
when it is about to extract a file which already exists on disk.
|
|
|
|
@table @option
|
|
@opindex keep-old-files
|
|
@item --keep-old-files
|
|
@itemx -k
|
|
Do not replace existing files from archive. When such a file is
|
|
encountered, @command{tar} issues an error message. Upon end of
|
|
extraction, @command{tar} exits with code 2 (@pxref{exit status}).
|
|
|
|
@item --skip-old-files
|
|
Do not replace existing files from archive, but do not treat that
|
|
as error. Such files are silently skipped and do not affect
|
|
@command{tar} exit status.
|
|
|
|
Additional verbosity can be obtained using @option{--warning=existing-file}
|
|
together with that option (@pxref{warnings}).
|
|
@end table
|
|
|
|
@node Keep Newer Files
|
|
@unnumberedsubsubsec Keep Newer Files
|
|
|
|
@table @option
|
|
@opindex keep-newer-files
|
|
@item --keep-newer-files
|
|
Do not replace existing files that are newer than their archive
|
|
copies. This option is meaningless with @option{--list} (@option{-t}).
|
|
@end table
|
|
|
|
@node Unlink First
|
|
@unnumberedsubsubsec Unlink First
|
|
|
|
@table @option
|
|
@opindex unlink-first
|
|
@item --unlink-first
|
|
@itemx -U
|
|
Remove files before extracting over them.
|
|
This can make @command{tar} run a bit faster if you know in advance
|
|
that the extracted files all need to be removed. Normally this option
|
|
slows @command{tar} down slightly, so it is disabled by default.
|
|
@end table
|
|
|
|
@node Recursive Unlink
|
|
@unnumberedsubsubsec Recursive Unlink
|
|
|
|
@table @option
|
|
@opindex recursive-unlink
|
|
@item --recursive-unlink
|
|
When this option is specified, try removing files and directory hierarchies
|
|
before extracting over them. @emph{This is a dangerous option!}
|
|
@end table
|
|
|
|
If you specify the @option{--recursive-unlink} option,
|
|
@command{tar} removes @emph{anything} that keeps you from extracting a file
|
|
as far as current permissions will allow it. This could include removal
|
|
of the contents of a full directory hierarchy.
|
|
|
|
@node Data Modification Times
|
|
@unnumberedsubsubsec Setting Data Modification Times
|
|
|
|
@cindex Data modification times of extracted files
|
|
@cindex Modification times of extracted files
|
|
Normally, @command{tar} sets the data modification times of extracted
|
|
files to the corresponding times recorded for the files in the archive, but
|
|
limits the permissions of extracted files by the current @code{umask}
|
|
setting.
|
|
|
|
To set the data modification times of extracted files to the time when
|
|
the files were extracted, use the @option{--touch} (@option{-m}) option in
|
|
conjunction with @option{--extract} (@option{--get}, @option{-x}).
|
|
|
|
@table @option
|
|
@opindex touch
|
|
@item --touch
|
|
@itemx -m
|
|
Sets the data modification time of extracted archive members to the time
|
|
they were extracted, not the time recorded for them in the archive.
|
|
Use in conjunction with @option{--extract} (@option{--get}, @option{-x}).
|
|
@end table
|
|
|
|
@node Setting Access Permissions
|
|
@unnumberedsubsubsec Setting Access Permissions
|
|
|
|
@cindex Permissions of extracted files
|
|
@cindex Modes of extracted files
|
|
To set the modes (access permissions) of extracted files to those
|
|
recorded for those files in the archive, use @option{--same-permissions}
|
|
in conjunction with the @option{--extract} (@option{--get},
|
|
@option{-x}) operation.
|
|
|
|
@table @option
|
|
@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
|
|
archive, instead of current umask settings. Use in conjunction with
|
|
@option{--extract} (@option{--get}, @option{-x}).
|
|
@end table
|
|
|
|
@node Directory Modification Times and Permissions
|
|
@unnumberedsubsubsec Directory Modification Times and Permissions
|
|
|
|
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
|
|
extract files into that directory and this will cause the directory
|
|
modification time to be updated. Moreover, restoring that directory
|
|
permissions may not permit file creation within it. Thus, restoring
|
|
directory permissions and modification times must be delayed at least
|
|
until all files have been extracted into that directory. @GNUTAR{}
|
|
restores directories using the following approach.
|
|
|
|
The extracted directories are created with the mode specified in the
|
|
archive, as modified by the umask of the user, which gives sufficient
|
|
permissions to allow file creation. The meta-information about the
|
|
directory is recorded in the temporary list of directories. When
|
|
preparing to extract next archive member, @GNUTAR{} checks if the
|
|
directory prefix of this file contains the remembered directory. If
|
|
it does not, the program assumes that all files have been extracted
|
|
into that directory, restores its modification time and permissions
|
|
and removes its entry from the internal list. This approach allows
|
|
to correctly restore directory meta-information in the majority of
|
|
cases, while keeping memory requirements sufficiently small. It is
|
|
based on the fact, that most @command{tar} archives use the predefined
|
|
order of members: first the directory, then all the files and
|
|
subdirectories in that directory.
|
|
|
|
However, this is not always true. The most important exception are
|
|
incremental archives (@pxref{Incremental Dumps}). The member order in
|
|
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
|
|
remembers all restored directories, and restores their meta-data
|
|
only after the entire archive has been processed. Notice, that you do
|
|
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
|
|
too. Consider the following example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --no-recursion -cvf archive \
|
|
foo foo/file1 bar bar/file foo/file2}
|
|
foo/
|
|
foo/file1
|
|
bar/
|
|
bar/file
|
|
foo/file2
|
|
@end group
|
|
@end smallexample
|
|
|
|
During the normal operation, after encountering @file{bar}
|
|
@GNUTAR{} will assume that all files from the directory @file{foo}
|
|
were already extracted and will therefore restore its timestamp and
|
|
permission bits. However, after extracting @file{foo/file2} the
|
|
directory timestamp will be offset again.
|
|
|
|
To correctly restore directory meta-information in such cases, use
|
|
the @option{--delay-directory-restore} command line option:
|
|
|
|
@table @option
|
|
@opindex delay-directory-restore
|
|
@item --delay-directory-restore
|
|
Delays restoring of the modification times and permissions of extracted
|
|
directories until the end of extraction. This way, correct
|
|
meta-information is restored even if the archive has unusual member
|
|
ordering.
|
|
|
|
@opindex no-delay-directory-restore
|
|
@item --no-delay-directory-restore
|
|
Cancel the effect of the previous @option{--delay-directory-restore}.
|
|
Use this option if you have used @option{--delay-directory-restore} in
|
|
@env{TAR_OPTIONS} variable (@pxref{TAR_OPTIONS}) and wish to
|
|
temporarily disable it.
|
|
@end table
|
|
|
|
@node Writing to Standard Output
|
|
@unnumberedsubsubsec Writing to Standard Output
|
|
|
|
@cindex Writing extracted files to standard output
|
|
@cindex Standard output, writing extracted files to
|
|
To write the extracted files to the standard output, instead of
|
|
creating the files on the file system, use @option{--to-stdout} (@option{-O}) in
|
|
conjunction with @option{--extract} (@option{--get}, @option{-x}). This option is useful if you are
|
|
extracting files to send them through a pipe, and do not need to
|
|
preserve them in the file system. If you extract multiple members,
|
|
they appear on standard output concatenated, in the order they are
|
|
found in the archive.
|
|
|
|
@table @option
|
|
@opindex to-stdout
|
|
@item --to-stdout
|
|
@itemx -O
|
|
Writes files to the standard output. Use only in conjunction with
|
|
@option{--extract} (@option{--get}, @option{-x}). When this option is
|
|
used, instead of creating the files specified, @command{tar} writes
|
|
the contents of the files extracted to its standard output. This may
|
|
be useful if you are only extracting the files in order to send them
|
|
through a pipe. This option is meaningless with @option{--list}
|
|
(@option{-t}).
|
|
@end table
|
|
|
|
This can be useful, for example, if you have a tar archive containing
|
|
a big file and don't want to store the file on disk before processing
|
|
it. You can use a command like this:
|
|
|
|
@smallexample
|
|
tar -xOzf foo.tgz bigfile | process
|
|
@end smallexample
|
|
|
|
or even like this if you want to process the concatenation of the files:
|
|
|
|
@smallexample
|
|
tar -xOzf foo.tgz bigfile1 bigfile2 | process
|
|
@end smallexample
|
|
|
|
However, @option{--to-command} may be more convenient for use with
|
|
multiple files. See the next section.
|
|
|
|
@node Writing to an External Program
|
|
@unnumberedsubsubsec Writing to an External Program
|
|
|
|
You can instruct @command{tar} to send the contents of each extracted
|
|
file to the standard input of an external program:
|
|
|
|
@table @option
|
|
@opindex to-command
|
|
@item --to-command=@var{command}
|
|
Extract files and pipe their contents to the standard input of
|
|
@var{command}. When this option is used, instead of creating the
|
|
files specified, @command{tar} invokes @var{command} and pipes the
|
|
contents of the files to its standard output. The @var{command} may
|
|
contain command line arguments (see @ref{external, Running External Commands},
|
|
for more detail).
|
|
|
|
Notice, that @var{command} is executed once for each regular file
|
|
extracted. Non-regular files (directories, etc.)@: are ignored when this
|
|
option is used.
|
|
@end table
|
|
|
|
The command can obtain the information about the file it processes
|
|
from the following environment variables:
|
|
|
|
@table @env
|
|
@vrindex TAR_FILETYPE, to-command environment
|
|
@item TAR_FILETYPE
|
|
Type of the file. It is a single letter with the following meaning:
|
|
|
|
@multitable @columnfractions 0.10 0.90
|
|
@item f @tab Regular file
|
|
@item d @tab Directory
|
|
@item l @tab Symbolic link
|
|
@item h @tab Hard link
|
|
@item b @tab Block device
|
|
@item c @tab Character device
|
|
@end multitable
|
|
|
|
Currently only regular files are supported.
|
|
|
|
@vrindex TAR_MODE, to-command environment
|
|
@item TAR_MODE
|
|
File mode, an octal number.
|
|
|
|
@vrindex TAR_FILENAME, to-command environment
|
|
@item TAR_FILENAME
|
|
The name of the file.
|
|
|
|
@vrindex TAR_REALNAME, to-command environment
|
|
@item TAR_REALNAME
|
|
Name of the file as stored in the archive.
|
|
|
|
@vrindex TAR_UNAME, to-command environment
|
|
@item TAR_UNAME
|
|
Name of the file owner.
|
|
|
|
@vrindex TAR_GNAME, to-command environment
|
|
@item TAR_GNAME
|
|
Name of the file owner group.
|
|
|
|
@vrindex TAR_ATIME, to-command environment
|
|
@item TAR_ATIME
|
|
Time of last access. It is a decimal number, representing seconds
|
|
since the Epoch. If the archive provides times with nanosecond
|
|
precision, the nanoseconds are appended to the timestamp after a
|
|
decimal point.
|
|
|
|
@vrindex TAR_MTIME, to-command environment
|
|
@item TAR_MTIME
|
|
Time of last modification.
|
|
|
|
@vrindex TAR_CTIME, to-command environment
|
|
@item TAR_CTIME
|
|
Time of last status change.
|
|
|
|
@vrindex TAR_SIZE, to-command environment
|
|
@item TAR_SIZE
|
|
Size of the file.
|
|
|
|
@vrindex TAR_UID, to-command environment
|
|
@item TAR_UID
|
|
UID of the file owner.
|
|
|
|
@vrindex TAR_GID, to-command environment
|
|
@item TAR_GID
|
|
GID of the file owner.
|
|
@end table
|
|
|
|
Additionally, the following variables contain information about
|
|
tar mode and the archive being processed:
|
|
|
|
@table @env
|
|
@vrindex TAR_VERSION, to-command environment
|
|
@item TAR_VERSION
|
|
@GNUTAR{} version number.
|
|
|
|
@vrindex TAR_ARCHIVE, to-command environment
|
|
@item TAR_ARCHIVE
|
|
The name of the archive @command{tar} is processing.
|
|
|
|
@vrindex TAR_BLOCKING_FACTOR, to-command environment
|
|
@item TAR_BLOCKING_FACTOR
|
|
Current blocking factor (@pxref{Blocking}).
|
|
|
|
@vrindex TAR_VOLUME, to-command environment
|
|
@item TAR_VOLUME
|
|
Ordinal number of the volume @command{tar} is processing.
|
|
|
|
@vrindex TAR_FORMAT, to-command environment
|
|
@item TAR_FORMAT
|
|
Format of the archive being processed. @xref{Formats}, for a complete
|
|
list of archive format names.
|
|
@end table
|
|
|
|
These variables are defined prior to executing the command, so you can
|
|
pass them as arguments, if you prefer. For example, if the command
|
|
@var{proc} takes the member name and size as its arguments, then you
|
|
could do:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -x -f archive.tar \
|
|
--to-command='proc $TAR_FILENAME $TAR_SIZE'}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice single quotes to prevent variable names from being expanded by
|
|
the shell when invoking @command{tar}.
|
|
|
|
If @var{command} exits with a non-0 status, @command{tar} will print
|
|
an error message similar to the following:
|
|
|
|
@smallexample
|
|
tar: 2345: Child returned status 1
|
|
@end smallexample
|
|
|
|
Here, @samp{2345} is the PID of the finished process.
|
|
|
|
If this behavior is not wanted, use @option{--ignore-command-error}:
|
|
|
|
@table @option
|
|
@opindex ignore-command-error
|
|
@item --ignore-command-error
|
|
Ignore exit codes of subprocesses. Notice that if the program
|
|
exits on signal or otherwise terminates abnormally, the error message
|
|
will be printed even if this option is used.
|
|
|
|
@opindex no-ignore-command-error
|
|
@item --no-ignore-command-error
|
|
Cancel the effect of any previous @option{--ignore-command-error}
|
|
option. This option is useful if you have set
|
|
@option{--ignore-command-error} in @env{TAR_OPTIONS}
|
|
(@pxref{TAR_OPTIONS}) and wish to temporarily cancel it.
|
|
@end table
|
|
|
|
@node remove files
|
|
@unnumberedsubsubsec Removing Files
|
|
|
|
@FIXME{The section is too terse. Something more to add? An example,
|
|
maybe?}
|
|
|
|
@table @option
|
|
@opindex remove-files
|
|
@item --remove-files
|
|
Remove files after adding them to the archive.
|
|
@end table
|
|
|
|
@node Scarce
|
|
@subsection Coping with Scarce Resources
|
|
@UNREVISED{}
|
|
|
|
@cindex Small memory
|
|
@cindex Running out of space
|
|
|
|
@menu
|
|
* Starting File::
|
|
* Same Order::
|
|
@end menu
|
|
|
|
@node Starting File
|
|
@unnumberedsubsubsec Starting File
|
|
|
|
@table @option
|
|
@opindex starting-file
|
|
@item --starting-file=@var{name}
|
|
@itemx -K @var{name}
|
|
Starts an operation in the middle of an archive. Use in conjunction
|
|
with @option{--extract} (@option{--get}, @option{-x}) or @option{--list} (@option{-t}).
|
|
@end table
|
|
|
|
@cindex Middle of the archive, starting in the
|
|
If a previous attempt to extract files failed due to lack of disk
|
|
space, you can use @option{--starting-file=@var{name}} (@option{-K
|
|
@var{name}}) to start extracting only after member @var{name} of the
|
|
archive. This assumes, of course, that there is now free space, or
|
|
that you are now extracting into a different file system. (You could
|
|
also choose to suspend @command{tar}, remove unnecessary files from
|
|
the file system, and then resume the same @command{tar} operation.
|
|
In this case, @option{--starting-file} is not necessary.) See also
|
|
@ref{interactive}, and @ref{exclude}.
|
|
|
|
@node Same Order
|
|
@unnumberedsubsubsec Same Order
|
|
|
|
@table @option
|
|
@cindex Large lists of file names on small machines
|
|
@opindex same-order
|
|
@opindex preserve-order
|
|
@item --same-order
|
|
@itemx --preserve-order
|
|
@itemx -s
|
|
To process large lists of file names on machines with small amounts of
|
|
memory. Use in conjunction with @option{--compare} (@option{--diff},
|
|
@option{-d}), @option{--list} (@option{-t}) or @option{--extract}
|
|
(@option{--get}, @option{-x}).
|
|
@end table
|
|
|
|
The @option{--same-order} (@option{--preserve-order}, @option{-s}) option tells @command{tar} that the list of file
|
|
names to be listed or extracted is sorted in the same order as the
|
|
files in the archive. This allows a large list of names to be used,
|
|
even on a small machine that would not otherwise be able to hold all
|
|
the names in memory at the same time. Such a sorted list can easily be
|
|
created by running @samp{tar -t} on the archive and editing its output.
|
|
|
|
This option is probably never needed on modern computer systems.
|
|
|
|
@node backup
|
|
@section Backup options
|
|
|
|
@cindex backup options
|
|
|
|
@GNUTAR{} offers options for making backups of files
|
|
before writing new versions. These options control the details of
|
|
these backups. They may apply to the archive itself before it is
|
|
created or rewritten, as well as individual extracted members. Other
|
|
@acronym{GNU} programs (@command{cp}, @command{install}, @command{ln},
|
|
and @command{mv}, for example) offer similar options.
|
|
|
|
Backup options may prove unexpectedly useful when extracting archives
|
|
containing many members having identical name, or when extracting archives
|
|
on systems having file name limitations, making different members appear
|
|
as having similar names through the side-effect of name truncation.
|
|
@FIXME{This is true only if we have a good scheme for truncated backup names,
|
|
which I'm not sure at all: I suspect work is needed in this area.}
|
|
When any existing file is backed up before being overwritten by extraction,
|
|
then clashing files are automatically be renamed to be unique, and the
|
|
true name is kept for only the last file of a series of clashing files.
|
|
By using verbose mode, users may track exactly what happens.
|
|
|
|
At the detail level, some decisions are still experimental, and may
|
|
change in the future, we are waiting comments from our users. So, please
|
|
do not learn to depend blindly on the details of the backup features.
|
|
For example, currently, directories themselves are never renamed through
|
|
using these options, so, extracting a file over a directory still has
|
|
good chances to fail. Also, backup options apply to created archives,
|
|
not only to extracted members. For created archives, backups will not
|
|
be attempted when the archive is a block or character device, or when it
|
|
refers to a remote file.
|
|
|
|
For the sake of simplicity and efficiency, backups are made by renaming old
|
|
files prior to creation or extraction, and not by copying. The original
|
|
name is restored if the file creation fails. If a failure occurs after a
|
|
partial extraction of a file, both the backup and the partially extracted
|
|
file are kept.
|
|
|
|
@table @samp
|
|
@item --backup[=@var{method}]
|
|
@opindex backup
|
|
@vindex VERSION_CONTROL
|
|
@cindex backups
|
|
Back up files that are about to be overwritten or removed.
|
|
Without this option, the original versions are destroyed.
|
|
|
|
Use @var{method} to determine the type of backups made.
|
|
If @var{method} is not specified, use the value of the @env{VERSION_CONTROL}
|
|
environment variable. And if @env{VERSION_CONTROL} is not set,
|
|
use the @samp{existing} method.
|
|
|
|
@vindex version-control @r{Emacs variable}
|
|
This option corresponds to the Emacs variable @samp{version-control};
|
|
the same values for @var{method} are accepted as in Emacs. This option
|
|
also allows more descriptive names. The valid @var{method}s are:
|
|
|
|
@table @samp
|
|
@item t
|
|
@itemx numbered
|
|
@cindex numbered @r{backup method}
|
|
Always make numbered backups.
|
|
|
|
@item nil
|
|
@itemx existing
|
|
@cindex existing @r{backup method}
|
|
Make numbered backups of files that already have them, simple backups
|
|
of the others.
|
|
|
|
@item never
|
|
@itemx simple
|
|
@cindex simple @r{backup method}
|
|
Always make simple backups.
|
|
|
|
@end table
|
|
|
|
@item --suffix=@var{suffix}
|
|
@opindex suffix
|
|
@cindex backup suffix
|
|
@vindex SIMPLE_BACKUP_SUFFIX
|
|
Append @var{suffix} to each backup file made with @option{--backup}. If this
|
|
option is not specified, the value of the @env{SIMPLE_BACKUP_SUFFIX}
|
|
environment variable is used. And if @env{SIMPLE_BACKUP_SUFFIX} is not
|
|
set, the default is @samp{~}, just as in Emacs.
|
|
|
|
@end table
|
|
|
|
@node looking ahead
|
|
@section Looking Ahead: The Rest of this Manual
|
|
|
|
You have now seen how to use all eight of the operations available to
|
|
@command{tar}, and a number of the possible options. The next chapter
|
|
explains how to choose and change file and archive names, how to use
|
|
files to store names of other files which you can then call as
|
|
arguments to @command{tar} (this can help you save time if you expect to
|
|
archive the same list of files a number of times), and so forth.
|
|
@FIXME{in case it's not obvious, i'm making this up in some sense
|
|
based on my limited memory of what the next chapter *really* does. i
|
|
just wanted to flesh out this final section a little bit so i'd
|
|
remember to stick it in here. :-)}
|
|
|
|
If there are too many files to conveniently list on the command line,
|
|
you can list the names in a file, and @command{tar} will read that file.
|
|
@xref{files}.
|
|
|
|
There are various ways of causing @command{tar} to skip over some files,
|
|
and not archive them. @xref{Choosing}.
|
|
|
|
@node Backups
|
|
@chapter Performing Backups and Restoring Files
|
|
@cindex backups
|
|
|
|
@GNUTAR{} is distributed along with the scripts for performing backups
|
|
and restores. Even if there is a good chance those scripts may be
|
|
satisfying to you, they are not the only scripts or methods available for doing
|
|
backups and restore. You may well create your own, or use more
|
|
sophisticated packages dedicated to that purpose.
|
|
|
|
Some users are enthusiastic about @code{Amanda} (The Advanced Maryland
|
|
Automatic Network Disk Archiver), a backup system developed by James
|
|
da Silva @file{jds@@cs.umd.edu} and available on many Unix systems.
|
|
This is free software, and it is available from @uref{http://www.amanda.org}.
|
|
|
|
@FIXME{
|
|
|
|
Here is a possible plan for a future documentation about the backuping
|
|
scripts which are provided within the @GNUTAR{}
|
|
distribution.
|
|
|
|
@itemize @bullet
|
|
@item dumps
|
|
@itemize @minus
|
|
@item what are dumps
|
|
@item different levels of dumps
|
|
@itemize +
|
|
@item full dump = dump everything
|
|
@item level 1, level 2 dumps etc
|
|
A level @var{n} dump dumps everything changed since the last level
|
|
@var{n}-1 dump (?)
|
|
@end itemize
|
|
@item how to use scripts for dumps (ie, the concept)
|
|
@itemize +
|
|
@item scripts to run after editing backup specs (details)
|
|
@end itemize
|
|
@item Backup Specs, what is it.
|
|
@itemize +
|
|
@item how to customize
|
|
@item actual text of script [/sp/dump/backup-specs]
|
|
@end itemize
|
|
@item Problems
|
|
@itemize +
|
|
@item rsh doesn't work
|
|
@item rtape isn't installed
|
|
@item (others?)
|
|
@end itemize
|
|
@item the @option{--incremental} option of tar
|
|
@item tapes
|
|
@itemize +
|
|
@item write protection
|
|
@item types of media, different sizes and types, useful for different things
|
|
@item files and tape marks
|
|
one tape mark between files, two at end.
|
|
@item positioning the tape
|
|
MT writes two at end of write,
|
|
backspaces over one when writing again.
|
|
@end itemize
|
|
@end itemize
|
|
@end itemize
|
|
}
|
|
|
|
This chapter documents both the provided shell scripts and @command{tar}
|
|
options which are more specific to usage as a backup tool.
|
|
|
|
To @dfn{back up} a file system means to create archives that contain
|
|
all the files in that file system. Those archives can then be used to
|
|
restore any or all of those files (for instance if a disk crashes or a
|
|
file is accidentally deleted). File system @dfn{backups} are also
|
|
called @dfn{dumps}.
|
|
|
|
@menu
|
|
* Full Dumps:: Using @command{tar} to Perform Full Dumps
|
|
* Incremental Dumps:: Using @command{tar} to Perform Incremental Dumps
|
|
* Backup Levels:: Levels of Backups
|
|
* Backup Parameters:: Setting Parameters for Backups and Restoration
|
|
* Scripted Backups:: Using the Backup Scripts
|
|
* Scripted Restoration:: Using the Restore Script
|
|
@end menu
|
|
|
|
@node Full Dumps
|
|
@section Using @command{tar} to Perform Full Dumps
|
|
@UNREVISED{}
|
|
|
|
@cindex full dumps
|
|
@cindex dumps, full
|
|
|
|
@cindex corrupted archives
|
|
Full dumps should only be made when no other people or programs
|
|
are modifying files in the file system. If files are modified while
|
|
@command{tar} is making the backup, they may not be stored properly in
|
|
the archive, in which case you won't be able to restore them if you
|
|
have to. (Files not being modified are written with no trouble, and do
|
|
not corrupt the entire archive.)
|
|
|
|
You will want to use the @option{--label=@var{archive-label}}
|
|
(@option{-V @var{archive-label}}) option to give the archive a
|
|
volume label, so you can tell what this archive is even if the label
|
|
falls off the tape, or anything like that.
|
|
|
|
Unless the file system you are dumping is guaranteed to fit on
|
|
one volume, you will need to use the @option{--multi-volume} (@option{-M}) option.
|
|
Make sure you have enough tapes on hand to complete the backup.
|
|
|
|
If you want to dump each file system separately you will need to use
|
|
the @option{--one-file-system} option to prevent
|
|
@command{tar} from crossing file system boundaries when storing
|
|
(sub)directories.
|
|
|
|
The @option{--incremental} (@option{-G}) (@pxref{Incremental Dumps})
|
|
option is not needed, since this is a complete copy of everything in
|
|
the file system, and a full restore from this backup would only be
|
|
done onto a completely
|
|
empty disk.
|
|
|
|
Unless you are in a hurry, and trust the @command{tar} program (and your
|
|
tapes), it is a good idea to use the @option{--verify} (@option{-W})
|
|
option, to make sure your files really made it onto the dump properly.
|
|
This will also detect cases where the file was modified while (or just
|
|
after) it was being archived. Not all media (notably cartridge tapes)
|
|
are capable of being verified, unfortunately.
|
|
|
|
@node Incremental Dumps
|
|
@section Using @command{tar} to Perform Incremental Dumps
|
|
|
|
@dfn{Incremental backup} is a special form of @GNUTAR{} archive that
|
|
stores additional metadata so that exact state of the file system
|
|
can be restored when extracting the archive.
|
|
|
|
@GNUTAR{} currently offers two options for handling incremental
|
|
backups: @option{--listed-incremental=@var{snapshot-file}} (@option{-g
|
|
@var{snapshot-file}}) and @option{--incremental} (@option{-G}).
|
|
|
|
@xopindex{listed-incremental, described}
|
|
The option @option{--listed-incremental} instructs tar to operate on
|
|
an incremental archive with additional metadata stored in a standalone
|
|
file, called a @dfn{snapshot file}. The purpose of this file is to help
|
|
determine which files have been changed, added or deleted since the
|
|
last backup, so that the next incremental backup will contain only
|
|
modified files. The name of the snapshot file is given as an argument
|
|
to the option:
|
|
|
|
@table @option
|
|
@item --listed-incremental=@var{file}
|
|
@itemx -g @var{file}
|
|
Handle incremental backups with snapshot data in @var{file}.
|
|
@end table
|
|
|
|
To create an incremental backup, you would use
|
|
@option{--listed-incremental} together with @option{--create}
|
|
(@pxref{create}). For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create \
|
|
--file=archive.1.tar \
|
|
--listed-incremental=/var/log/usr.snar \
|
|
/usr}
|
|
@end smallexample
|
|
|
|
This will create in @file{archive.1.tar} an incremental backup of
|
|
the @file{/usr} file system, storing additional metadata in the file
|
|
@file{/var/log/usr.snar}. If this file does not exist, it will be
|
|
created. The created archive will then be a @dfn{level 0 backup};
|
|
please see the next section for more on backup levels.
|
|
|
|
Otherwise, if the file @file{/var/log/usr.snar} exists, it
|
|
determines which files are modified. In this case only these files will be
|
|
stored in the archive. Suppose, for example, that after running the
|
|
above command, you delete file @file{/usr/doc/old} and create
|
|
directory @file{/usr/local/db} with the following contents:
|
|
|
|
@smallexample
|
|
$ @kbd{ls /usr/local/db}
|
|
/usr/local/db/data
|
|
/usr/local/db/index
|
|
@end smallexample
|
|
|
|
Some time later you create another incremental backup. You will
|
|
then see:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create \
|
|
--file=archive.2.tar \
|
|
--listed-incremental=/var/log/usr.snar \
|
|
/usr}
|
|
tar: usr/local/db: Directory is new
|
|
usr/local/db/
|
|
usr/local/db/data
|
|
usr/local/db/index
|
|
@end smallexample
|
|
|
|
@noindent
|
|
The created archive @file{archive.2.tar} will contain only these
|
|
three members. This archive is called a @dfn{level 1 backup}. Notice
|
|
that @file{/var/log/usr.snar} will be updated with the new data, so if
|
|
you plan to create more @samp{level 1} backups, it is necessary to
|
|
create a working copy of the snapshot file before running
|
|
@command{tar}. The above example will then be modified as follows:
|
|
|
|
@smallexample
|
|
$ @kbd{cp /var/log/usr.snar /var/log/usr.snar-1}
|
|
$ @kbd{tar --create \
|
|
--file=archive.2.tar \
|
|
--listed-incremental=/var/log/usr.snar-1 \
|
|
/usr}
|
|
@end smallexample
|
|
|
|
@anchor{--level=0}
|
|
@xopindex{level, described}
|
|
You can force @samp{level 0} backups either by removing the snapshot
|
|
file before running @command{tar}, or by supplying the
|
|
@option{--level=0} option, e.g.:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create \
|
|
--file=archive.2.tar \
|
|
--listed-incremental=/var/log/usr.snar-0 \
|
|
--level=0 \
|
|
/usr}
|
|
@end smallexample
|
|
|
|
Incremental dumps depend crucially on time stamps, so the results are
|
|
unreliable if you modify a file's time stamps during dumping (e.g.,
|
|
with the @option{--atime-preserve=replace} option), or if you set the clock
|
|
backwards.
|
|
|
|
@anchor{device numbers}
|
|
@cindex Device numbers, using in incremental backups
|
|
Metadata stored in snapshot files include device numbers, which,
|
|
obviously are supposed to be non-volatile values. However, it turns
|
|
out that @acronym{NFS} devices have undependable values when an automounter
|
|
gets in the picture. This can lead to a great deal of spurious
|
|
redumping in incremental dumps, so it is somewhat useless to compare
|
|
two @acronym{NFS} devices numbers over time. The solution implemented
|
|
currently is to consider all @acronym{NFS} devices as being equal
|
|
when it comes to comparing directories; this is fairly gross, but
|
|
there does not seem to be a better way to go.
|
|
|
|
Apart from using @acronym{NFS}, there are a number of cases where
|
|
relying on device numbers can cause spurious redumping of unmodified
|
|
files. For example, this occurs when archiving @acronym{LVM} snapshot
|
|
volumes. To avoid this, use @option{--no-check-device} option:
|
|
|
|
@table @option
|
|
@xopindex{no-check-device, described}
|
|
@item --no-check-device
|
|
Do not rely on device numbers when preparing a list of changed files
|
|
for an incremental dump.
|
|
|
|
@xopindex{check-device, described}
|
|
@item --check-device
|
|
Use device numbers when preparing a list of changed files
|
|
for an incremental dump. This is the default behavior. The purpose
|
|
of this option is to undo the effect of the @option{--no-check-device}
|
|
if it was given in @env{TAR_OPTIONS} environment variable
|
|
(@pxref{TAR_OPTIONS}).
|
|
@end table
|
|
|
|
There is also another way to cope with changing device numbers. It is
|
|
described in detail in @ref{Fixing Snapshot Files}.
|
|
|
|
Note that incremental archives use @command{tar} extensions and may
|
|
not be readable by non-@acronym{GNU} versions of the @command{tar} program.
|
|
|
|
@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
|
|
not need to access snapshot file, since all the data necessary for
|
|
extraction are stored in the archive itself. So, when extracting, you
|
|
can give whatever argument to @option{--listed-incremental}, the usual
|
|
practice is to use @option{--listed-incremental=/dev/null}.
|
|
Alternatively, you can use @option{--incremental}, which needs no
|
|
arguments. In general, @option{--incremental} (@option{-G}) can be
|
|
used as a shortcut for @option{--listed-incremental} when listing or
|
|
extracting incremental backups (for more information regarding this
|
|
option, @pxref{incremental-op}).
|
|
|
|
When extracting from the incremental backup @GNUTAR{} attempts to
|
|
restore the exact state the file system had when the archive was
|
|
created. In particular, it will @emph{delete} those files in the file
|
|
system that did not exist in their directories when the archive was
|
|
created. If you have created several levels of incremental files,
|
|
then in order to restore the exact contents the file system had when
|
|
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 without @option{-P} option (@pxref{absolute}), these
|
|
commands should be run from the root file system.}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --extract \
|
|
--listed-incremental=/dev/null \
|
|
--file archive.1.tar}
|
|
$ @kbd{tar --extract \
|
|
--listed-incremental=/dev/null \
|
|
--file archive.2.tar}
|
|
@end smallexample
|
|
|
|
To list the contents of an incremental archive, use @option{--list}
|
|
(@pxref{list}), as usual. To obtain more information about the
|
|
archive, use @option{--listed-incremental} or @option{--incremental}
|
|
combined with two @option{--verbose} options@footnote{Two
|
|
@option{--verbose} options were selected to avoid breaking usual
|
|
verbose listing output (@option{--list --verbose}) when using in
|
|
scripts.
|
|
|
|
@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 inconvenient
|
|
and were changed in version 1.16.}:
|
|
|
|
@smallexample
|
|
@kbd{tar --list --incremental --verbose --verbose --file archive.tar}
|
|
@end smallexample
|
|
|
|
This command will print, for each directory in the archive, the list
|
|
of files in that directory at the time the archive was created. This
|
|
information is put out in a format which is both human-readable and
|
|
unambiguous for a program: each file name is printed as
|
|
|
|
@smallexample
|
|
@var{x} @var{file}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
where @var{x} is a letter describing the status of the file: @samp{Y}
|
|
if the file is present in the archive, @samp{N} if the file is not
|
|
included in the archive, or a @samp{D} if the file is a directory (and
|
|
is included in the archive). @xref{Dumpdir}, for the detailed
|
|
description of dumpdirs and status codes. Each such
|
|
line is terminated by a newline character. The last line is followed
|
|
by an additional newline to indicate the end of the data.
|
|
|
|
@anchor{incremental-op}The option @option{--incremental} (@option{-G})
|
|
gives the same behavior as @option{--listed-incremental} when used
|
|
with @option{--list} and @option{--extract} options. When used with
|
|
@option{--create} option, it creates an incremental archive without
|
|
creating snapshot file. Thus, it is impossible to create several
|
|
levels of incremental backups with @option{--incremental} option.
|
|
|
|
@node Backup Levels
|
|
@section Levels of Backups
|
|
|
|
An archive containing all the files in the file system is called a
|
|
@dfn{full backup} or @dfn{full dump}. You could insure your data by
|
|
creating a full dump every day. This strategy, however, would waste a
|
|
substantial amount of archive media and user time, as unchanged files
|
|
are daily re-archived.
|
|
|
|
It is more efficient to do a full dump only occasionally. To back up
|
|
files between full dumps, you can use @dfn{incremental dumps}. A @dfn{level
|
|
one} dump archives all the files that have changed since the last full
|
|
dump.
|
|
|
|
A typical dump strategy would be to perform a full dump once a week,
|
|
and a level one dump once a day. This means some versions of files
|
|
will in fact be archived more than once, but this dump strategy makes
|
|
it possible to restore a file system to within one day of accuracy by
|
|
only extracting two archives---the last weekly (full) dump and the
|
|
last daily (level one) dump. The only information lost would be in
|
|
files changed or created since the last daily backup. (Doing dumps
|
|
more than once a day is usually not worth the trouble.)
|
|
|
|
@GNUTAR{} comes with scripts you can use to do full
|
|
and level-one (actually, even level-two and so on) dumps. Using
|
|
scripts (shell programs) to perform backups and restoration is a
|
|
convenient and reliable alternative to typing out file name lists
|
|
and @command{tar} commands by hand.
|
|
|
|
Before you use these scripts, you need to edit the file
|
|
@file{backup-specs}, which specifies parameters used by the backup
|
|
scripts and by the restore script. This file is usually located
|
|
in @file{/etc/backup} directory. @xref{Backup Parameters}, for its
|
|
detailed description. Once the backup parameters are set, you can
|
|
perform backups or restoration by running the appropriate script.
|
|
|
|
The name of the backup script is @code{backup}. The name of the
|
|
restore script is @code{restore}. The following sections describe
|
|
their use in detail.
|
|
|
|
@emph{Please Note:} The backup and restoration scripts are
|
|
designed to be used together. While it is possible to restore files by
|
|
hand from an archive which was created using a backup script, and to create
|
|
an archive by hand which could then be extracted using the restore script,
|
|
it is easier to use the scripts. @xref{Incremental Dumps}, before
|
|
making such an attempt.
|
|
|
|
@node Backup Parameters
|
|
@section Setting Parameters for Backups and Restoration
|
|
|
|
The file @file{backup-specs} specifies backup parameters for the
|
|
backup and restoration scripts provided with @command{tar}. You must
|
|
edit @file{backup-specs} to fit your system configuration and schedule
|
|
before using these scripts.
|
|
|
|
Syntactically, @file{backup-specs} is a shell script, containing
|
|
mainly variable assignments. However, any valid shell construct
|
|
is allowed in this file. Particularly, you may wish to define
|
|
functions within that script (e.g., see @code{RESTORE_BEGIN} below).
|
|
For more information about shell script syntax, please refer to
|
|
@url{http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#ta
|
|
g_02, the definition of the Shell Command Language}. See also
|
|
@ref{Top,,Bash Features,bashref,Bash Reference Manual}.
|
|
|
|
The shell variables controlling behavior of @code{backup} and
|
|
@code{restore} are described in the following subsections.
|
|
|
|
@menu
|
|
* General-Purpose Variables::
|
|
* Magnetic Tape Control::
|
|
* User Hooks::
|
|
* backup-specs example:: An Example Text of @file{Backup-specs}
|
|
@end menu
|
|
|
|
@node General-Purpose Variables
|
|
@subsection General-Purpose Variables
|
|
|
|
@defvr {Backup variable} ADMINISTRATOR
|
|
The user name of the backup administrator. @code{Backup} scripts
|
|
sends a backup report to this address.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} BACKUP_HOUR
|
|
The hour at which the backups are done. This can be a number from 0
|
|
to 23, or the time specification in form @var{hours}:@var{minutes},
|
|
or the string @samp{now}.
|
|
|
|
This variable is used by @code{backup}. Its value may be overridden
|
|
using @option{--time} option (@pxref{Scripted Backups}).
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} TAPE_FILE
|
|
|
|
The device @command{tar} writes the archive to. If @var{TAPE_FILE}
|
|
is a remote archive (@pxref{remote-dev}), backup script will suppose
|
|
that your @command{mt} is able to access remote devices. If @var{RSH}
|
|
(@pxref{RSH}) is set, @option{--rsh-command} option will be added to
|
|
invocations of @command{mt}.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} BLOCKING
|
|
|
|
The blocking factor @command{tar} will use when writing the dump archive.
|
|
@xref{Blocking Factor}.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} BACKUP_DIRS
|
|
|
|
A list of file systems to be dumped (for @code{backup}), or restored
|
|
(for @code{restore}). You can include any directory
|
|
name in the list --- subdirectories on that file system will be
|
|
included, regardless of how they may look to other networked machines.
|
|
Subdirectories on other file systems will be ignored.
|
|
|
|
The host name specifies which host to run @command{tar} on, and should
|
|
normally be the host that actually contains the file system. However,
|
|
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 (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 @acronym{NFS}.
|
|
|
|
If the list of file systems is very long you may wish to put it
|
|
in a separate file. This file is usually named
|
|
@file{/etc/backup/dirs}, but this name may be overridden in
|
|
@file{backup-specs} using @code{DIRLIST} variable.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} DIRLIST
|
|
|
|
The name of the file that contains a list of file systems to backup
|
|
or restore. By default it is @file{/etc/backup/dirs}.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} BACKUP_FILES
|
|
|
|
A list of individual files to be dumped (for @code{backup}), or restored
|
|
(for @code{restore}). These should be accessible from the machine on
|
|
which the backup script is run.
|
|
|
|
If the list of individual files is very long you may wish to store it
|
|
in a separate file. This file is usually named
|
|
@file{/etc/backup/files}, but this name may be overridden in
|
|
@file{backup-specs} using @code{FILELIST} variable.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} FILELIST
|
|
|
|
The name of the file that contains a list of individual files to backup
|
|
or restore. By default it is @file{/etc/backup/files}.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} MT
|
|
|
|
Full file name of @command{mt} binary.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} RSH
|
|
@anchor{RSH}
|
|
Full file name of @command{rsh} binary or its equivalent. You may wish to
|
|
set it to @code{ssh}, to improve security. In this case you will have
|
|
to use public key authentication.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} RSH_COMMAND
|
|
|
|
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
|
|
|
|
@defvr {Backup variable} VOLNO_FILE
|
|
|
|
Name of temporary file to hold volume numbers. This needs to be accessible
|
|
by all the machines which have file systems to be dumped.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} XLIST
|
|
|
|
Name of @dfn{exclude file list}. An @dfn{exclude file list} is a file
|
|
located on the remote machine and containing the list of files to
|
|
be excluded from the backup. Exclude file lists are searched in
|
|
/etc/tar-backup directory. A common use for exclude file lists
|
|
is to exclude files containing security-sensitive information
|
|
(e.g., @file{/etc/shadow} from backups).
|
|
|
|
This variable affects only @code{backup}.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} SLEEP_TIME
|
|
|
|
Time to sleep between dumps of any two successive file systems
|
|
|
|
This variable affects only @code{backup}.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} DUMP_REMIND_SCRIPT
|
|
|
|
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. For the
|
|
description of the default prompt, see @ref{change volume prompt}.
|
|
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} SLEEP_MESSAGE
|
|
|
|
Message to display on the terminal while waiting for dump time. Usually
|
|
this will just be some literal text.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} TAR
|
|
|
|
Full file name of the @GNUTAR{} executable. If this is not set, backup
|
|
scripts will search @command{tar} in the current shell path.
|
|
@end defvr
|
|
|
|
@node Magnetic Tape Control
|
|
@subsection Magnetic Tape Control
|
|
|
|
Backup scripts access tape device using special @dfn{hook functions}.
|
|
These functions take a single argument --- the name of the tape
|
|
device. Their names are kept in the following variables:
|
|
|
|
@defvr {Backup variable} MT_BEGIN
|
|
The name of @dfn{begin} function. This function is called before
|
|
accessing the drive. By default it retensions the tape:
|
|
|
|
@smallexample
|
|
MT_BEGIN=mt_begin
|
|
|
|
mt_begin() @{
|
|
mt -f "$1" retension
|
|
@}
|
|
@end smallexample
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} MT_REWIND
|
|
The name of @dfn{rewind} function. The default definition is as
|
|
follows:
|
|
|
|
@smallexample
|
|
MT_REWIND=mt_rewind
|
|
|
|
mt_rewind() @{
|
|
mt -f "$1" rewind
|
|
@}
|
|
@end smallexample
|
|
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} MT_OFFLINE
|
|
The name of the function switching the tape off line. By default
|
|
it is defined as follows:
|
|
|
|
@smallexample
|
|
MT_OFFLINE=mt_offline
|
|
|
|
mt_offline() @{
|
|
mt -f "$1" offl
|
|
@}
|
|
@end smallexample
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} MT_STATUS
|
|
The name of the function used to obtain the status of the archive device,
|
|
including error count. Default definition:
|
|
|
|
@smallexample
|
|
MT_STATUS=mt_status
|
|
|
|
mt_status() @{
|
|
mt -f "$1" status
|
|
@}
|
|
@end smallexample
|
|
@end defvr
|
|
|
|
@node User Hooks
|
|
@subsection User Hooks
|
|
|
|
@dfn{User hooks} are shell functions executed before and after
|
|
each @command{tar} invocation. Thus, there are @dfn{backup
|
|
hooks}, which are executed before and after dumping each file
|
|
system, and @dfn{restore hooks}, executed before and
|
|
after restoring a file system. Each user hook is a shell function
|
|
taking four arguments:
|
|
|
|
@deffn {User Hook Function} hook @var{level} @var{host} @var{fs} @var{fsname}
|
|
Its arguments are:
|
|
|
|
@table @var
|
|
@item level
|
|
Current backup or restore level.
|
|
|
|
@item host
|
|
Name or IP address of the host machine being dumped or restored.
|
|
|
|
@item fs
|
|
Full file name of the file system being dumped or restored.
|
|
|
|
@item fsname
|
|
File system name with directory separators replaced with colons. This
|
|
is useful, e.g., for creating unique files.
|
|
@end table
|
|
@end deffn
|
|
|
|
Following variables keep the names of user hook functions:
|
|
|
|
@defvr {Backup variable} DUMP_BEGIN
|
|
Dump begin function. It is executed before dumping the file system.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} DUMP_END
|
|
Executed after dumping the file system.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} RESTORE_BEGIN
|
|
Executed before restoring the file system.
|
|
@end defvr
|
|
|
|
@defvr {Backup variable} RESTORE_END
|
|
Executed after restoring the file system.
|
|
@end defvr
|
|
|
|
@node backup-specs example
|
|
@subsection An Example Text of @file{Backup-specs}
|
|
|
|
The following is an example of @file{backup-specs}:
|
|
|
|
@smallexample
|
|
# site-specific parameters for file system backup.
|
|
|
|
ADMINISTRATOR=friedman
|
|
BACKUP_HOUR=1
|
|
TAPE_FILE=/dev/nrsmt0
|
|
|
|
# Use @code{ssh} instead of the less secure @code{rsh}
|
|
RSH=/usr/bin/ssh
|
|
RSH_COMMAND=/usr/bin/ssh
|
|
|
|
# Override MT_STATUS function:
|
|
my_status() @{
|
|
mts -t $TAPE_FILE
|
|
@}
|
|
MT_STATUS=my_status
|
|
|
|
# Disable MT_OFFLINE function
|
|
MT_OFFLINE=:
|
|
|
|
BLOCKING=124
|
|
BACKUP_DIRS="
|
|
albert:/fs/fsf
|
|
apple-gunkies:/gd
|
|
albert:/fs/gd2
|
|
albert:/fs/gp
|
|
geech:/usr/jla
|
|
churchy:/usr/roland
|
|
albert:/
|
|
albert:/usr
|
|
apple-gunkies:/
|
|
apple-gunkies:/usr
|
|
gnu:/hack
|
|
gnu:/u
|
|
apple-gunkies:/com/mailer/gnu
|
|
apple-gunkies:/com/archive/gnu"
|
|
|
|
BACKUP_FILES="/com/mailer/aliases /com/mailer/league*[a-z]"
|
|
|
|
@end smallexample
|
|
|
|
@node Scripted Backups
|
|
@section Using the Backup Scripts
|
|
|
|
The syntax for running a backup script is:
|
|
|
|
@smallexample
|
|
backup --level=@var{level} --time=@var{time}
|
|
@end smallexample
|
|
|
|
The @option{--level} option requests the dump level. Thus, to produce
|
|
a full dump, specify @code{--level=0} (this is the default, so
|
|
@option{--level} may be omitted if its value is
|
|
@code{0})@footnote{For backward compatibility, the @code{backup} will also
|
|
try to deduce the requested dump level from the name of the
|
|
script itself. If the name consists of a string @samp{level-}
|
|
followed by a single decimal digit, that digit is taken as
|
|
the dump level number. Thus, you may create a link from @code{backup}
|
|
to @code{level-1} and then run @code{level-1} whenever you need to
|
|
create a level one dump.}.
|
|
|
|
The @option{--time} option determines when should the backup be
|
|
run. @var{Time} may take three forms:
|
|
|
|
@table @asis
|
|
@item @var{hh}:@var{mm}
|
|
|
|
The dump must be run at @var{hh} hours @var{mm} minutes.
|
|
|
|
@item @var{hh}
|
|
|
|
The dump must be run at @var{hh} hours.
|
|
|
|
@item now
|
|
|
|
The dump must be run immediately.
|
|
@end table
|
|
|
|
You should start a script with a tape or disk mounted. Once you
|
|
start a script, it prompts you for new tapes or disks as it
|
|
needs them. Media volumes don't have to correspond to archive
|
|
files --- a multi-volume archive can be started in the middle of a
|
|
tape that already contains the end of another multi-volume archive.
|
|
The @code{restore} script prompts for media by its archive volume,
|
|
so to avoid an error message you should keep track of which tape
|
|
(or disk) contains which volume of the archive (@pxref{Scripted
|
|
Restoration}).
|
|
|
|
The backup scripts write two files on the file system. The first is a
|
|
record file in @file{/etc/tar-backup/}, which is used by the scripts
|
|
to store and retrieve information about which files were dumped. This
|
|
file is not meant to be read by humans, and should not be deleted by
|
|
them. @xref{Snapshot Files}, for a more detailed explanation of this
|
|
file.
|
|
|
|
The second file is a log file containing the names of the file systems
|
|
and files dumped, what time the backup was made, and any error
|
|
messages that were generated, as well as how much space was left in
|
|
the media volume after the last volume of the archive was written.
|
|
You should check this log file after every backup. The file name is
|
|
@file{log-@var{mm-dd-yyyy}-level-@var{n}}, where @var{mm-dd-yyyy}
|
|
represents current date, and @var{n} represents current dump level number.
|
|
|
|
The script also prints the name of each system being dumped to the
|
|
standard output.
|
|
|
|
Following is the full list of options accepted by @code{backup}
|
|
script:
|
|
|
|
@table @option
|
|
@item -l @var{level}
|
|
@itemx --level=@var{level}
|
|
Do backup level @var{level} (default 0).
|
|
|
|
@item -f
|
|
@itemx --force
|
|
Force backup even if today's log file already exists.
|
|
|
|
@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. Default @var{level}
|
|
is 100, which means the highest debugging level.
|
|
|
|
@item -t @var{start-time}
|
|
@itemx --time=@var{start-time}
|
|
Wait till @var{time}, then do backup.
|
|
|
|
@item -h
|
|
@itemx --help
|
|
Display short help message and exit.
|
|
|
|
@item -V
|
|
@itemx --version
|
|
Display information about the program's name, version, origin and legal
|
|
status, all on standard output, and then exit successfully.
|
|
@end table
|
|
|
|
|
|
@node Scripted Restoration
|
|
@section Using the Restore Script
|
|
|
|
To restore files that were archived using a scripted backup, use the
|
|
@code{restore} script. Its usage is quite straightforward. In the
|
|
simplest form, invoke @code{restore --all}, it will
|
|
then restore all the file systems and files specified in
|
|
@file{backup-specs} (@pxref{General-Purpose Variables,BACKUP_DIRS}).
|
|
|
|
You may select the file systems (and/or files) to restore by
|
|
giving @code{restore} a list of @dfn{patterns} in its command
|
|
line. For example, running
|
|
|
|
@smallexample
|
|
restore 'albert:*'
|
|
@end smallexample
|
|
|
|
@noindent
|
|
will restore all file systems on the machine @samp{albert}. A more
|
|
complicated example:
|
|
|
|
@smallexample
|
|
restore 'albert:*' '*:/var'
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This command will restore all file systems on the machine @samp{albert}
|
|
as well as @file{/var} file system on all machines.
|
|
|
|
By default @code{restore} will start restoring files from the lowest
|
|
available dump level (usually zero) and will continue through
|
|
all available dump levels. There may be situations where such a
|
|
thorough restore is not necessary. For example, you may wish to
|
|
restore only files from the recent level one backup. To do so,
|
|
use @option{--level} option, as shown in the example below:
|
|
|
|
@smallexample
|
|
restore --level=1
|
|
@end smallexample
|
|
|
|
The full list of options accepted by @code{restore} follows:
|
|
|
|
@table @option
|
|
@item -a
|
|
@itemx --all
|
|
Restore all file systems and files specified in @file{backup-specs}.
|
|
|
|
@item -l @var{level}
|
|
@itemx --level=@var{level}
|
|
Start restoring from the given backup level, instead of the default 0.
|
|
|
|
@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. Default @var{level}
|
|
is 100, which means the highest debugging level.
|
|
|
|
@item -h
|
|
@itemx --help
|
|
Display short help message and exit.
|
|
|
|
@item -V
|
|
@itemx --version
|
|
Display information about the program's name, version, origin and legal
|
|
status, all on standard output, and then exit successfully.
|
|
@end table
|
|
|
|
You should start the restore script with the media containing the
|
|
first volume of the archive mounted. The script will prompt for other
|
|
volumes as they are needed. If the archive is on tape, you don't need
|
|
to rewind the tape to to its beginning---if the tape head is
|
|
positioned past the beginning of the archive, the script will rewind
|
|
the tape as needed. @xref{Tape Positioning}, for a discussion of tape
|
|
positioning.
|
|
|
|
@quotation
|
|
@strong{Warning:} The script will delete files from the active file
|
|
system if they were not in the file system when the archive was made.
|
|
@end quotation
|
|
|
|
@xref{Incremental Dumps}, for an explanation of how the script makes
|
|
that determination.
|
|
|
|
@node Choosing
|
|
@chapter Choosing Files and Names for @command{tar}
|
|
|
|
Certain options to @command{tar} enable you to specify a name for your
|
|
archive. Other options let you decide which files to include or exclude
|
|
from the archive, based on when or whether files were modified, whether
|
|
the file names do or don't match specified patterns, or whether files
|
|
are in specified directories.
|
|
|
|
This chapter discusses these options in detail.
|
|
|
|
@menu
|
|
* file:: Choosing the Archive's Name
|
|
* Selecting Archive Members::
|
|
* files:: Reading Names from a File
|
|
* exclude:: Excluding Some Files
|
|
* wildcards:: Wildcards Patterns and Matching
|
|
* quoting styles:: Ways of Quoting Special Characters in Names
|
|
* transform:: Modifying File and Member Names
|
|
* after:: Operating Only on New Files
|
|
* recurse:: Descending into Directories
|
|
* one:: Crossing File System Boundaries
|
|
@end menu
|
|
|
|
@node file
|
|
@section Choosing and Naming Archive Files
|
|
|
|
@cindex Naming an archive
|
|
@cindex Archive Name
|
|
@cindex Choosing an archive file
|
|
@cindex Where is the archive?
|
|
@opindex file
|
|
By default, @command{tar} uses an archive file name that was compiled when
|
|
it was built on the system; usually this name refers to some physical
|
|
tape drive on the machine. However, the person who installed @command{tar}
|
|
on the system may not have set the default to a meaningful value as far as
|
|
most users are concerned. As a result, you will usually want to tell
|
|
@command{tar} where to find (or create) the archive. The
|
|
@option{--file=@var{archive-name}} (@option{-f @var{archive-name}})
|
|
option allows you to either specify or name a file to use as the archive
|
|
instead of the default archive file location.
|
|
|
|
@table @option
|
|
@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
|
|
any operation.
|
|
@end table
|
|
|
|
For example, in this @command{tar} command,
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cvf collection.tar blues folk jazz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
@file{collection.tar} is the name of the archive. It must directly
|
|
follow the @option{-f} option, since whatever directly follows @option{-f}
|
|
@emph{will} end up naming the archive. If you neglect to specify an
|
|
archive name, you may end up overwriting a file in the working directory
|
|
with the archive you create since @command{tar} will use this file's name
|
|
for the archive name.
|
|
|
|
An archive can be saved as a file in the file system, sent through a
|
|
pipe or over a network, or written to an I/O device such as a tape,
|
|
floppy disk, or CD write drive.
|
|
|
|
@cindex Writing new archives
|
|
@cindex Archive creation
|
|
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 (i.e., @file{/dev/tu00}).
|
|
|
|
@cindex Standard input and output
|
|
@cindex tar to standard input and output
|
|
If you use @file{-} as an @var{archive-name}, @command{tar} reads the
|
|
archive from standard input (when listing or extracting files), or
|
|
writes it to standard output (when creating an archive). If you use
|
|
@file{-} as an @var{archive-name} when modifying an archive,
|
|
@command{tar} reads the original archive from its standard input and
|
|
writes the entire new archive to its standard output.
|
|
|
|
The following example is a convenient way of copying directory
|
|
hierarchy from @file{sourcedir} to @file{targetdir}.
|
|
|
|
@smallexample
|
|
$ @kbd{(cd sourcedir; tar -cf - .) | (cd targetdir; tar -xpf -)}
|
|
@end smallexample
|
|
|
|
The @option{-C} option allows to avoid using subshells:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -C sourcedir -cf - . | tar -C targetdir -xpf -}
|
|
@end smallexample
|
|
|
|
In both examples above, the leftmost @command{tar} invocation archives
|
|
the contents of @file{sourcedir} to the standard output, while the
|
|
rightmost one reads this archive from its standard input and
|
|
extracts it. The @option{-p} option tells it to restore permissions
|
|
of the extracted files.
|
|
|
|
@cindex Remote devices
|
|
@cindex tar to a remote device
|
|
@anchor{remote-dev}
|
|
To specify an archive file on a device attached to a remote machine,
|
|
use the following:
|
|
|
|
@smallexample
|
|
@kbd{--file=@var{hostname}:/@var{dev}/@var{file-name}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
@command{tar} will set up the remote connection, if possible, and
|
|
prompt you for a username and password. If you use
|
|
@option{--file=@@@var{hostname}:/@var{dev}/@var{file-name}}, @command{tar}
|
|
will attempt to set up the remote connection using your username
|
|
as the username on the remote machine.
|
|
|
|
@cindex Local and remote archives
|
|
@anchor{local and remote archives}
|
|
If the archive file name includes a colon (@samp{:}), then it is assumed
|
|
to be a file on another machine. If the archive file is
|
|
@samp{@var{user}@@@var{host}:@var{file}}, then @var{file} is used on the
|
|
host @var{host}. The remote host is accessed using the @command{rsh}
|
|
program, with a username of @var{user}. If the username is omitted
|
|
(along with the @samp{@@} sign), then your user name will be used.
|
|
(This is the normal @command{rsh} behavior.) It is necessary for the
|
|
remote machine, in addition to permitting your @command{rsh} access, to
|
|
have the @file{rmt} program installed (this command is included in
|
|
the @GNUTAR{} distribution and by default is installed under
|
|
@file{@var{prefix}/libexec/rmt}, where @var{prefix} means your
|
|
installation prefix). If you need to use a file whose name includes a
|
|
colon, then the remote tape drive behavior
|
|
can be inhibited by using the @option{--force-local} option.
|
|
|
|
When the archive is being created to @file{/dev/null}, @GNUTAR{}
|
|
tries to minimize input and output operations. The Amanda backup
|
|
system, when used with @GNUTAR{}, has an initial sizing pass which
|
|
uses this feature.
|
|
|
|
@node Selecting Archive Members
|
|
@section Selecting Archive Members
|
|
@cindex Specifying files to act on
|
|
@cindex Specifying archive members
|
|
|
|
@dfn{File Name arguments} specify which files in the file system
|
|
@command{tar} operates on, when creating or adding to an archive, or which
|
|
archive members @command{tar} operates on, when reading or deleting from
|
|
an archive. @xref{Operations}.
|
|
|
|
To specify file names, you can include them as the last arguments on
|
|
the command line, as follows:
|
|
@smallexample
|
|
@kbd{tar} @var{operation} [@var{option1} @var{option2} @dots{}] [@var{file name-1} @var{file name-2} @dots{}]
|
|
@end smallexample
|
|
|
|
If a file name begins with dash (@samp{-}), precede it with
|
|
@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 (@acronym{ASCII} 7)
|
|
@item \b @tab Backspace (@acronym{ASCII} 8)
|
|
@item \f @tab Form feed (@acronym{ASCII} 12)
|
|
@item \n @tab New line (@acronym{ASCII} 10)
|
|
@item \r @tab Carriage return (@acronym{ASCII} 13)
|
|
@item \t @tab Horizontal tabulation (@acronym{ASCII} 9)
|
|
@item \v @tab Vertical tabulation (@acronym{ASCII} 11)
|
|
@item \? @tab @acronym{ASCII} 127
|
|
@item \@var{n} @tab @acronym{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}.
|
|
|
|
If you do not specify files, @command{tar} behavior differs depending
|
|
on the operation mode as described below:
|
|
|
|
When @command{tar} is invoked with @option{--create} (@option{-c}),
|
|
@command{tar} will stop immediately, reporting the following:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar cf a.tar}
|
|
tar: Cowardly refusing to create an empty archive
|
|
Try 'tar --help' or 'tar --usage' for more information.
|
|
@end group
|
|
@end smallexample
|
|
|
|
If you specify either @option{--list} (@option{-t}) or
|
|
@option{--extract} (@option{--get}, @option{-x}), @command{tar}
|
|
operates on all the archive members in the archive.
|
|
|
|
If run with @option{--diff} option, tar will compare the archive with
|
|
the contents of the current working directory.
|
|
|
|
If you specify any other operation, @command{tar} does nothing.
|
|
|
|
By default, @command{tar} takes file names from the command line. However,
|
|
there are other ways to specify file or member names, or to modify the
|
|
manner in which @command{tar} selects the files or members upon which to
|
|
operate. In general, these methods work both for specifying the names
|
|
of files and archive members.
|
|
|
|
@node files
|
|
@section Reading Names from a File
|
|
|
|
@cindex Reading file names from a file
|
|
@cindex Lists of file names
|
|
@cindex File Name arguments, alternatives
|
|
@cindex @command{find}, using with @command{tar}
|
|
Instead of giving the names of files or archive members on the command
|
|
line, you can put the names into a file, and then use the
|
|
@option{--files-from=@var{file-of-names}} (@option{-T
|
|
@var{file-of-names}}) option to @command{tar}. Give the name of the
|
|
file which contains the list of files to include as the argument to
|
|
@option{--files-from}. In the list, the file names should be separated by
|
|
newlines. You will frequently use this option when you have generated
|
|
the list of files to archive with the @command{find} utility.
|
|
|
|
@table @option
|
|
@opindex files-from
|
|
@item --files-from=@var{file-name}
|
|
@itemx -T @var{file-name}
|
|
Get names to extract or create from file @var{file-name}.
|
|
@end table
|
|
|
|
If you give a single dash as a file name for @option{--files-from}, (i.e.,
|
|
you specify either @code{--files-from=-} or @code{-T -}), then the file
|
|
names are read from standard input.
|
|
|
|
Unless you are running @command{tar} with @option{--create}, you cannot use
|
|
both @code{--files-from=-} and @code{--file=-} (@code{-f -}) in the same
|
|
command.
|
|
|
|
Any number of @option{-T} options can be given in the command line.
|
|
|
|
The following example shows how to use @command{find} to generate a list of
|
|
files smaller than 400 blocks in length@footnote{A file system block
|
|
is usually 512 bytes, so this amounts to 200K. Use the @samp{c}
|
|
suffix to specify size in @emph{bytes}. Also, when using
|
|
GNU find, you can specify other size units, such as @samp{k},
|
|
@samp{m}, etc. @xref{Size,,,find.info,GNU Findutils}, for details.} and put that list into a file
|
|
called @file{small-files}. You can then use the @option{-T} option to
|
|
@command{tar} to specify the files from that file, @file{small-files}, to
|
|
create the archive @file{little.tgz}. (The @option{-z} option to
|
|
@command{tar} compresses the archive with @command{gzip}; @pxref{gzip} for
|
|
more information.)
|
|
|
|
@smallexample
|
|
$ @kbd{find . -size -400 -print > small-files}
|
|
$ @kbd{tar -c -v -z -T small-files -f little.tgz}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
By default, each line read from the file list is first stripped off
|
|
any leading and trailing whitespace. If the resulting string begins
|
|
with @samp{-} character, it is considered a @command{tar} option and is
|
|
processed accordingly@footnote{Versions of @GNUTAR{} up to 1.15.1
|
|
recognized only @option{-C} option in file lists, and only if the
|
|
option and its argument occupied two consecutive lines.}. Only a
|
|
subset of @GNUTAR{} options is allowed for use in file lists. For
|
|
a list of such options, @ref{Position-Sensitive Options}.
|
|
|
|
For example, the common use of this feature is to change to another
|
|
directory by specifying @option{-C} option:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{cat list}
|
|
-C/etc
|
|
passwd
|
|
hosts
|
|
-C/lib
|
|
libc.a
|
|
$ @kbd{tar -c -f foo.tar --files-from list}
|
|
@end group
|
|
@end smallexample
|
|
|
|
@noindent
|
|
In this example, @command{tar} will first switch to @file{/etc}
|
|
directory and add files @file{passwd} and @file{hosts} to the
|
|
archive. Then it will change to @file{/lib} directory and will archive
|
|
the file @file{libc.a}. Thus, the resulting archive @file{foo.tar} will
|
|
contain:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf foo.tar}
|
|
passwd
|
|
hosts
|
|
libc.a
|
|
@end group
|
|
@end smallexample
|
|
|
|
Note, that any options used in the file list remain in effect for the
|
|
rest of the command line. For example, using the same @file{list}
|
|
file as above, the following command
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f foo.tar --files-from list libcurses.a}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
will look for file @file{libcurses.a} in the directory @file{/lib},
|
|
because it was used with the last @option{-C} option
|
|
(@pxref{Position-Sensitive Options}).
|
|
|
|
@anchor{verbatim-files-from}
|
|
@opindex verbatim-files-from
|
|
If such option handling is undesirable, use the
|
|
@option{--verbatim-files-from} option. When this option is in effect,
|
|
each line read from the file list is treated as a file name. Notice,
|
|
that this means, in particular, that no whitespace trimming is
|
|
performed.
|
|
|
|
@anchor{no-verbatim-files-from}
|
|
@opindex no-verbatim-files-from
|
|
The @option{--verbatim-files-from} affects all @option{-T} options
|
|
that follow it in the command line. The default behavior can be
|
|
restored using @option{--no-verbatim-files-from} option.
|
|
|
|
@opindex add-file
|
|
To disable option handling for a single file name, use the
|
|
@option{--add-file} option, e.g.: @code{--add-file=--my-file}.
|
|
|
|
You can use any @GNUTAR{} command line options in the file list file,
|
|
including @option{--files-from} option itself. This allows for
|
|
including contents of a file list into another file list file.
|
|
Note however, that options that control file list processing, such as
|
|
@option{--verbatim-files-from} or @option{--null} won't affect the
|
|
file they appear in. They will affect next @option{--files-from}
|
|
option, if there is any.
|
|
|
|
@menu
|
|
* nul::
|
|
@end menu
|
|
|
|
@node nul
|
|
@subsection @code{NUL}-Terminated File Names
|
|
|
|
@cindex File names, terminated by @code{NUL}
|
|
@cindex @code{NUL}-terminated file names
|
|
The @option{--null} option causes
|
|
@option{--files-from=@var{file-of-names}} (@option{-T @var{file-of-names}})
|
|
to read file names terminated by a @code{NUL} instead of a newline, so
|
|
files whose names contain newlines can be archived using
|
|
@option{--files-from}.
|
|
|
|
@table @option
|
|
@xopindex{null, described}
|
|
@item --null
|
|
Only consider @code{NUL}-terminated file names, instead of files that
|
|
terminate in a newline.
|
|
|
|
@xopindex{no-null, described}
|
|
@item --no-null
|
|
Undo the effect of any previous @option{--null} option.
|
|
@end table
|
|
|
|
The @option{--null} option is just like the one in @acronym{GNU}
|
|
@command{xargs} and @command{cpio}, and is useful with the
|
|
@option{-print0} predicate of @acronym{GNU} @command{find}. In
|
|
@command{tar}, @option{--null} also disables special handling for
|
|
file names that begin with dash (similar to
|
|
@option{--verbatim-files-from} option).
|
|
|
|
This example shows how to use @command{find} to generate a list of files
|
|
larger than 800 blocks in length and put that list into a file called
|
|
@file{long-files}. The @option{-print0} option to @command{find} is just
|
|
like @option{-print}, except that it separates files with a @code{NUL}
|
|
rather than with a newline. You can then run @command{tar} with both the
|
|
@option{--null} and @option{-T} options to specify that @command{tar} gets the
|
|
files from that file, @file{long-files}, to create the archive
|
|
@file{big.tgz}. The @option{--null} option to @command{tar} will cause
|
|
@command{tar} to recognize the @code{NUL} separator between files.
|
|
|
|
@smallexample
|
|
$ @kbd{find . -size +800 -print0 > long-files}
|
|
$ @kbd{tar -c -v --null --files-from=long-files --file=big.tar}
|
|
@end smallexample
|
|
|
|
The @option{--no-null} option can be used if you need to read both
|
|
@code{NUL}-terminated and newline-terminated files on the same command line.
|
|
For example, if @file{flist} is a newline-terminated file, then the
|
|
following command can be used to combine it with the above command:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{find . -size +800 -print0 |
|
|
tar -c -f big.tar --null -T - --no-null -T flist}
|
|
@end group
|
|
@end smallexample
|
|
|
|
This example uses short options for typographic reasons, to avoid
|
|
very long lines.
|
|
|
|
@GNUTAR{} is tries to automatically detect @code{NUL}-terminated file
|
|
lists, so in many cases it is safe to use them even without the
|
|
@option{--null} option. In this case @command{tar} will print a
|
|
warning and continue reading such a file as if @option{--null} were
|
|
actually given:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{find . -size +800 -print0 | tar -c -f big.tar -T -}
|
|
tar: -: file name read contains nul character
|
|
@end group
|
|
@end smallexample
|
|
|
|
The null terminator, however, remains in effect only for this
|
|
particular file, any following @option{-T} options will assume
|
|
newline termination. Of course, the null autodetection applies
|
|
to these eventual surplus @option{-T} options as well.
|
|
|
|
@node exclude
|
|
@section Excluding Some Files
|
|
|
|
@cindex File names, excluding files by
|
|
@cindex Excluding files by name and pattern
|
|
@cindex Excluding files by file system
|
|
@opindex exclude
|
|
@opindex exclude-from
|
|
To avoid operating on files whose names match a particular pattern,
|
|
use the @option{--exclude} or @option{--exclude-from} options.
|
|
|
|
@table @option
|
|
@opindex exclude
|
|
@item --exclude=@var{pattern}
|
|
Causes @command{tar} to ignore files that match the @var{pattern}.
|
|
@end table
|
|
|
|
@findex exclude
|
|
The @option{--exclude=@var{pattern}} option prevents any file or
|
|
member whose name matches the shell wildcard (@var{pattern}) from
|
|
being operated on.
|
|
For example, to create an archive with all the contents of the directory
|
|
@file{src} except for files whose names end in @file{.o}, use the
|
|
command @samp{tar -cf src.tar --exclude='*.o' src}.
|
|
|
|
You may give multiple @option{--exclude} options.
|
|
|
|
@table @option
|
|
@opindex exclude-from
|
|
@item --exclude-from=@var{file}
|
|
@itemx -X @var{file}
|
|
Causes @command{tar} to ignore files that match the patterns listed in
|
|
@var{file}.
|
|
@end table
|
|
|
|
@findex exclude-from
|
|
Use the @option{--exclude-from} option to read a
|
|
list of patterns, one per line, from @var{file}; @command{tar} will
|
|
ignore files matching those patterns. Thus if @command{tar} is
|
|
called as @w{@samp{tar -c -X foo .}} and the file @file{foo} contains a
|
|
single line @file{*.o}, no files whose names end in @file{.o} will be
|
|
added to the archive.
|
|
|
|
Notice, that lines from @var{file} are read verbatim. One of the
|
|
frequent errors is leaving some extra whitespace after a file name,
|
|
which is difficult to catch using text editors.
|
|
|
|
However, empty lines are OK.
|
|
|
|
@cindex VCS, excluding patterns from ignore files
|
|
@cindex VCS, ignore files
|
|
@cindex CVS, ignore files
|
|
@cindex Git, ignore files
|
|
@cindex Bazaar, ignore files
|
|
@cindex Mercurial, ignore files
|
|
When archiving directories that are under some version control system (VCS),
|
|
it is often convenient to read exclusion patterns from this VCS'
|
|
ignore files (e.g. @file{.cvsignore}, @file{.gitignore}, etc.) The
|
|
following options provide such possibility:
|
|
|
|
@table @option
|
|
@anchor{exclude-vcs-ignores}
|
|
@opindex exclude-vcs-ignores
|
|
@item --exclude-vcs-ignores
|
|
Before archiving a directory, see if it contains any of the following
|
|
files: @file{cvsignore}, @file{.gitignore}, @file{.bzrignore}, or
|
|
@file{.hgignore}. If so, read ignore patterns from these files.
|
|
|
|
The patterns are treated much as the corresponding VCS would treat
|
|
them, i.e.:
|
|
|
|
@table @file
|
|
@findex .cvsignore
|
|
@item .cvsignore
|
|
Contains shell-style globbing patterns that apply only to the
|
|
directory where this file resides. No comments are allowed in the
|
|
file. Empty lines are ignored.
|
|
|
|
@findex .gitignore
|
|
@item .gitignore
|
|
Contains shell-style globbing patterns. Applies to the directory
|
|
where @file{.gitfile} is located and all its subdirectories.
|
|
|
|
Any line beginning with a @samp{#} is a comment. Backslash escapes
|
|
the comment character.
|
|
|
|
@findex .bzrignore
|
|
@item .bzrignore
|
|
Contains shell globbing-patterns and regular expressions (if prefixed
|
|
with @samp{RE:}@footnote{According to the Bazaar docs,
|
|
globbing-patterns are Korn-shell style and regular expressions are
|
|
perl-style. As of @GNUTAR{} version @value{VERSION}, these are
|
|
treated as shell-style globs and posix extended regexps. This will be
|
|
fixed in future releases.}. Patterns affect the directory and all its
|
|
subdirectories.
|
|
|
|
Any line beginning with a @samp{#} is a comment.
|
|
|
|
@findex .hgignore
|
|
@item .hgignore
|
|
Contains posix regular expressions@footnote{Support for perl-style
|
|
regexps will appear in future releases.}. The line @samp{syntax:
|
|
glob} switches to shell globbing patterns. The line @samp{syntax:
|
|
regexp} switches back. Comments begin with a @samp{#}. Patterns
|
|
affect the directory and all its subdirectories.
|
|
@end table
|
|
|
|
@opindex exclude-ignore
|
|
@item --exclude-ignore=@var{file}
|
|
Before dumping a directory, @command{tar} checks if it contains
|
|
@var{file}. If so, exclusion patterns are read from this file.
|
|
The patterns affect only the directory itself.
|
|
|
|
@opindex exclude-ignore-recursive
|
|
@item --exclude-ignore-recursive=@var{file}
|
|
Same as @option{--exclude-ignore}, except that the patterns read
|
|
affect both the directory where @var{file} resides and all its
|
|
subdirectories.
|
|
@end table
|
|
|
|
@table @option
|
|
@cindex version control system, excluding files
|
|
@cindex VCS, excluding files
|
|
@cindex SCCS, excluding files
|
|
@cindex RCS, excluding files
|
|
@cindex CVS, excluding files
|
|
@cindex SVN, excluding files
|
|
@cindex git, excluding files
|
|
@cindex Bazaar, excluding files
|
|
@cindex Arch, excluding files
|
|
@cindex Mercurial, excluding files
|
|
@cindex Darcs, excluding files
|
|
@anchor{exclude-vcs}
|
|
@opindex exclude-vcs
|
|
@item --exclude-vcs
|
|
Exclude files and directories used by following version control
|
|
systems: @samp{CVS}, @samp{RCS}, @samp{SCCS}, @samp{SVN}, @samp{Arch},
|
|
@samp{Bazaar}, @samp{Mercurial}, and @samp{Darcs}.
|
|
|
|
As of version @value{VERSION}, the following files are excluded:
|
|
|
|
@itemize @bullet
|
|
@item @file{CVS/}, and everything under it
|
|
@item @file{RCS/}, and everything under it
|
|
@item @file{SCCS/}, and everything under it
|
|
@item @file{.git/}, and everything under it
|
|
@item @file{.gitignore}
|
|
@item @file{.gitmodules}
|
|
@item @file{.gitattributes}
|
|
@item @file{.cvsignore}
|
|
@item @file{.svn/}, and everything under it
|
|
@item @file{.arch-ids/}, and everything under it
|
|
@item @file{@{arch@}/}, and everything under it
|
|
@item @file{=RELEASE-ID}
|
|
@item @file{=meta-update}
|
|
@item @file{=update}
|
|
@item @file{.bzr}
|
|
@item @file{.bzrignore}
|
|
@item @file{.bzrtags}
|
|
@item @file{.hg}
|
|
@item @file{.hgignore}
|
|
@item @file{.hgrags}
|
|
@item @file{_darcs}
|
|
@end itemize
|
|
|
|
@opindex exclude-backups
|
|
@item --exclude-backups
|
|
Exclude backup and lock files. This option causes exclusion of files
|
|
that match the following shell globbing patterns:
|
|
|
|
@table @asis
|
|
@item .#*
|
|
@item *~
|
|
@item #*#
|
|
@end table
|
|
|
|
@end table
|
|
|
|
@findex exclude-caches
|
|
When creating an archive, the @option{--exclude-caches} option family
|
|
causes @command{tar} to exclude all directories that contain a @dfn{cache
|
|
directory tag}. A cache directory tag is a short file with the
|
|
well-known name @file{CACHEDIR.TAG} and having a standard header
|
|
specified in @url{http://www.brynosaurus.com/cachedir/spec.html}.
|
|
Various applications write cache directory tags into directories they
|
|
use to hold regenerable, non-precious data, so that such data can be
|
|
more easily excluded from backups.
|
|
|
|
There are three @samp{exclude-caches} options, each providing a different
|
|
exclusion semantics:
|
|
|
|
@table @option
|
|
@opindex exclude-caches
|
|
@item --exclude-caches
|
|
Do not archive the contents of the directory, but archive the
|
|
directory itself and the @file{CACHEDIR.TAG} file.
|
|
|
|
@opindex exclude-caches-under
|
|
@item --exclude-caches-under
|
|
Do not archive the contents of the directory, nor the
|
|
@file{CACHEDIR.TAG} file, archive only the directory itself.
|
|
|
|
@opindex exclude-caches-all
|
|
@item --exclude-caches-all
|
|
Omit directories containing @file{CACHEDIR.TAG} file entirely.
|
|
@end table
|
|
|
|
@findex exclude-tag
|
|
Another option family, @option{--exclude-tag}, provides a generalization of
|
|
this concept. It takes a single argument, a file name to look for.
|
|
Any directory that contains this file will be excluded from the dump.
|
|
Similarly to @samp{exclude-caches}, there are three options in this
|
|
option family:
|
|
|
|
@table @option
|
|
@opindex exclude-tag
|
|
@item --exclude-tag=@var{file}
|
|
Do not dump the contents of the directory, but dump the
|
|
directory itself and the @var{file}.
|
|
|
|
@opindex exclude-tag-under
|
|
@item --exclude-tag-under=@var{file}
|
|
Do not dump the contents of the directory, nor the
|
|
@var{file}, archive only the directory itself.
|
|
|
|
@opindex exclude-tag-all
|
|
@item --exclude-tag-all=@var{file}
|
|
Omit directories containing @var{file} file entirely.
|
|
@end table
|
|
|
|
Multiple @option{--exclude-tag*} options can be given.
|
|
|
|
For example, given this directory:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{find dir}
|
|
dir
|
|
dir/blues
|
|
dir/jazz
|
|
dir/folk
|
|
dir/folk/tagfile
|
|
dir/folk/sanjuan
|
|
dir/folk/trote
|
|
@end group
|
|
@end smallexample
|
|
|
|
The @option{--exclude-tag} will produce the following:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf archive.tar --exclude-tag=tagfile -v dir}
|
|
dir/
|
|
dir/blues
|
|
dir/jazz
|
|
dir/folk/
|
|
tar: dir/folk/: contains a cache directory tag tagfile;
|
|
contents not dumped
|
|
dir/folk/tagfile
|
|
@end smallexample
|
|
|
|
Both the @file{dir/folk} directory and its tagfile are preserved in
|
|
the archive, however the rest of files in this directory are not.
|
|
|
|
Now, using the @option{--exclude-tag-under} option will exclude
|
|
@file{tagfile} from the dump, while still preserving the directory
|
|
itself, as shown in this example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf archive.tar --exclude-tag-under=tagfile -v dir}
|
|
dir/
|
|
dir/blues
|
|
dir/jazz
|
|
dir/folk/
|
|
./tar: dir/folk/: contains a cache directory tag tagfile;
|
|
contents not dumped
|
|
@end smallexample
|
|
|
|
Finally, using @option{--exclude-tag-all} omits the @file{dir/folk}
|
|
directory entirely:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf archive.tar --exclude-tag-all=tagfile -v dir}
|
|
dir/
|
|
dir/blues
|
|
dir/jazz
|
|
./tar: dir/folk/: contains a cache directory tag tagfile;
|
|
directory not dumped
|
|
@end smallexample
|
|
|
|
@menu
|
|
* problems with exclude::
|
|
@end menu
|
|
|
|
@node problems with exclude
|
|
@unnumberedsubsec Problems with Using the @code{exclude} Options
|
|
|
|
@xopindex{exclude, potential problems with}
|
|
Some users find @samp{exclude} options confusing. Here are some common
|
|
pitfalls:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
The main operating mode of @command{tar} does not act on a file name
|
|
explicitly listed on the command line, if one of its file name
|
|
components is excluded. In the example above, if
|
|
you create an archive and exclude files that end with @samp{*.o}, but
|
|
explicitly name the file @samp{dir.o/foo} after all the options have been
|
|
listed, @samp{dir.o/foo} will be excluded from the archive.
|
|
|
|
@item
|
|
You can sometimes confuse the meanings of @option{--exclude} and
|
|
@option{--exclude-from}. Be careful: use @option{--exclude} when files
|
|
to be excluded are given as a pattern on the command line. Use
|
|
@option{--exclude-from} to introduce the name of a file which contains
|
|
a list of patterns, one per line; each of these patterns can exclude
|
|
zero, one, or many files.
|
|
|
|
@item
|
|
When you use @option{--exclude=@var{pattern}}, be sure to quote the
|
|
@var{pattern} parameter, so @GNUTAR{} sees wildcard characters
|
|
like @samp{*}. If you do not do this, the shell might expand the
|
|
@samp{*} itself using files at hand, so @command{tar} might receive a
|
|
list of files instead of one pattern, or none at all, making the
|
|
command somewhat illegal. This might not correspond to what you want.
|
|
|
|
For example, write:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f @var{archive.tar} --exclude '*.o' @var{directory}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
rather than:
|
|
|
|
@smallexample
|
|
# @emph{Wrong!}
|
|
$ @kbd{tar -c -f @var{archive.tar} --exclude *.o @var{directory}}
|
|
@end smallexample
|
|
|
|
@item
|
|
You must use use shell syntax, or globbing, rather than @code{regexp}
|
|
syntax, when using exclude options in @command{tar}. If you try to use
|
|
@code{regexp} syntax to describe files to be excluded, your command
|
|
might fail.
|
|
|
|
@item
|
|
@FIXME{The change in semantics must have occurred before 1.11,
|
|
so I doubt if it is worth mentioning at all. Anyway, should at
|
|
least specify in which version the semantics changed.}
|
|
In earlier versions of @command{tar}, what is now the
|
|
@option{--exclude-from} option was called @option{--exclude} instead.
|
|
Now, @option{--exclude} applies to patterns listed on the command
|
|
line and @option{--exclude-from} applies to patterns listed in a
|
|
file.
|
|
|
|
@end itemize
|
|
|
|
@node wildcards
|
|
@section Wildcards Patterns and Matching
|
|
|
|
@dfn{Globbing} is the operation by which @dfn{wildcard} characters,
|
|
@samp{*} or @samp{?} for example, are replaced and expanded into all
|
|
existing files matching the given pattern. @GNUTAR{} can use wildcard
|
|
patterns for matching (or globbing) archive members when extracting
|
|
from or listing an archive. Wildcard patterns are also used for
|
|
verifying volume labels of @command{tar} archives. This section has the
|
|
purpose of explaining wildcard syntax for @command{tar}.
|
|
|
|
@FIXME{the next few paragraphs need work.}
|
|
|
|
A @var{pattern} should be written according to shell syntax, using wildcard
|
|
characters to effect globbing. Most characters in the pattern stand
|
|
for themselves in the matched string, and case is significant: @samp{a}
|
|
will match only @samp{a}, and not @samp{A}. The character @samp{?} in the
|
|
pattern matches any single character in the matched string. The character
|
|
@samp{*} in the pattern matches zero, one, or more single characters in
|
|
the matched string. The character @samp{\} says to take the following
|
|
character of the pattern @emph{literally}; it is useful when one needs to
|
|
match the @samp{?}, @samp{*}, @samp{[} or @samp{\} characters, themselves.
|
|
|
|
The character @samp{[}, up to the matching @samp{]}, introduces a character
|
|
class. A @dfn{character class} is a list of acceptable characters
|
|
for the next single character of the matched string. For example,
|
|
@samp{[abcde]} would match any of the first five letters of the alphabet.
|
|
Note that within a character class, all of the ``special characters''
|
|
listed above other than @samp{\} lose their special meaning; for example,
|
|
@samp{[-\\[*?]]} would match any of the characters, @samp{-}, @samp{\},
|
|
@samp{[}, @samp{*}, @samp{?}, or @samp{]}. (Due to parsing constraints,
|
|
the characters @samp{-} and @samp{]} must either come @emph{first} or
|
|
@emph{last} in a character class.)
|
|
|
|
@cindex Excluding characters from a character class
|
|
@cindex Character class, excluding characters from
|
|
If the first character of the class after the opening @samp{[}
|
|
is @samp{!} or @samp{^}, then the meaning of the class is reversed.
|
|
Rather than listing character to match, it lists those characters which
|
|
are @emph{forbidden} as the next single character of the matched string.
|
|
|
|
Other characters of the class stand for themselves. The special
|
|
construction @samp{[@var{a}-@var{e}]}, using an hyphen between two
|
|
letters, is meant to represent all characters between @var{a} and
|
|
@var{e}, inclusive.
|
|
|
|
@FIXME{need to add a sentence or so here to make this clear for those
|
|
who don't have dan around.}
|
|
|
|
Periods (@samp{.}) or forward slashes (@samp{/}) are not considered
|
|
special for wildcard matches. However, if a pattern completely matches
|
|
a directory prefix of a matched string, then it matches the full matched
|
|
string: thus, excluding a directory also excludes all the files beneath it.
|
|
|
|
@menu
|
|
* controlling pattern-matching::
|
|
@end menu
|
|
|
|
@node controlling pattern-matching
|
|
@unnumberedsubsec Controlling Pattern-Matching
|
|
|
|
For the purposes of this section, we call @dfn{exclusion members} all
|
|
member names obtained while processing @option{--exclude} and
|
|
@option{--exclude-from} options, and @dfn{inclusion members} those
|
|
member names that were given in the command line or read from the file
|
|
specified with @option{--files-from} option.
|
|
|
|
These two pairs of member lists are used in the following operations:
|
|
@option{--diff}, @option{--extract}, @option{--list},
|
|
@option{--update}.
|
|
|
|
There are no inclusion members in create mode (@option{--create} and
|
|
@option{--append}), since in this mode the names obtained from the
|
|
command line refer to @emph{files}, not archive members.
|
|
|
|
By default, inclusion members are compared with archive members
|
|
literally @footnote{Notice that earlier @GNUTAR{} versions used
|
|
globbing for inclusion members, which contradicted to UNIX98
|
|
specification and was not documented. @xref{Changes}, for more
|
|
information on this and other changes.} and exclusion members are
|
|
treated as globbing patterns. For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf foo.tar}
|
|
a.c
|
|
b.c
|
|
a.txt
|
|
[remarks]
|
|
# @i{Member names are used verbatim:}
|
|
$ @kbd{tar -xf foo.tar -v '[remarks]'}
|
|
[remarks]
|
|
# @i{Exclude member names are globbed:}
|
|
$ @kbd{tar -xf foo.tar -v --exclude '*.c'}
|
|
a.txt
|
|
[remarks]
|
|
@end group
|
|
@end smallexample
|
|
|
|
This behavior can be altered by using the following options:
|
|
|
|
@table @option
|
|
@opindex wildcards
|
|
@item --wildcards
|
|
Treat all member names as wildcards.
|
|
|
|
@opindex no-wildcards
|
|
@item --no-wildcards
|
|
Treat all member names as literal strings.
|
|
@end table
|
|
|
|
Thus, to extract files whose names end in @samp{.c}, you can use:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xf foo.tar -v --wildcards '*.c'}
|
|
a.c
|
|
b.c
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice quoting of the pattern to prevent the shell from interpreting
|
|
it.
|
|
|
|
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:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xf foo.tar --wildcards '*.txt' --no-wildcards '[remarks]'}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
instructs @command{tar} to extract from @file{foo.tar} all files whose
|
|
names end in @samp{.txt} and the file named @file{[remarks]}.
|
|
|
|
Normally, a pattern matches a name if an initial subsequence of the
|
|
name's components matches the pattern, where @samp{*}, @samp{?}, and
|
|
@samp{[...]} are the usual shell wildcards, @samp{\} escapes wildcards,
|
|
and wildcards can match @samp{/}.
|
|
|
|
Other than optionally stripping leading @samp{/} from names
|
|
(@pxref{absolute}), patterns and names are used as-is. For
|
|
example, trailing @samp{/} is not trimmed from a user-specified name
|
|
before deciding whether to exclude it.
|
|
|
|
However, this matching procedure can be altered by the options listed
|
|
below. These options accumulate. For example:
|
|
|
|
@smallexample
|
|
--ignore-case --exclude='makefile' --no-ignore-case ---exclude='readme'
|
|
@end smallexample
|
|
|
|
@noindent
|
|
ignores case when excluding @samp{makefile}, but not when excluding
|
|
@samp{readme}.
|
|
|
|
@table @option
|
|
@anchor{anchored patterns}
|
|
@opindex anchored
|
|
@opindex no-anchored
|
|
@item --anchored
|
|
@itemx --no-anchored
|
|
If anchored, a pattern must match an initial subsequence
|
|
of the name's components. Otherwise, the pattern can match any
|
|
subsequence. Default is @option{--no-anchored} for exclusion members
|
|
and @option{--anchored} inclusion members.
|
|
|
|
@anchor{case-insensitive matches}
|
|
@opindex ignore-case
|
|
@opindex no-ignore-case
|
|
@item --ignore-case
|
|
@itemx --no-ignore-case
|
|
When ignoring case, upper-case patterns match lower-case names and vice versa.
|
|
When not ignoring case (the default), matching is case-sensitive.
|
|
|
|
@opindex wildcards-match-slash
|
|
@opindex no-wildcards-match-slash
|
|
@item --wildcards-match-slash
|
|
@itemx --no-wildcards-match-slash
|
|
When wildcards match slash (the default for exclusion members), a
|
|
wildcard like @samp{*} in the pattern can match a @samp{/} in the
|
|
name. Otherwise, @samp{/} is matched only by @samp{/}.
|
|
|
|
@end table
|
|
|
|
The @option{--recursion} and @option{--no-recursion} options
|
|
(@pxref{recurse}) also affect how member patterns are interpreted. If
|
|
recursion is in effect, a pattern matches a name if it matches any of
|
|
the name's parent directories.
|
|
|
|
The following table summarizes pattern-matching default values:
|
|
|
|
@multitable @columnfractions .3 .7
|
|
@headitem Members @tab Default settings
|
|
@item Inclusion @tab @option{--no-wildcards --anchored --no-wildcards-match-slash}
|
|
@item Exclusion @tab @option{--wildcards --no-anchored --wildcards-match-slash}
|
|
@end multitable
|
|
|
|
@node quoting styles
|
|
@section Quoting Member Names
|
|
|
|
When displaying member names, @command{tar} takes care to avoid
|
|
ambiguities caused by certain characters. This is called @dfn{name
|
|
quoting}. The characters in question are:
|
|
|
|
@itemize @bullet
|
|
@item Non-printable control characters:
|
|
@anchor{escape sequences}
|
|
@multitable @columnfractions 0.20 0.10 0.60
|
|
@headitem Character @tab @acronym{ASCII} @tab Character name
|
|
@item \a @tab 7 @tab Audible bell
|
|
@item \b @tab 8 @tab Backspace
|
|
@item \f @tab 12 @tab Form feed
|
|
@item \n @tab 10 @tab New line
|
|
@item \r @tab 13 @tab Carriage return
|
|
@item \t @tab 9 @tab Horizontal tabulation
|
|
@item \v @tab 11 @tab Vertical tabulation
|
|
@end multitable
|
|
|
|
@item Space (@acronym{ASCII} 32)
|
|
|
|
@item Single and double quotes (@samp{'} and @samp{"})
|
|
|
|
@item Backslash (@samp{\})
|
|
@end itemize
|
|
|
|
The exact way @command{tar} uses to quote these characters depends on
|
|
the @dfn{quoting style}. The default quoting style, called
|
|
@dfn{escape} (see below), uses backslash notation to represent control
|
|
characters and backslash.
|
|
|
|
@GNUTAR{} offers seven distinct quoting styles, which can be selected
|
|
using @option{--quoting-style} option:
|
|
|
|
@table @option
|
|
@item --quoting-style=@var{style}
|
|
@opindex quoting-style
|
|
|
|
Sets quoting style. Valid values for @var{style} argument are:
|
|
literal, shell, shell-always, c, escape, locale, clocale.
|
|
@end table
|
|
|
|
These styles are described in detail below. To illustrate their
|
|
effect, we will use an imaginary tar archive @file{arch.tar}
|
|
containing the following members:
|
|
|
|
@smallexample
|
|
@group
|
|
# 1. Contains horizontal tabulation character.
|
|
a tab
|
|
# 2. Contains newline character
|
|
a
|
|
newline
|
|
# 3. Contains a space
|
|
a space
|
|
# 4. Contains double quotes
|
|
a"double"quote
|
|
# 5. Contains single quotes
|
|
a'single'quote
|
|
# 6. Contains a backslash character:
|
|
a\backslash
|
|
@end group
|
|
@end smallexample
|
|
|
|
Here is how usual @command{ls} command would have listed them, if they
|
|
had existed in the current working directory:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{ls}
|
|
a\ttab
|
|
a\nnewline
|
|
a\ space
|
|
a"double"quote
|
|
a'single'quote
|
|
a\\backslash
|
|
@end group
|
|
@end smallexample
|
|
|
|
Quoting styles:
|
|
|
|
@table @samp
|
|
@item literal
|
|
No quoting, display each character as is:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=literal}
|
|
./
|
|
./a space
|
|
./a'single'quote
|
|
./a"double"quote
|
|
./a\backslash
|
|
./a tab
|
|
./a
|
|
newline
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item shell
|
|
Display characters the same way Bourne shell does:
|
|
control characters, except @samp{\t} and @samp{\n}, are printed using
|
|
backslash escapes, @samp{\t} and @samp{\n} are printed as is, and a
|
|
single quote is printed as @samp{\'}. If a name contains any quoted
|
|
characters, it is enclosed in single quotes. In particular, if a name
|
|
contains single quotes, it is printed as several single-quoted strings:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=shell}
|
|
./
|
|
'./a space'
|
|
'./a'\''single'\''quote'
|
|
'./a"double"quote'
|
|
'./a\backslash'
|
|
'./a tab'
|
|
'./a
|
|
newline'
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item shell-always
|
|
Same as @samp{shell}, but the names are always enclosed in single
|
|
quotes:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=shell-always}
|
|
'./'
|
|
'./a space'
|
|
'./a'\''single'\''quote'
|
|
'./a"double"quote'
|
|
'./a\backslash'
|
|
'./a tab'
|
|
'./a
|
|
newline'
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item c
|
|
Use the notation of the C programming language. All names are
|
|
enclosed in double quotes. Control characters are quoted using
|
|
backslash notations, double quotes are represented as @samp{\"},
|
|
backslash characters are represented as @samp{\\}. Single quotes and
|
|
spaces are not quoted:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=c}
|
|
"./"
|
|
"./a space"
|
|
"./a'single'quote"
|
|
"./a\"double\"quote"
|
|
"./a\\backslash"
|
|
"./a\ttab"
|
|
"./a\nnewline"
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item escape
|
|
Control characters are printed using backslash notation, and a
|
|
backslash as @samp{\\}. This is the default quoting style, unless it
|
|
was changed when configured the package.
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=escape}
|
|
./
|
|
./a space
|
|
./a'single'quote
|
|
./a"double"quote
|
|
./a\\backslash
|
|
./a\ttab
|
|
./a\nnewline
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item locale
|
|
Control characters, single quote and backslash are printed using
|
|
backslash notation. All names are quoted using left and right
|
|
quotation marks, appropriate to the current locale. If it does not
|
|
define quotation marks, use @samp{'} as left and as right
|
|
quotation marks. Any occurrences of the right quotation mark in a
|
|
name are escaped with @samp{\}, for example:
|
|
|
|
For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=locale}
|
|
'./'
|
|
'./a space'
|
|
'./a\'single\'quote'
|
|
'./a"double"quote'
|
|
'./a\\backslash'
|
|
'./a\ttab'
|
|
'./a\nnewline'
|
|
@end group
|
|
@end smallexample
|
|
|
|
@item clocale
|
|
Same as @samp{locale}, but @samp{"} is used for both left and right
|
|
quotation marks, if not provided by the currently selected locale:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=clocale}
|
|
"./"
|
|
"./a space"
|
|
"./a'single'quote"
|
|
"./a\"double\"quote"
|
|
"./a\\backslash"
|
|
"./a\ttab"
|
|
"./a\nnewline"
|
|
@end group
|
|
@end smallexample
|
|
@end table
|
|
|
|
You can specify which characters should be quoted in addition to those
|
|
implied by the current quoting style:
|
|
|
|
@table @option
|
|
@item --quote-chars=@var{string}
|
|
Always quote characters from @var{string}, even if the selected
|
|
quoting style would not quote them.
|
|
@end table
|
|
|
|
For example, using @samp{escape} quoting (compare with the usual
|
|
escape listing above):
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar tf arch.tar --quoting-style=escape --quote-chars=' "'}
|
|
./
|
|
./a\ space
|
|
./a'single'quote
|
|
./a\"double\"quote
|
|
./a\\backslash
|
|
./a\ttab
|
|
./a\nnewline
|
|
@end group
|
|
@end smallexample
|
|
|
|
To disable quoting of such additional characters, use the following
|
|
option:
|
|
|
|
@table @option
|
|
@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.
|
|
@end table
|
|
|
|
This option is particularly useful if you have added
|
|
@option{--quote-chars} to your @env{TAR_OPTIONS} (@pxref{TAR_OPTIONS})
|
|
and wish to disable it for the current invocation.
|
|
|
|
Note, that @option{--no-quote-chars} does @emph{not} disable those
|
|
characters that are quoted by default in the selected quoting style.
|
|
|
|
@node transform
|
|
@section Modifying File and Member Names
|
|
|
|
@command{Tar} archives contain detailed information about files stored
|
|
in them and full file names are part of that information. When
|
|
storing a file to an archive, its file name is recorded in it,
|
|
along with the actual file contents. When restoring from an archive,
|
|
a file is created on disk with exactly the same name as that stored
|
|
in the archive. In the majority of cases this is the desired behavior
|
|
of a file archiver. However, there are some cases when it is not.
|
|
|
|
First of all, it is often unsafe to extract archive members with
|
|
absolute file names or those that begin with a @file{../}. @GNUTAR{}
|
|
takes special precautions when extracting such names and provides a
|
|
special option for handling them, which is described in
|
|
@ref{absolute}.
|
|
|
|
Secondly, you may wish to extract file names without some leading
|
|
directory components, or with otherwise modified names. In other
|
|
cases it is desirable to store files under differing names in the
|
|
archive.
|
|
|
|
@GNUTAR{} provides several options for these needs.
|
|
|
|
@table @option
|
|
@opindex strip-components
|
|
@item --strip-components=@var{number}
|
|
Strip given @var{number} of leading components from file names before
|
|
extraction.
|
|
@end table
|
|
|
|
For example, suppose you have archived whole @file{/usr} hierarchy to
|
|
a tar archive named @file{usr.tar}. Among other files, this archive
|
|
contains @file{usr/include/stdlib.h}, which you wish to extract to
|
|
the current working directory. To do so, you type:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -xf usr.tar --strip=2 usr/include/stdlib.h}
|
|
@end smallexample
|
|
|
|
The option @option{--strip=2} instructs @command{tar} to strip the
|
|
two leading components (@file{usr/} and @file{include/}) off the file
|
|
name.
|
|
|
|
If you add the @option{--verbose} (@option{-v}) option to the invocation
|
|
above, you will note that the verbose listing still contains the
|
|
full file name, with the two removed components still in place. This
|
|
can be inconvenient, so @command{tar} provides a special option for
|
|
altering this behavior:
|
|
|
|
@anchor{show-transformed-names}
|
|
@table @option
|
|
@opindex show-transformed-names
|
|
@item --show-transformed-names
|
|
Display file or member names with all requested transformations
|
|
applied.
|
|
@end table
|
|
|
|
@noindent
|
|
For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar -xf usr.tar -v --strip=2 usr/include/stdlib.h}
|
|
usr/include/stdlib.h
|
|
$ @kbd{tar -xf usr.tar -v --strip=2 --show-transformed usr/include/stdlib.h}
|
|
stdlib.h
|
|
@end group
|
|
@end smallexample
|
|
|
|
Notice that in both cases the file @file{stdlib.h} is extracted to the
|
|
current working directory, @option{--show-transformed-names} affects
|
|
only the way its name is displayed.
|
|
|
|
This option is especially useful for verifying whether the invocation
|
|
will have the desired effect. Thus, before running
|
|
|
|
@smallexample
|
|
$ @kbd{tar -x --strip=@var{n}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
it is often advisable to run
|
|
|
|
@smallexample
|
|
$ @kbd{tar -t -v --show-transformed --strip=@var{n}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
to make sure the command will produce the intended results.
|
|
|
|
In case you need to apply more complex modifications to the file name,
|
|
@GNUTAR{} provides a general-purpose transformation option:
|
|
|
|
@table @option
|
|
@opindex transform
|
|
@opindex xform
|
|
@item --transform=@var{expression}
|
|
@itemx --xform=@var{expression}
|
|
Modify file names using supplied @var{expression}.
|
|
@end table
|
|
|
|
@noindent
|
|
The @var{expression} is a @command{sed}-like replace expression of the
|
|
form:
|
|
|
|
@smallexample
|
|
s/@var{regexp}/@var{replace}/[@var{flags}]
|
|
@end smallexample
|
|
|
|
@noindent
|
|
where @var{regexp} is a @dfn{regular expression}, @var{replace} is a
|
|
replacement for each file name part that matches @var{regexp}. Both
|
|
@var{regexp} and @var{replace} are described in detail in
|
|
@ref{The "s" Command, The "s" Command, The `s' Command, sed, GNU sed}.
|
|
|
|
Any delimiter can be used in lieu of @samp{/}, the only requirement being
|
|
that it be used consistently throughout the expression. For example,
|
|
the following two expressions are equivalent:
|
|
|
|
@smallexample
|
|
@group
|
|
s/one/two/
|
|
s,one,two,
|
|
@end group
|
|
@end smallexample
|
|
|
|
Changing delimiters is often useful when the @var{regex} contains
|
|
slashes. For example, it is more convenient to write @code{s,/,-,} than
|
|
@code{s/\//-/}.
|
|
|
|
As in @command{sed}, you can give several replace expressions,
|
|
separated by a semicolon.
|
|
|
|
Supported @var{flags} are:
|
|
|
|
@table @samp
|
|
@item g
|
|
Apply the replacement to @emph{all} matches to the @var{regexp}, not
|
|
just the first.
|
|
|
|
@item i
|
|
Use case-insensitive matching.
|
|
|
|
@item x
|
|
@var{regexp} is an @dfn{extended regular expression} (@pxref{Extended
|
|
regexps, Extended regular expressions, Extended regular expressions,
|
|
sed, GNU sed}).
|
|
|
|
@item @var{number}
|
|
Only replace the @var{number}th match of the @var{regexp}.
|
|
|
|
Note: the @acronym{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 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.
|
|
|
|
@end table
|
|
|
|
In addition, several @dfn{transformation scope} flags are supported,
|
|
that control to what files transformations apply. These are:
|
|
|
|
@table @samp
|
|
@item r
|
|
Apply transformation to regular archive members.
|
|
|
|
@item R
|
|
Do not apply transformation to regular archive members.
|
|
|
|
@item s
|
|
Apply transformation to symbolic link targets.
|
|
|
|
@item S
|
|
Do not apply transformation to symbolic link targets.
|
|
|
|
@item h
|
|
Apply transformation to hard link targets.
|
|
|
|
@item H
|
|
Do not apply transformation to hard link targets.
|
|
@end table
|
|
|
|
Default is @samp{rsh}, which means to apply transformations to both archive
|
|
members and targets of symbolic and hard links.
|
|
|
|
Default scope flags can also be changed using @samp{flags=} statement
|
|
in the transform expression. The flags set this way remain in force
|
|
until next @samp{flags=} statement or end of expression, whichever
|
|
occurs first. For example:
|
|
|
|
@smallexample
|
|
--transform 'flags=S;s|^|/usr/local/|'
|
|
@end smallexample
|
|
|
|
Here are several examples of @option{--transform} usage:
|
|
|
|
@enumerate
|
|
@item Extract @file{usr/} hierarchy into @file{usr/local/}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --transform='s,usr/,usr/local/,' -x -f arch.tar}
|
|
@end smallexample
|
|
|
|
@item Strip two leading directory components (equivalent to
|
|
@option{--strip-components=2}):
|
|
|
|
@smallexample
|
|
$ @kbd{tar --transform='s,/*[^/]*/[^/]*/,,' -x -f arch.tar}
|
|
@end smallexample
|
|
|
|
@item Convert each file name to lower case:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --transform 's/.*/\L&/' -x -f arch.tar}
|
|
@end smallexample
|
|
|
|
@item Prepend @file{/prefix/} to each file name:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --transform 's,^,/prefix/,' -x -f arch.tar}
|
|
@end smallexample
|
|
|
|
@item Archive the @file{/lib} directory, prepending @samp{/usr/local}
|
|
to each archive member:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --transform 's,^,/usr/local/,S' -c -f arch.tar /lib}
|
|
@end smallexample
|
|
@end enumerate
|
|
|
|
Notice the use of flags in the last example. The @file{/lib}
|
|
directory often contains many symbolic links to files within it.
|
|
It may look, for example, like this:
|
|
|
|
@smallexample
|
|
$ @kbd{ls -l}
|
|
drwxr-xr-x root/root 0 2008-07-08 16:20 /lib/
|
|
-rwxr-xr-x root/root 1250840 2008-05-25 07:44 /lib/libc-2.3.2.so
|
|
lrwxrwxrwx root/root 0 2008-06-24 17:12 /lib/libc.so.6 -> libc-2.3.2.so
|
|
...
|
|
@end smallexample
|
|
|
|
Using the expression @samp{s,^,/usr/local/,} would mean adding
|
|
@samp{/usr/local} to both regular archive members and to link
|
|
targets. In this case, @file{/lib/libc.so.6} would become:
|
|
|
|
@smallexample
|
|
/usr/local/lib/libc.so.6 -> /usr/local/libc-2.3.2.so
|
|
@end smallexample
|
|
|
|
This is definitely not desired. To avoid this, the @samp{S} flag
|
|
is used, which excludes symbolic link targets from filename
|
|
transformations. The result is:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --transform 's,^,/usr/local/,S' -c -v -f arch.tar \
|
|
--show-transformed /lib}
|
|
drwxr-xr-x root/root 0 2008-07-08 16:20 /usr/local/lib/
|
|
-rwxr-xr-x root/root 1250840 2008-05-25 07:44 /usr/local/lib/libc-2.3.2.so
|
|
lrwxrwxrwx root/root 0 2008-06-24 17:12 /usr/local/lib/libc.so.6 \
|
|
-> libc-2.3.2.so
|
|
@end smallexample
|
|
|
|
Unlike @option{--strip-components}, @option{--transform} can be used
|
|
in any @GNUTAR{} operation mode. For example, the following command
|
|
adds files to the archive while replacing the leading @file{usr/}
|
|
component with @file{var/}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf arch.tar --transform='s,^usr/,var/,' /}
|
|
@end smallexample
|
|
|
|
To test @option{--transform} effect we suggest using
|
|
@option{--show-transformed-names} option:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf arch.tar --transform='s,^usr/,var/,' \
|
|
--verbose --show-transformed-names /}
|
|
@end smallexample
|
|
|
|
If both @option{--strip-components} and @option{--transform} are used
|
|
together, then @option{--transform} is applied first, and the required
|
|
number of components is then stripped from its result.
|
|
|
|
You can use as many @option{--transform} options in a single command
|
|
line as you want. The specified expressions will then be applied in
|
|
order of their appearance. For example, the following two invocations
|
|
are equivalent:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf arch.tar --transform='s,/usr/var,/var/' \
|
|
--transform='s,/usr/local,/usr/,'}
|
|
$ @kbd{tar -cf arch.tar \
|
|
--transform='s,/usr/var,/var/;s,/usr/local,/usr/,'}
|
|
@end smallexample
|
|
|
|
@node after
|
|
@section Operating Only on New Files
|
|
|
|
@cindex Excluding file by age
|
|
@cindex Data Modification time, excluding files by
|
|
@cindex Modification time, excluding files by
|
|
@cindex Age, excluding files by
|
|
The @option{--after-date=@var{date}} (@option{--newer=@var{date}},
|
|
@option{-N @var{date}}) option causes @command{tar} to only work on
|
|
files whose data modification or status change times are newer than
|
|
the @var{date} given. If @var{date} starts with @samp{/} or @samp{.},
|
|
it is taken to be a file name; the data modification time of that file
|
|
is used as the date. If you use this option when creating or appending
|
|
to an archive, the archive will only include new files. If you use
|
|
@option{--after-date} when extracting an archive, @command{tar} will
|
|
only extract files newer than the @var{date} you specify.
|
|
|
|
If you only want @command{tar} to make the date comparison based on
|
|
modification of the file's data (rather than status
|
|
changes), then use the @option{--newer-mtime=@var{date}} option.
|
|
|
|
@cindex --after-date and --update compared
|
|
@cindex --newer-mtime and --update compared
|
|
You may use these options with any operation. Note that these options
|
|
differ from the @option{--update} (@option{-u}) operation in that they
|
|
allow you to specify a particular date against which @command{tar} can
|
|
compare when deciding whether or not to archive the files.
|
|
|
|
@table @option
|
|
@opindex after-date
|
|
@opindex newer
|
|
@item --after-date=@var{date}
|
|
@itemx --newer=@var{date}
|
|
@itemx -N @var{date}
|
|
Only store files newer than @var{date}.
|
|
|
|
Acts on files only if their data modification or status change times are
|
|
later than @var{date}. Use in conjunction with any operation.
|
|
|
|
If @var{date} starts with @samp{/} or @samp{.}, it is taken to be a file
|
|
name; the data modification time of that file is used as the date.
|
|
|
|
@opindex newer-mtime
|
|
@item --newer-mtime=@var{date}
|
|
Acts like @option{--after-date}, but only looks at data modification times.
|
|
@end table
|
|
|
|
These options limit @command{tar} to operate only on files which have
|
|
been modified after the date specified. A file's status is considered to have
|
|
changed if its contents have been modified, or if its owner,
|
|
permissions, and so forth, have been changed. (For more information on
|
|
how to specify a date, see @ref{Date input formats}; remember that the
|
|
entire date argument must be quoted if it contains any spaces.)
|
|
|
|
Gurus would say that @option{--after-date} tests both the data
|
|
modification time (@code{mtime}, the time the contents of the file
|
|
were last modified) and the status change time (@code{ctime}, the time
|
|
the file's status was last changed: owner, permissions, etc.@:)
|
|
fields, while @option{--newer-mtime} tests only the @code{mtime}
|
|
field.
|
|
|
|
To be precise, @option{--after-date} checks @emph{both} @code{mtime} and
|
|
@code{ctime} and processes the file if either one is more recent than
|
|
@var{date}, while @option{--newer-mtime} only checks @code{mtime} and
|
|
disregards @code{ctime}. Neither does it use @code{atime} (the last time the
|
|
contents of the file were looked at).
|
|
|
|
Date specifiers can have embedded spaces. Because of this, you may need
|
|
to quote date arguments to keep the shell from parsing them as separate
|
|
arguments. For example, the following command will add to the archive
|
|
all the files modified less than two days ago:
|
|
|
|
@smallexample
|
|
$ @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},
|
|
for proper way of creating incremental backups.
|
|
@end quotation
|
|
|
|
@node recurse
|
|
@section Descending into Directories
|
|
@cindex Avoiding recursion in directories
|
|
@cindex Descending directories, avoiding
|
|
@cindex Directories, avoiding recursion
|
|
@cindex Recursion in directories, avoiding
|
|
|
|
Usually, @command{tar} will recursively explore all directories (either
|
|
those given on the command line or through the @option{--files-from}
|
|
option) for the various files they contain. However, you may not always
|
|
want @command{tar} to act this way.
|
|
|
|
@opindex no-recursion
|
|
@cindex @command{find}, using with @command{tar}
|
|
The @option{--no-recursion} option inhibits @command{tar}'s recursive descent
|
|
into specified directories. If you specify @option{--no-recursion}, you can
|
|
use the @command{find} (@pxref{Top,, find, find, GNU Find Manual})
|
|
utility for hunting through levels of directories to
|
|
construct a list of file names which you could then pass to @command{tar}.
|
|
@command{find} allows you to be more selective when choosing which files to
|
|
archive; see @ref{files}, for more information on using @command{find} with
|
|
@command{tar}.
|
|
|
|
@table @option
|
|
@item --no-recursion
|
|
Prevents @command{tar} from recursively descending directories.
|
|
|
|
@opindex recursion
|
|
@item --recursion
|
|
Requires @command{tar} to recursively descend directories.
|
|
This is the default.
|
|
@end table
|
|
|
|
When you use @option{--no-recursion}, @GNUTAR{} grabs
|
|
directory entries themselves, but does not descend on them
|
|
recursively. Many people use @command{find} for locating files they
|
|
want to back up, and since @command{tar} @emph{usually} recursively
|
|
descends on directories, they have to use the @samp{@w{-not -type d}}
|
|
test in their @command{find} invocation (@pxref{Type, Type, Type test,
|
|
find, Finding Files}), as they usually do not want all the files in a
|
|
directory. They then use the @option{--files-from} option to archive
|
|
the files located via @command{find}.
|
|
|
|
The problem when restoring files archived in this manner is that the
|
|
directories themselves are not in the archive; so the
|
|
@option{--same-permissions} (@option{--preserve-permissions},
|
|
@option{-p}) option does not affect them---while users might really
|
|
like it to. Specifying @option{--no-recursion} is a way to tell
|
|
@command{tar} to grab only the directory entries given to it, adding
|
|
no new files on its own. To summarize, if you use @command{find} to
|
|
create a list of files to be stored in an archive, use it as follows:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{find @var{dir} @var{tests} | \
|
|
tar -cf @var{archive} --no-recursion -T -}
|
|
@end group
|
|
@end smallexample
|
|
|
|
The @option{--no-recursion} option also applies when extracting: it
|
|
causes @command{tar} to extract only the matched directory entries, not
|
|
the files under those directories.
|
|
|
|
The @option{--no-recursion} option also affects how globbing patterns
|
|
are interpreted (@pxref{controlling pattern-matching}).
|
|
|
|
The @option{--no-recursion} and @option{--recursion} options apply to
|
|
later options and operands, and can be overridden by later occurrences
|
|
of @option{--no-recursion} and @option{--recursion}. For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf jams.tar --no-recursion grape --recursion grape/concord}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
creates an archive with one entry for @file{grape}, and the recursive
|
|
contents of @file{grape/concord}, but no entries under @file{grape}
|
|
other than @file{grape/concord}.
|
|
|
|
@node one
|
|
@section Crossing File System Boundaries
|
|
@cindex File system boundaries, not crossing
|
|
|
|
@command{tar} will normally automatically cross file system boundaries in
|
|
order to archive files which are part of a directory tree. You can
|
|
change this behavior by running @command{tar} and specifying
|
|
@option{--one-file-system}. This option only affects files that are
|
|
archived because they are in a directory that is being archived;
|
|
@command{tar} will still archive files explicitly named on the command line
|
|
or through @option{--files-from}, regardless of where they reside.
|
|
|
|
@table @option
|
|
@opindex one-file-system
|
|
@item --one-file-system
|
|
Prevents @command{tar} from crossing file system boundaries when
|
|
archiving. Use in conjunction with any write operation.
|
|
@end table
|
|
|
|
The @option{--one-file-system} option causes @command{tar} to modify its
|
|
normal behavior in archiving the contents of directories. If a file in
|
|
a directory is not on the same file system as the directory itself, then
|
|
@command{tar} will not archive that file. If the file is a directory
|
|
itself, @command{tar} will not archive anything beneath it; in other words,
|
|
@command{tar} will not cross mount points.
|
|
|
|
This option is useful for making full or incremental archival backups of
|
|
a file system. If this option is used in conjunction with
|
|
@option{--verbose} (@option{-v}), files that are excluded are
|
|
mentioned by name on the standard error.
|
|
|
|
@menu
|
|
* directory:: Changing Directory
|
|
* absolute:: Absolute File Names
|
|
@end menu
|
|
|
|
@node directory
|
|
@subsection Changing the Working Directory
|
|
|
|
@FIXME{need to read over this node now for continuity; i've switched
|
|
things around some.}
|
|
|
|
@cindex Changing directory mid-stream
|
|
@cindex Directory, changing mid-stream
|
|
@cindex Working directory, specifying
|
|
To change the working directory in the middle of a list of file names,
|
|
either on the command line or in a file specified using
|
|
@option{--files-from} (@option{-T}), use @option{--directory} (@option{-C}).
|
|
This will change the working directory to the specified directory
|
|
after that point in the list.
|
|
|
|
@table @option
|
|
@opindex directory
|
|
@item --directory=@var{directory}
|
|
@itemx -C @var{directory}
|
|
Changes the working directory in the middle of a command line.
|
|
@end table
|
|
|
|
For example,
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f jams.tar grape prune -C food cherry}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
will place the files @file{grape} and @file{prune} from the current
|
|
directory into the archive @file{jams.tar}, followed by the file
|
|
@file{cherry} from the directory @file{food}. This option is especially
|
|
useful when you have several widely separated files that you want to
|
|
store in the same archive.
|
|
|
|
Note that the file @file{cherry} is recorded in the archive under the
|
|
precise name @file{cherry}, @emph{not} @file{food/cherry}. Thus, the
|
|
archive will contain three files that all appear to have come from the
|
|
same directory; if the archive is extracted with plain @samp{tar
|
|
--extract}, all three files will be written in the current directory.
|
|
|
|
Contrast this with the command,
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f jams.tar grape prune -C food red/cherry}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
which records the third file in the archive under the name
|
|
@file{red/cherry} so that, if the archive is extracted using
|
|
@samp{tar --extract}, the third file will be written in a subdirectory
|
|
named @file{red}.
|
|
|
|
You can use the @option{--directory} option to make the archive
|
|
independent of the original name of the directory holding the files.
|
|
The following command places the files @file{/etc/passwd},
|
|
@file{/etc/hosts}, and @file{/lib/libc.a} into the archive
|
|
@file{foo.tar}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f foo.tar -C /etc passwd hosts -C /lib libc.a}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
However, the names of the archive members will be exactly what they were
|
|
on the command line: @file{passwd}, @file{hosts}, and @file{libc.a}.
|
|
They will not appear to be related by file name to the original
|
|
directories where those files were located.
|
|
|
|
Note that @option{--directory} options are interpreted consecutively. If
|
|
@option{--directory} specifies a relative file name, it is interpreted
|
|
relative to the then current directory, which might not be the same as
|
|
the original current working directory of @command{tar}, due to a previous
|
|
@option{--directory} option.
|
|
|
|
When using @option{--files-from} (@pxref{files}), you can put various
|
|
@command{tar} options (including @option{-C}) in the file list. Notice,
|
|
however, that in this case the option and its argument may not be
|
|
separated by whitespace. If you use short option, its argument must
|
|
either follow the option letter immediately, without any intervening
|
|
whitespace, or occupy the next line. Otherwise, if you use long
|
|
option, separate its argument by an equal sign.
|
|
|
|
For instance, the file list for the above example will be:
|
|
|
|
@smallexample
|
|
@group
|
|
-C/etc
|
|
passwd
|
|
hosts
|
|
--directory=/lib
|
|
libc.a
|
|
@end group
|
|
@end smallexample
|
|
|
|
@noindent
|
|
To use it, you would invoke @command{tar} as follows:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f foo.tar --files-from list}
|
|
@end smallexample
|
|
|
|
The interpretation of options in file lists is disabled by
|
|
@option{--verbatim-files-from} and @option{--null} options.
|
|
|
|
@node absolute
|
|
@subsection Absolute File Names
|
|
@cindex absolute file names
|
|
@cindex file names, absolute
|
|
|
|
By default, @GNUTAR{} drops a leading @samp{/} on
|
|
input or output, and complains about file names containing a @file{..}
|
|
component. There is an option that turns off this behavior:
|
|
|
|
@table @option
|
|
@opindex absolute-names
|
|
@item --absolute-names
|
|
@itemx -P
|
|
Do not strip leading slashes from file names, and permit file names
|
|
containing a @file{..} file name component.
|
|
@end table
|
|
|
|
When @command{tar} extracts archive members from an archive, it strips any
|
|
leading slashes (@samp{/}) from the member name. This causes absolute
|
|
member names in the archive to be treated as relative file names. This
|
|
allows you to have such members extracted wherever you want, instead of
|
|
being restricted to extracting the member in the exact directory named
|
|
in the archive. For example, if the archive member has the name
|
|
@file{/etc/passwd}, @command{tar} will extract it as if the name were
|
|
really @file{etc/passwd}.
|
|
|
|
File names containing @file{..} can cause problems when extracting, so
|
|
@command{tar} normally warns you about such files when creating an
|
|
archive, and rejects attempts to extracts such files.
|
|
|
|
Other @command{tar} programs do not do this. As a result, if you
|
|
create an archive whose member names start with a slash, they will be
|
|
difficult for other people with a non-@GNUTAR{}
|
|
program to use. Therefore, @GNUTAR{} also strips
|
|
leading slashes from member names when putting members into the
|
|
archive. For example, if you ask @command{tar} to add the file
|
|
@file{/bin/ls} to an archive, it will do so, but the member name will
|
|
be @file{bin/ls}@footnote{A side effect of this is that when
|
|
@option{--create} is used with @option{--verbose} the resulting output
|
|
is not, generally speaking, the same as the one you'd get running
|
|
@kbd{tar --list} command. This may be important if you use some
|
|
scripts for comparing both outputs. @xref{listing member and file names},
|
|
for the information on how to handle this case.}.
|
|
|
|
Symbolic links containing @file{..} or leading @samp{/} can also cause
|
|
problems when extracting, so @command{tar} normally extracts them last;
|
|
it may create empty files as placeholders during extraction.
|
|
|
|
If you use the @option{--absolute-names} (@option{-P}) option,
|
|
@command{tar} will do none of these transformations.
|
|
|
|
To archive or extract files relative to the root directory, specify
|
|
the @option{--absolute-names} (@option{-P}) option.
|
|
|
|
Normally, @command{tar} acts on files relative to the working
|
|
directory---ignoring superior directory names when archiving, and
|
|
ignoring leading slashes when extracting.
|
|
|
|
When you specify @option{--absolute-names} (@option{-P}),
|
|
@command{tar} stores file names including all superior directory
|
|
names, and preserves leading slashes. If you only invoked
|
|
@command{tar} from the root directory you would never need the
|
|
@option{--absolute-names} option, but using this option
|
|
may be more convenient than switching to root.
|
|
|
|
@FIXME{Should be an example in the tutorial/wizardry section using this
|
|
to transfer files between systems.}
|
|
|
|
@table @option
|
|
@item --absolute-names
|
|
Preserves full file names (including superior directory names) when
|
|
archiving and extracting files.
|
|
|
|
@end table
|
|
|
|
@command{tar} prints out a message about removing the @samp{/} from
|
|
file names. This message appears once per @GNUTAR{}
|
|
invocation. It represents something which ought to be told; ignoring
|
|
what it means can cause very serious surprises, later.
|
|
|
|
Some people, nevertheless, do not want to see this message. Wanting to
|
|
play really dangerously, one may of course redirect @command{tar} standard
|
|
error to the sink. For example, under @command{sh}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f archive.tar /home 2> /dev/null}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Another solution, both nicer and simpler, would be to change to
|
|
the @file{/} directory first, and then avoid absolute notation.
|
|
For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -c -f archive.tar -C / home}
|
|
@end smallexample
|
|
|
|
@xref{Integrity}, for some of the security-related implications
|
|
of using this option.
|
|
|
|
@include parse-datetime.texi
|
|
|
|
@node Formats
|
|
@chapter Controlling the Archive Format
|
|
|
|
@cindex Tar archive formats
|
|
Due to historical reasons, there are several formats of tar archives.
|
|
All of them are based on the same principles, but have some subtle
|
|
differences that often make them incompatible with each other.
|
|
|
|
GNU tar is able to create and handle archives in a variety of formats.
|
|
The most frequently used formats are (in alphabetical order):
|
|
|
|
@table @asis
|
|
@item gnu
|
|
Format used by @GNUTAR{} versions up to 1.13.25. This format derived
|
|
from an early @acronym{POSIX} standard, adding some improvements such as
|
|
sparse file handling and incremental archives. Unfortunately these
|
|
features were implemented in a way incompatible with other archive
|
|
formats.
|
|
|
|
Archives in @samp{gnu} format are able to hold file names of unlimited
|
|
length.
|
|
|
|
@item oldgnu
|
|
Format used by @GNUTAR{} of versions prior to 1.12.
|
|
|
|
@item v7
|
|
Archive format, compatible with the V7 implementation of tar. This
|
|
format imposes a number of limitations. The most important of them
|
|
are:
|
|
|
|
@enumerate
|
|
@item The maximum length of a file name is limited to 99 characters.
|
|
@item The maximum length of a symbolic link is limited to 99 characters.
|
|
@item It is impossible to store special files (block and character
|
|
devices, fifos etc.)
|
|
@item Maximum value of user or group @acronym{ID} is limited to 2097151 (7777777
|
|
octal)
|
|
@item V7 archives do not contain symbolic ownership information (user
|
|
and group name of the file owner).
|
|
@end enumerate
|
|
|
|
This format has traditionally been used by Automake when producing
|
|
Makefiles. This practice will change in the future, in the meantime,
|
|
however this means that projects containing file names more than 99
|
|
characters long will not be able to use @GNUTAR{} @value{VERSION} and
|
|
Automake prior to 1.9.
|
|
|
|
@item ustar
|
|
Archive format defined by @acronym{POSIX.1-1988} specification. It stores
|
|
symbolic ownership information. It is also able to store
|
|
special files. However, it imposes several restrictions as well:
|
|
|
|
@enumerate
|
|
@item The maximum length of a file name is limited to 256 characters,
|
|
provided that the file name can be split at a directory separator in
|
|
two parts, first of them being at most 155 bytes long. So, in most
|
|
cases the maximum file name length will be shorter than 256
|
|
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 accommodate
|
|
is 8GB
|
|
@item Maximum value of UID/GID is 2097151.
|
|
@item Maximum number of bits in device major and minor numbers is 21.
|
|
@end enumerate
|
|
|
|
@item star
|
|
Format used by J@"org Schilling @command{star}
|
|
implementation. @GNUTAR{} is able to read @samp{star} archives but
|
|
currently does not produce them.
|
|
|
|
@item posix
|
|
Archive format defined by @acronym{POSIX.1-2001} specification. This is the
|
|
most flexible and feature-rich format. It does not impose any
|
|
restrictions on file sizes or file name lengths. This format is quite
|
|
recent, so not all tar implementations are able to handle it properly.
|
|
However, this format is designed in such a way that any tar
|
|
implementation able to read @samp{ustar} archives will be able to read
|
|
most @samp{posix} archives as well, with the only exception that any
|
|
additional information (such as long file names etc.)@: will in such
|
|
case be extracted as plain text files along with the files it refers to.
|
|
|
|
This archive format will be the default format for future versions
|
|
of @GNUTAR{}.
|
|
|
|
@end table
|
|
|
|
The following table summarizes the limitations of each of these
|
|
formats:
|
|
|
|
@multitable @columnfractions .10 .20 .20 .20 .20
|
|
@headitem Format @tab UID @tab File Size @tab File Name @tab Devn
|
|
@item gnu @tab 1.8e19 @tab Unlimited @tab Unlimited @tab 63
|
|
@item oldgnu @tab 1.8e19 @tab Unlimited @tab Unlimited @tab 63
|
|
@item v7 @tab 2097151 @tab 8GB @tab 99 @tab n/a
|
|
@item ustar @tab 2097151 @tab 8GB @tab 256 @tab 21
|
|
@item posix @tab Unlimited @tab Unlimited @tab Unlimited @tab Unlimited
|
|
@end multitable
|
|
|
|
The default format for @GNUTAR{} is defined at compilation
|
|
time. You may check it by running @command{tar --help}, and examining
|
|
the last lines of its output. Usually, @GNUTAR{} is configured
|
|
to create archives in @samp{gnu} format, however, future version will
|
|
switch to @samp{posix}.
|
|
|
|
@menu
|
|
* 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 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
|
|
|
|
@cindex gzip
|
|
@cindex bzip2
|
|
@cindex lzip
|
|
@cindex lzma
|
|
@cindex lzop
|
|
@cindex compress
|
|
@cindex zstd
|
|
@GNUTAR{} is able to create and read compressed archives. It supports
|
|
a wide variety of compression programs, namely: @command{gzip},
|
|
@command{bzip2}, @command{lzip}, @command{lzma}, @command{lzop},
|
|
@command{zstd}, @command{xz} and traditional @command{compress}. The
|
|
latter is supported mostly for backward compatibility, and we recommend
|
|
against using it, because it is by far less effective than the other
|
|
compression programs@footnote{It also had patent problems in the past.}.
|
|
|
|
Creating a compressed archive is simple: you just specify a
|
|
@dfn{compression option} along with the usual archive creation
|
|
commands. Available compression options are summarized in the
|
|
table below:
|
|
|
|
@multitable @columnfractions 0.4 0.2 0.4
|
|
@headitem Long @tab Short @tab Archive format
|
|
@item @option{--gzip} @tab @option{-z} @tab @command{gzip}
|
|
@item @option{--bzip2} @tab @option{-j} @tab @command{bzip2}
|
|
@item @option{--xz} @tab @option{-J} @tab @command{xz}
|
|
@item @option{--lzip} @tab @tab @command{lzip}
|
|
@item @option{--lzma} @tab @tab @command{lzma}
|
|
@item @option{--lzop} @tab @tab @command{lzop}
|
|
@item @option{--zstd} @tab @tab @command{zstd}
|
|
@item @option{--compress} @tab @option{-Z} @tab @command{compress}
|
|
@end multitable
|
|
|
|
For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar czf archive.tar.gz .}
|
|
@end smallexample
|
|
|
|
You can also let @GNUTAR{} select the compression program based on
|
|
the suffix of the archive file name. This is done using
|
|
@option{--auto-compress} (@option{-a}) command line option. For
|
|
example, the following invocation will use @command{bzip2} for
|
|
compression:
|
|
|
|
@smallexample
|
|
$ @kbd{tar caf archive.tar.bz2 .}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
whereas the following one will use @command{lzma}:
|
|
|
|
@smallexample
|
|
$ @kbd{tar caf archive.tar.lzma .}
|
|
@end smallexample
|
|
|
|
For a complete list of file name suffixes recognized by @GNUTAR{},
|
|
see @ref{auto-compress}.
|
|
|
|
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 format recognition algorithm is based on @dfn{signatures}, a
|
|
special byte sequences in the beginning of file, that are specific for
|
|
certain compression formats. If this approach fails, @command{tar}
|
|
falls back to using archive name suffix to determine its format
|
|
(@pxref{auto-compress}, for a list of recognized suffixes).
|
|
|
|
@anchor{alternative decompression programs}
|
|
@cindex alternative decompression programs
|
|
Some compression programs are able to handle different compression
|
|
formats. @GNUTAR{} uses this, if the principal decompressor for the
|
|
given format is not available. For example, if @command{compress} is
|
|
not installed, @command{tar} will try to use @command{gzip}. As of
|
|
version @value{VERSION} the following alternatives are
|
|
tried@footnote{To verbosely trace the decompressor selection, use the
|
|
@option{--warning=decompress-program} option
|
|
(@pxref{warnings,decompress-program}).}:
|
|
|
|
@multitable @columnfractions 0.3 0.3 0.3
|
|
@headitem Format @tab Main decompressor @tab Alternatives
|
|
@item compress @tab compress @tab gzip
|
|
@item lzma @tab lzma @tab xz
|
|
@item bzip2 @tab bzip2 @tab lbzip2
|
|
@end multitable
|
|
|
|
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 tzf -}
|
|
@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}, alias @option{-u})
|
|
them or delete (@option{--delete}) members from them or
|
|
add (@option{--append}, alias @option{-r}) members to them. Likewise, you
|
|
cannot append another @command{tar} archive to a compressed archive using
|
|
@option{--concatenate} (@option{-A}). Secondly, multi-volume
|
|
archives cannot be compressed.
|
|
|
|
The following options allow to select a particular compressor program:
|
|
|
|
@table @option
|
|
@opindex gzip
|
|
@opindex ungzip
|
|
@item -z
|
|
@itemx --gzip
|
|
@itemx --ungzip
|
|
Filter the archive through @command{gzip}.
|
|
|
|
@opindex xz
|
|
@item -J
|
|
@itemx --xz
|
|
Filter the archive through @code{xz}.
|
|
|
|
@item -j
|
|
@itemx --bzip2
|
|
Filter the archive through @code{bzip2}.
|
|
|
|
@opindex lzip
|
|
@item --lzip
|
|
Filter the archive through @command{lzip}.
|
|
|
|
@opindex lzma
|
|
@item --lzma
|
|
Filter the archive through @command{lzma}.
|
|
|
|
@opindex lzop
|
|
@item --lzop
|
|
Filter the archive through @command{lzop}.
|
|
|
|
@opindex zstd
|
|
@item --zstd
|
|
Filter the archive through @command{zstd}.
|
|
|
|
@opindex compress
|
|
@opindex uncompress
|
|
@item -Z
|
|
@itemx --compress
|
|
@itemx --uncompress
|
|
Filter the archive through @command{compress}.
|
|
@end table
|
|
|
|
When any of these options is given, @GNUTAR{} searches the compressor
|
|
binary in the current path and invokes it. The name of the compressor
|
|
program is specified at compilation time using a corresponding
|
|
@option{--with-@var{compname}} option to @command{configure}, e.g.
|
|
@option{--with-bzip2} to select a specific @command{bzip2} binary.
|
|
@xref{lbzip2}, for a detailed discussion.
|
|
|
|
The output produced by @command{tar --help} shows the actual
|
|
compressor names along with each of these options.
|
|
|
|
You can use any of these options 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.
|
|
You can override them by using the @option{-I} option (see
|
|
below), e.g.:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -cf archive.tar.gz -I 'gzip -9 -n' subdir}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
A more traditional way to do this is to use a pipe:
|
|
|
|
@smallexample
|
|
$ @kbd{tar cf - subdir | gzip -9 -n > archive.tar.gz}
|
|
@end smallexample
|
|
|
|
@cindex corrupted archives
|
|
Compressed archives are easily corrupted, because compressed files
|
|
have little redundancy. 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.
|
|
|
|
Other compression options provide better control over creating
|
|
compressed archives. These are:
|
|
|
|
@table @option
|
|
@anchor{auto-compress}
|
|
@opindex auto-compress
|
|
@item --auto-compress
|
|
@itemx -a
|
|
Select a compression program to use by the archive file name
|
|
suffix. The following suffixes are recognized:
|
|
|
|
@multitable @columnfractions 0.3 0.6
|
|
@headitem Suffix @tab Compression program
|
|
@item @samp{.gz} @tab @command{gzip}
|
|
@item @samp{.tgz} @tab @command{gzip}
|
|
@item @samp{.taz} @tab @command{gzip}
|
|
@item @samp{.Z} @tab @command{compress}
|
|
@item @samp{.taZ} @tab @command{compress}
|
|
@item @samp{.bz2} @tab @command{bzip2}
|
|
@item @samp{.tz2} @tab @command{bzip2}
|
|
@item @samp{.tbz2} @tab @command{bzip2}
|
|
@item @samp{.tbz} @tab @command{bzip2}
|
|
@item @samp{.lz} @tab @command{lzip}
|
|
@item @samp{.lzma} @tab @command{lzma}
|
|
@item @samp{.tlz} @tab @command{lzma}
|
|
@item @samp{.lzo} @tab @command{lzop}
|
|
@item @samp{.xz} @tab @command{xz}
|
|
@item @samp{.zst} @tab @command{zstd}
|
|
@item @samp{.tzst} @tab @command{zstd}
|
|
@end multitable
|
|
|
|
@anchor{use-compress-program}
|
|
@opindex use-compress-program
|
|
@item --use-compress-program=@var{command}
|
|
@itemx -I=@var{command}
|
|
Use external compression program @var{command}. Use this option if you
|
|
want to specify options for the compression program, or if you
|
|
are not happy with the compression program associated with the suffix
|
|
at compile time, or if you have a compression program that @GNUTAR{}
|
|
does not support. The @var{command} argument is a valid command
|
|
invocation, as you would type it at the command line prompt, with any
|
|
additional options as needed. Enclose it in quotes if it contains
|
|
white space (@pxref{external, Running External Commands}).
|
|
|
|
The @var{command} should follow two conventions:
|
|
|
|
First, when invoked without additional options, it should read data
|
|
from standard input, compress it and output it on standard output.
|
|
|
|
Secondly, if invoked with the additional @option{-d} option, it should
|
|
do exactly the opposite, i.e., read the compressed data from the
|
|
standard input and produce uncompressed data on the standard output.
|
|
|
|
The latter requirement means that you must not use the @option{-d}
|
|
option as a part of the @var{command} itself.
|
|
@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 -Igpgz .}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Likewise, the command below will list its contents:
|
|
|
|
@smallexample
|
|
$ @kbd{tar -tf foo.tar.gpgz -Igpgz .}
|
|
@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
|
|
|
|
@menu
|
|
* lbzip2:: Using lbzip2 with @GNUTAR{}.
|
|
@end menu
|
|
|
|
@node lbzip2
|
|
@subsubsection Using lbzip2 with @GNUTAR{}.
|
|
@cindex lbzip2
|
|
@cindex Laszlo Ersek
|
|
@command{Lbzip2} is a multithreaded utility for handling
|
|
@samp{bzip2} compression, written by Laszlo Ersek. It makes use of
|
|
multiple processors to speed up its operation and in general works
|
|
considerably faster than @command{bzip2}. For a detailed description
|
|
of @command{lbzip2} see @uref{http://freshmeat.net/@/projects/@/lbzip2} and
|
|
@uref{http://www.linuxinsight.com/@/lbzip2-parallel-bzip2-utility.html,
|
|
lbzip2: parallel bzip2 utility}.
|
|
|
|
Recent versions of @command{lbzip2} are mostly command line compatible
|
|
with @command{bzip2}, which makes it possible to automatically invoke
|
|
it via the @option{--bzip2} @GNUTAR{} command line option. To do so,
|
|
@GNUTAR{} must be configured with the @option{--with-bzip2} command
|
|
line option, like this:
|
|
|
|
@smallexample
|
|
$ @kbd{./configure --with-bzip2=lbzip2 [@var{other-options}]}
|
|
@end smallexample
|
|
|
|
Once configured and compiled this way, @command{tar --help} will show the
|
|
following:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --help | grep -- --bzip2}
|
|
-j, --bzip2 filter the archive through lbzip2
|
|
@end group
|
|
@end smallexample
|
|
|
|
@noindent
|
|
which means that running @command{tar --bzip2} will invoke @command{lbzip2}.
|
|
|
|
@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 holes. It then records in the archive for the file where
|
|
the holes (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 also holes created wherever the holes
|
|
were found. Thus, if you use @option{--sparse}, @command{tar} archives won't
|
|
take more space than the original.
|
|
|
|
@GNUTAR{} uses two methods for detecting holes in sparse files. These
|
|
methods are described later in this subsection.
|
|
|
|
@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 may present a serious
|
|
drawback. Namely, in order to determine the positions of holes in a file
|
|
@command{tar} may have to read it before trying to archive it, so in total
|
|
the file may be read @strong{twice}. This may happen when your OS or your FS
|
|
does not support @dfn{SEEK_HOLE/SEEK_DATA} feature in @dfn{lseek} (See
|
|
@option{--hole-detection}, below).
|
|
|
|
@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}.
|
|
|
|
@table @option
|
|
@opindex hole-detection
|
|
@cindex hole detection
|
|
@item --hole-detection=@var{method}
|
|
Enforce concrete hole detection method. Before the real contents of sparse
|
|
file are stored, @command{tar} needs to gather knowledge about file
|
|
sparseness. This is because it needs to have the file's map of holes
|
|
stored into tar header before it starts archiving the file contents.
|
|
Currently, two methods of hole detection are implemented:
|
|
|
|
@itemize @bullet
|
|
@item @option{--hole-detection=seek}
|
|
Seeking the file for data and holes. It uses enhancement of the @code{lseek}
|
|
system call (@code{SEEK_HOLE} and @code{SEEK_DATA}) which is able to
|
|
reuse file system knowledge about sparse file contents - so the
|
|
detection is usually very fast. To use this feature, your file system
|
|
and operating system must support it. At the time of this writing
|
|
(2015) this feature, in spite of not being accepted by POSIX, is
|
|
fairly widely supported by different operating systems.
|
|
|
|
@item @option{--hole-detection=raw}
|
|
Reading byte-by-byte the whole sparse file before the archiving. This
|
|
method detects holes like consecutive stretches of zeroes. Comparing to
|
|
the previous method, it is usually much slower, although more
|
|
portable.
|
|
@end itemize
|
|
@end table
|
|
|
|
When no @option{--hole-detection} option is given, @command{tar} uses
|
|
the @samp{seek}, if supported by the operating system.
|
|
|
|
Using @option{--hole-detection} option implies @option{--sparse}.
|
|
|
|
@node Attributes
|
|
@section Handling File Attributes
|
|
@cindex attributes, files
|
|
@cindex file attributes
|
|
|
|
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.
|
|
|
|
@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 @acronym{ID} and user name
|
|
separately. If it can't find a user name (because the user @acronym{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 @acronym{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{--format=oldgnu} 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}).
|
|
@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
|
|
* hard links:: Hard 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 @acronym{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 on
|
|
case-insensitive file systems like FAT32,
|
|
you should not rely on case distinction for file names.
|
|
|
|
@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.
|
|
When @option{--dereference} (@option{-h}) is used with
|
|
@option{--create} (@option{-c}), @command{tar} archives the files
|
|
symbolic links point to, instead of
|
|
the links themselves.
|
|
|
|
When creating portable archives, use @option{--dereference}
|
|
(@option{-h}): some systems do not support
|
|
symbolic links, and moreover, your distribution might be unusable if
|
|
it contains unresolved symbolic links.
|
|
|
|
When reading from an archive, the @option{--dereference} (@option{-h})
|
|
option causes @command{tar} to follow an already-existing symbolic
|
|
link when @command{tar} writes or reads a file named in the archive.
|
|
Ordinarily, @command{tar} does not follow such a link, though it may
|
|
remove the link before writing a new file. @xref{Dealing with Old
|
|
Files}.
|
|
|
|
The @option{--dereference} option is unsafe if an untrusted user can
|
|
modify directories while @command{tar} is running. @xref{Security}.
|
|
|
|
@node hard links
|
|
@subsection Hard Links
|
|
@cindex File names, using hard links
|
|
@cindex hard links, dereferencing
|
|
@cindex dereferencing hard links
|
|
|
|
Normally, when @command{tar} archives a hard link, it writes a
|
|
block to the archive naming the target of the link (a @samp{1} type
|
|
block). In that way, the actual file contents is stored in file only
|
|
once. For example, consider the following two files:
|
|
|
|
@smallexample
|
|
@group
|
|
$ ls -l
|
|
-rw-r--r-- 2 gray staff 4 2007-10-30 15:11 one
|
|
-rw-r--r-- 2 gray staff 4 2007-10-30 15:11 jeden
|
|
@end group
|
|
@end smallexample
|
|
|
|
Here, @file{jeden} is a link to @file{one}. When archiving this
|
|
directory with a verbose level 2, you will get an output similar to
|
|
the following:
|
|
|
|
@smallexample
|
|
$ tar cvvf ../archive.tar .
|
|
drwxr-xr-x gray/staff 0 2007-10-30 15:13 ./
|
|
-rw-r--r-- gray/staff 4 2007-10-30 15:11 ./jeden
|
|
hrw-r--r-- gray/staff 0 2007-10-30 15:11 ./one link to ./jeden
|
|
@end smallexample
|
|
|
|
The last line shows that, instead of storing two copies of the file,
|
|
@command{tar} stored it only once, under the name @file{jeden}, and
|
|
stored file @file{one} as a hard link to this file.
|
|
|
|
It may be important to know that all hard links to the given file are
|
|
stored in the archive. For example, this may be necessary for exact
|
|
reproduction of the file system. The following option does that:
|
|
|
|
@table @option
|
|
@xopindex{check-links, described}
|
|
@item --check-links
|
|
@itemx -l
|
|
Check the number of links dumped for each processed file. If this
|
|
number does not match the total number of hard links for the file, print
|
|
a warning message.
|
|
@end table
|
|
|
|
For example, trying to archive only file @file{jeden} with this option
|
|
produces the following diagnostics:
|
|
|
|
@smallexample
|
|
$ tar -c -f ../archive.tar -l jeden
|
|
tar: Missing links to 'jeden'.
|
|
@end smallexample
|
|
|
|
Although creating special records for hard links helps keep a faithful
|
|
record of the file system contents and makes archives more compact, it
|
|
may present some difficulties when extracting individual members from
|
|
the archive. For example, trying to extract file @file{one} from the
|
|
archive created in previous examples produces, in the absence of file
|
|
@file{jeden}:
|
|
|
|
@smallexample
|
|
$ tar xf archive.tar ./one
|
|
tar: ./one: Cannot hard link to './jeden': No such file or directory
|
|
tar: Error exit delayed from previous errors
|
|
@end smallexample
|
|
|
|
The reason for this behavior is that @command{tar} cannot seek back in
|
|
the archive to the previous member (in this case, @file{one}), to
|
|
extract it@footnote{There are plans to fix this in future releases.}.
|
|
If you wish to avoid such problems at the cost of a bigger archive,
|
|
use the following option:
|
|
|
|
@table @option
|
|
@xopindex{hard-dereference, described}
|
|
@item --hard-dereference
|
|
Dereference hard links and store the files they refer to.
|
|
@end table
|
|
|
|
For example, trying this option on our two sample files, we get two
|
|
copies in the archive, each of which can then be extracted
|
|
independently of the other:
|
|
|
|
@smallexample
|
|
@group
|
|
$ tar -c -vv -f ../archive.tar --hard-dereference .
|
|
drwxr-xr-x gray/staff 0 2007-10-30 15:13 ./
|
|
-rw-r--r-- gray/staff 4 2007-10-30 15:11 ./jeden
|
|
-rw-r--r-- gray/staff 4 2007-10-30 15:11 ./one
|
|
@end group
|
|
@end smallexample
|
|
|
|
@node old
|
|
@subsection Old V7 Archives
|
|
@cindex Format, old style
|
|
@cindex Old style format
|
|
@cindex Old style archives
|
|
@cindex v7 archive format
|
|
|
|
Certain old versions of @command{tar} cannot handle additional
|
|
information recorded by newer @command{tar} programs. To create an
|
|
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 @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
|
|
group and user IDs instead of group and user names.
|
|
|
|
When updating an archive, do not use @option{--format=v7}
|
|
unless the archive was created using this option.
|
|
|
|
In most cases, a @emph{new} format archive can be read by an @emph{old}
|
|
@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. 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
|
|
|
|
@cindex ustar archive format
|
|
The archive format defined by the @acronym{POSIX}.1-1988 specification is
|
|
called @code{ustar}. Although it is more flexible than the V7 format, it
|
|
still has many restrictions (@pxref{Formats,ustar}, for the detailed
|
|
description of @code{ustar} format). Along with V7 format,
|
|
@code{ustar} format is a good choice for archives intended to be read
|
|
with other implementations of @command{tar}.
|
|
|
|
To create an archive in @code{ustar} format, use the @option{--format=ustar}
|
|
option in conjunction with @option{--create} (@option{-c}).
|
|
|
|
@node gnu
|
|
@subsection @acronym{GNU} and old @GNUTAR{} format
|
|
|
|
@cindex GNU archive format
|
|
@cindex Old GNU archive format
|
|
@GNUTAR{} was based on an early draft of the
|
|
@acronym{POSIX} 1003.1 @code{ustar} standard. @acronym{GNU} extensions to
|
|
@command{tar}, such as the support for file names longer than 100
|
|
characters, use portions of the @command{tar} header record which were
|
|
specified in that @acronym{POSIX} draft as unused. Subsequent changes in
|
|
@acronym{POSIX} have allocated the same parts of the header record for
|
|
other purposes. As a result, @GNUTAR{} format is
|
|
incompatible with the current @acronym{POSIX} specification, and with
|
|
@command{tar} programs that follow it.
|
|
|
|
In the majority of cases, @command{tar} will be configured to create
|
|
this format by default. This will change in future releases, since
|
|
we plan to make @samp{POSIX} format the default.
|
|
|
|
To force creation a @GNUTAR{} archive, use option
|
|
@option{--format=gnu}.
|
|
|
|
@node posix
|
|
@subsection @GNUTAR{} and @acronym{POSIX} @command{tar}
|
|
|
|
@cindex POSIX archive format
|
|
@cindex PAX archive format
|
|
Starting from version 1.14 @GNUTAR{} features full support for
|
|
@acronym{POSIX.1-2001} archives.
|
|
|
|
A @acronym{POSIX} conformant archive will be created if @command{tar}
|
|
was given @option{--format=posix} (@option{--format=pax}) option. No
|
|
special option is required to read and extract from a @acronym{POSIX}
|
|
archive.
|
|
|
|
@menu
|
|
* PAX keywords:: Controlling Extended Header Keywords.
|
|
@end menu
|
|
|
|
@node PAX keywords
|
|
@subsubsection Controlling Extended Header Keywords
|
|
|
|
@table @option
|
|
@opindex pax-option
|
|
@item --pax-option=@var{keyword-list}
|
|
Handle keywords in @acronym{PAX} extended headers. This option is
|
|
equivalent to @option{-o} option of the @command{pax} utility.
|
|
@end table
|
|
|
|
@var{Keyword-list} is a comma-separated
|
|
list of keyword options, each keyword option taking one of
|
|
the following forms:
|
|
|
|
@table @code
|
|
@item delete=@var{pattern}
|
|
When used with one of archive-creation commands,
|
|
this option instructs @command{tar} to omit from extended header records
|
|
that it produces any keywords matching the string @var{pattern}.
|
|
If the pattern contains shell metacharacters like @samp{*}, it should
|
|
be quoted to prevent the shell from expanding the pattern before
|
|
@command{tar} sees it.
|
|
|
|
When used in extract or list mode, this option instructs tar
|
|
to ignore any keywords matching the given @var{pattern} in the extended
|
|
header records. In both cases, matching is performed using the pattern
|
|
matching notation described in @acronym{POSIX 1003.2}, 3.13
|
|
(@pxref{wildcards}). For example:
|
|
|
|
@smallexample
|
|
--pax-option 'delete=security.*'
|
|
@end smallexample
|
|
|
|
would suppress security-related information.
|
|
|
|
@item exthdr.name=@var{string}
|
|
|
|
This keyword allows user control over the name that is written into the
|
|
ustar header blocks for the extended headers. The name is obtained
|
|
from @var{string} after making the following substitutions:
|
|
|
|
@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 the translated file name.
|
|
@item %f @tab The name of the file with the directory information
|
|
stripped, equivalent to the result of the @command{basename} utility
|
|
on the translated file name.
|
|
@item %p @tab The process @acronym{ID} of the @command{tar} process.
|
|
@item %% @tab A @samp{%} character.
|
|
@end multitable
|
|
|
|
Any other @samp{%} characters in @var{string} produce undefined
|
|
results.
|
|
|
|
If no option @samp{exthdr.name=string} is specified, @command{tar}
|
|
will use the following default value:
|
|
|
|
@smallexample
|
|
%d/PaxHeaders/%f
|
|
@end smallexample
|
|
|
|
This default is selected to ensure the reproducibility of the
|
|
archive. @acronym{POSIX} standard recommends to use
|
|
@samp{%d/PaxHeaders.%p/%f} instead, which means the two archives
|
|
created with the same set of options and containing the same set
|
|
of files will be byte-to-byte different. This default will be used
|
|
if the environment variable @env{POSIXLY_CORRECT} is set.
|
|
|
|
@item exthdr.mtime=@var{value}
|
|
|
|
This keyword defines the value of the @samp{mtime} field that
|
|
is written into the ustar header blocks for the extended headers.
|
|
By default, the @samp{mtime} field is set to the modification time
|
|
of the archive member described by that extended header (or to the
|
|
value of the @option{--mtime} option, if supplied).
|
|
|
|
@item globexthdr.name=@var{string}
|
|
This keyword allows user control over the name that is written into
|
|
the ustar header blocks for global extended header records. The name
|
|
is obtained from the contents of @var{string}, after making
|
|
the following substitutions:
|
|
|
|
@multitable @columnfractions .25 .55
|
|
@headitem Meta-character @tab Replaced By
|
|
@item %n @tab An integer that represents the
|
|
sequence number of the global extended header record in the archive,
|
|
starting at 1.
|
|
@item %p @tab The process @acronym{ID} of the @command{tar} process.
|
|
@item %% @tab A @samp{%} character.
|
|
@end multitable
|
|
|
|
Any other @samp{%} characters in @var{string} produce undefined results.
|
|
|
|
If no option @samp{globexthdr.name=string} is specified, @command{tar}
|
|
will use the following default value:
|
|
|
|
@smallexample
|
|
$TMPDIR/GlobalHead.%n
|
|
@end smallexample
|
|
|
|
If the environment variable @env{POSIXLY_CORRECT} is set, the
|
|
following value is used instead:
|
|
|
|
@smallexample
|
|
$TMPDIR/GlobalHead.%p.%n
|
|
@end smallexample
|
|
|
|
In both cases, @samp{$TMPDIR} stands for the value of the @var{TMPDIR}
|
|
environment variable. If @var{TMPDIR} is not set, @command{tar}
|
|
uses @samp{/tmp}.
|
|
|
|
@item globexthdr.mtime=@var{value}
|
|
|
|
This keyword defines the value of the @samp{mtime} field that
|
|
is written into the ustar header blocks for the global extended headers.
|
|
By default, the @samp{mtime} field is set to the time when
|
|
@command{tar} was invoked.
|
|
|
|
@item @var{keyword}=@var{value}
|
|
When used with one of archive-creation commands, these keyword/value pairs
|
|
will be included at the beginning of the archive in a global extended
|
|
header record. When used with one of archive-reading commands,
|
|
@command{tar} will behave as if it has encountered these keyword/value
|
|
pairs at the beginning of the archive in a global extended header
|
|
record.
|
|
|
|
@item @var{keyword}:=@var{value}
|
|
When used with one of archive-creation commands, these keyword/value pairs
|
|
will be included as records at the beginning of an extended header for
|
|
each file. This is effectively equivalent to @var{keyword}=@var{value}
|
|
form except that it creates no global extended header records.
|
|
|
|
When used with one of archive-reading commands, @command{tar} will
|
|
behave as if these keyword/value pairs were included as records at the
|
|
end of each extended header; thus, they will override any global or
|
|
file-specific extended header record keywords of the same names.
|
|
For example, in the command:
|
|
|
|
@smallexample
|
|
tar --format=posix --create \
|
|
--file archive --pax-option gname:=user .
|
|
@end smallexample
|
|
|
|
the group name will be forced to a new value for all files
|
|
stored in the archive.
|
|
@end table
|
|
|
|
In any of the forms described above, the @var{value} may be
|
|
a string enclosed in curly braces. In that case, the string
|
|
between the braces is understood either as a textual time
|
|
representation, as described in @ref{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.
|
|
|
|
For example, to set all modification times to the current date, you
|
|
use the following option:
|
|
|
|
@smallexample
|
|
--pax-option 'mtime:=@{now@}'
|
|
@end smallexample
|
|
|
|
@cindex archives, binary equivalent
|
|
@cindex binary equivalent archives, creating
|
|
As another example, here is the option that ensures that any two
|
|
archives created using it, will be binary equivalent if they have the
|
|
same contents:
|
|
|
|
@smallexample
|
|
--pax-option delete=atime
|
|
@end smallexample
|
|
|
|
@noindent
|
|
If you extract files from such an archive and recreate the archive
|
|
from them, you will also need to eliminate changes due to ctime:
|
|
|
|
@smallexample
|
|
--pax-option 'delete=atime,delete=ctime'
|
|
@end smallexample
|
|
|
|
Normally @command{tar} saves an mtime value with subsecond resolution
|
|
in an extended header for any file with a timestamp that is not on a
|
|
one-second boundary. This is in addition to the traditional mtime
|
|
timestamp in the header block. Although you can suppress subsecond
|
|
timestamp resolution with @option{--pax-option delete=mtime},
|
|
this hack will not work for timestamps before 1970 or after 2242-03-16
|
|
12:56:31 @sc{utc}.
|
|
|
|
If the environment variable @env{POSIXLY_CORRECT} is set, two POSIX
|
|
archives created using the same options on the same set of files might
|
|
not be byte-to-byte equivalent even with the above options. This is
|
|
because the POSIX default for extended header names includes
|
|
the @command{tar} process @acronym{ID}, which typically differs at each
|
|
run. To produce byte-to-byte equivalent archives in this case, either
|
|
unset @env{POSIXLY_CORRECT}, or use the following option, which can be
|
|
combined with the above options:
|
|
|
|
@smallexample
|
|
--pax-option exthdr.name=%d/PaxHeaders/%f
|
|
@end smallexample
|
|
|
|
@node Checksumming
|
|
@subsection Checksumming Problems
|
|
|
|
SunOS and HP-UX @command{tar} fail to accept archives created using
|
|
@GNUTAR{} and containing non-@acronym{ASCII} file names, that
|
|
is, file names having characters with the eighth bit set, because they
|
|
use signed checksums, while @GNUTAR{} uses unsigned
|
|
checksums while creating archives, as per @acronym{POSIX} standards. On
|
|
reading, @GNUTAR{} computes both checksums and accepts either of them.
|
|
It is somewhat worrying that a lot of people may go
|
|
around doing backup of their files using faulty (or at least
|
|
non-standard) software, not learning about it until it's time to
|
|
restore their missing files with an incompatible file extractor, or
|
|
vice versa.
|
|
|
|
@GNUTAR{} computes checksums both ways, and accepts either of them
|
|
on read, so @acronym{GNU} tar can read Sun tapes even with their
|
|
wrong checksums. @GNUTAR{} produces the standard
|
|
checksum, however, raising incompatibilities with Sun. That is to
|
|
say, @GNUTAR{} has not been modified to
|
|
@emph{produce} incorrect archives to be read by buggy @command{tar}'s.
|
|
I've been told that more recent Sun @command{tar} now read standard
|
|
archives, so maybe Sun did a similar patch, after all?
|
|
|
|
The story seems to be that when Sun first imported @command{tar}
|
|
sources on their system, they recompiled it without realizing that
|
|
the checksums were computed differently, because of a change in
|
|
the default signing of @code{char}'s in their compiler. So they
|
|
started computing checksums wrongly. When they later realized their
|
|
mistake, they merely decided to stay compatible with it, and with
|
|
themselves afterwards. Presumably, but I do not really know, HP-UX
|
|
has chosen their @command{tar} archives to be compatible with Sun's.
|
|
The current standards do not favor Sun @command{tar} format. In any
|
|
case, it now falls on the shoulders of SunOS and HP-UX users to get
|
|
a @command{tar} able to read the good archives they receive.
|
|
|
|
@node Large or Negative Values
|
|
@subsection Large or Negative Values
|
|
@cindex large values
|
|
@cindex future time stamps
|
|
@cindex negative time stamps
|
|
@UNREVISED{}
|
|
|
|
The above sections suggest to use @samp{oldest possible} archive
|
|
format if in doubt. However, sometimes it is not possible. If you
|
|
attempt to archive a file whose metadata cannot be represented using
|
|
required format, @GNUTAR{} will print error message and ignore such a
|
|
file. You will than have to switch to a format that is able to
|
|
handle such values. The format summary table (@pxref{Formats}) will
|
|
help you to do so.
|
|
|
|
In particular, when trying to archive files larger than 8GB or with
|
|
timestamps not in the range 1970-01-01 00:00:00 through 2242-03-16
|
|
12:56:31 @sc{utc}, you will have to chose between @acronym{GNU} and
|
|
@acronym{POSIX} archive formats. When considering which format to
|
|
choose, bear in mind that the @acronym{GNU} format uses
|
|
two's-complement base-256 notation to store values that do not fit
|
|
into standard @acronym{ustar} range. Such archives can generally be
|
|
read only by a @GNUTAR{} implementation. Moreover, they sometimes
|
|
cannot be correctly restored on another hosts even by @GNUTAR{}. For
|
|
example, using two's complement representation for negative time
|
|
stamps that assumes a signed 32-bit @code{time_t} generates archives
|
|
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 Other Tars
|
|
@subsection How to Extract GNU-Specific Data Using Other @command{tar} Implementations
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
@menu
|
|
* Split Recovery:: Members Split Between Volumes
|
|
* Sparse Recovery:: Sparse Members
|
|
@end menu
|
|
|
|
@node Split Recovery
|
|
@subsubsection Extracting Members Split Between Volumes
|
|
|
|
@cindex Multi-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{tarcat vol-1.tar vol-2.tar vol-3.tar | tar xf -}
|
|
@end smallexample
|
|
|
|
@cindex Multi-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
|
|
%d/GNUFileParts/%f.%n
|
|
@end smallexample
|
|
|
|
@noindent
|
|
where symbols preceded by @samp{%} are @dfn{macro characters} that
|
|
have the following meaning:
|
|
|
|
@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 @acronym{ID} of the @command{tar} process that
|
|
created the archive.
|
|
@item %n @tab Ordinal number of this particular part.
|
|
@end multitable
|
|
|
|
For example, if the file @file{var/longfile} was split during archive
|
|
creation between three volumes, then the member names will be:
|
|
|
|
@smallexample
|
|
var/longfile
|
|
var/GNUFileParts/longfile.1
|
|
var/GNUFileParts/longfile.2
|
|
@end smallexample
|
|
|
|
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
|
|
$ @kbd{cd var}
|
|
$ @kbd{cat GNUFileParts/longfile.1 \
|
|
GNUFileParts/longfile.2 >> longfile}
|
|
$ rm -f GNUFileParts
|
|
@end group
|
|
@end smallexample
|
|
|
|
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
|
|
@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
|
|
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
|
|
@group
|
|
$ @kbd{tar xf vol-1.tar}
|
|
var/PaxHeaders/longfile: Unknown file type 'x', extracted as
|
|
normal file
|
|
Unexpected EOF in archive
|
|
$ @kbd{tar xf vol-2.tar}
|
|
tmp/GlobalHead.1: Unknown file type 'g', extracted as normal file
|
|
GNUFileParts/PaxHeaders/sparsefile.1: Unknown file type
|
|
'x', extracted as normal file
|
|
@end group
|
|
@end smallexample
|
|
|
|
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.
|
|
|
|
@node Sparse Recovery
|
|
@subsubsection Extracting Sparse Members
|
|
|
|
@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 blocks (or
|
|
@dfn{holes}) back to their original locations, we call this process
|
|
@dfn{expanding} a compressed sparse file.
|
|
|
|
@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}.
|
|
|
|
@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 @acronym{ID}} of the @command{tar} process which created the
|
|
archive (@pxref{PAX keywords}).}.
|
|
|
|
To expand a version 1.0 file, run @command{xsparse} as follows:
|
|
|
|
@smallexample
|
|
$ @kbd{xsparse @file{cond-file}}
|
|
@end smallexample
|
|
|
|
@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
|
|
|
|
In the unlikely case when this algorithm does not suit your needs,
|
|
you can explicitly specify output file name as a second argument to
|
|
the command:
|
|
|
|
@smallexample
|
|
$ @kbd{xsparse @file{cond-file} @file{out-file}}
|
|
@end smallexample
|
|
|
|
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:
|
|
|
|
@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
|
|
|
|
To actually expand the file, you would run:
|
|
|
|
@smallexample
|
|
$ @kbd{xsparse /home/gray/GNUSparseFile.6058/sparsefile}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
The program behaves the same way all UNIX utilities do: it will keep
|
|
quiet unless it has something 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:
|
|
|
|
@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
|
|
|
|
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:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{xsparse -v -x /home/gray/PaxHeaders/sparsefile \
|
|
/home/gray/GNUSparseFile/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
|
|
|
|
@anchor{extracting sparse v0x}
|
|
@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, the 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 these formats, 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{name}}.
|
|
|
|
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}.
|
|
|
|
@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:
|
|
|
|
@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
|
|
|
|
@noindent
|
|
(as usual, ignore the warnings about unknown keywords.)
|
|
|
|
@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:
|
|
|
|
@smallexample
|
|
@var{N} = @var{Bs} - @var{Bn} - @var{size}/512 - 2
|
|
@end smallexample
|
|
|
|
@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}.
|
|
|
|
@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
|
|
|
|
@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.
|
|
|
|
In our example, this command will be
|
|
|
|
@smallexample
|
|
$ @kbd{dd if=arc.tar of=xhdr bs=512 skip=56 count=7}
|
|
@end smallexample
|
|
@end enumerate
|
|
|
|
Finally, you can expand the condensed file, using the obtained header:
|
|
|
|
@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}
|
|
@UNREVISED{}
|
|
|
|
@FIXME{Reorganize the following material}
|
|
|
|
The @command{cpio} archive formats, like @command{tar}, do have maximum
|
|
file name lengths. The binary and old @acronym{ASCII} formats have a maximum file
|
|
length of 256, and the new @acronym{ASCII} and @acronym{CRC ASCII} formats have a max
|
|
file length of 1024. @acronym{GNU} @command{cpio} can read and write archives
|
|
with arbitrary file name lengths, but other @command{cpio} implementations
|
|
may crash unexplainedly trying to read them.
|
|
|
|
@command{tar} handles symbolic links in the form in which it comes in @acronym{BSD};
|
|
@command{cpio} doesn't handle symbolic links in the form in which it comes
|
|
in System V prior to SVR4, and some vendors may have added symlinks
|
|
to their system without enhancing @command{cpio} to know about them.
|
|
Others may have enhanced it in a way other than the way I did it
|
|
at Sun, and which was adopted by AT&T (and which is, I think, also
|
|
present in the @command{cpio} that Berkeley picked up from AT&T and put
|
|
into a later @acronym{BSD} release---I think I gave them my changes).
|
|
|
|
(SVR4 does some funny stuff with @command{tar}; basically, its @command{cpio}
|
|
can handle @command{tar} format input, and write it on output, and it
|
|
probably handles symbolic links. They may not have bothered doing
|
|
anything to enhance @command{tar} as a result.)
|
|
|
|
@command{cpio} handles special files; traditional @command{tar} doesn't.
|
|
|
|
@command{tar} comes with V7, System III, System V, and @acronym{BSD} source;
|
|
@command{cpio} comes only with System III, System V, and later @acronym{BSD}
|
|
(4.3-tahoe and later).
|
|
|
|
@command{tar}'s way of handling multiple hard links to a file can handle
|
|
file systems that support 32-bit i-numbers (e.g., the @acronym{BSD} file system);
|
|
@command{cpio}s way requires you to play some games (in its ``binary''
|
|
format, i-numbers are only 16 bits, and in its ``portable @acronym{ASCII}'' format,
|
|
they're 18 bits---it would have to play games with the "file system @acronym{ID}"
|
|
field of the header to make sure that the file system @acronym{ID}/i-number pairs
|
|
of different files were always different), and I don't know which
|
|
@command{cpio}s, if any, play those games. Those that don't might get
|
|
confused and think two files are the same file when they're not, and
|
|
make hard links between them.
|
|
|
|
@command{tar}s way of handling multiple hard links to a file places only
|
|
one copy of the link on the tape, but the name attached to that copy
|
|
is the @emph{only} one you can use to retrieve the file; @command{cpio}s
|
|
way puts one copy for every link, but you can retrieve it using any
|
|
of the names.
|
|
|
|
@quotation
|
|
What type of check sum (if any) is used, and how is this calculated.
|
|
@end quotation
|
|
|
|
See the attached manual pages for @command{tar} and @command{cpio} format.
|
|
@command{tar} uses a checksum which is the sum of all the bytes in the
|
|
@command{tar} header for a file; @command{cpio} uses no checksum.
|
|
|
|
@quotation
|
|
If anyone knows why @command{cpio} was made when @command{tar} was present
|
|
at the unix scene,
|
|
@end quotation
|
|
|
|
It wasn't. @command{cpio} first showed up in PWB/UNIX 1.0; no
|
|
generally-available version of UNIX had @command{tar} at the time. I don't
|
|
know whether any version that was generally available @emph{within AT&T}
|
|
had @command{tar}, or, if so, whether the people within AT&T who did
|
|
@command{cpio} knew about it.
|
|
|
|
On restore, if there is a corruption on a tape @command{tar} will stop at
|
|
that point, while @command{cpio} will skip over it and try to restore the
|
|
rest of the files.
|
|
|
|
The main difference is just in the command syntax and header format.
|
|
|
|
@command{tar} is a little more tape-oriented in that everything is blocked
|
|
to start on a record boundary.
|
|
|
|
@quotation
|
|
Is there any differences between the ability to recover crashed
|
|
archives between the two of them. (Is there any chance of recovering
|
|
crashed archives at all.)
|
|
@end quotation
|
|
|
|
Theoretically it should be easier under @command{tar} since the blocking
|
|
lets you find a header with some variation of @samp{dd skip=@var{nn}}.
|
|
However, modern @command{cpio}'s and variations have an option to just
|
|
search for the next file header after an error with a reasonable chance
|
|
of resyncing. However, lots of tape driver software won't allow you to
|
|
continue past a media error which should be the only reason for getting
|
|
out of sync unless a file changed sizes while you were writing the
|
|
archive.
|
|
|
|
@quotation
|
|
If anyone knows why @command{cpio} was made when @command{tar} was present
|
|
at the unix scene, please tell me about this too.
|
|
@end quotation
|
|
|
|
Probably because it is more media efficient (by not blocking everything
|
|
and using only the space needed for the headers where @command{tar}
|
|
always uses 512 bytes per file header) and it knows how to archive
|
|
special files.
|
|
|
|
You might want to look at the freely available alternatives. The
|
|
major ones are @command{afio}, @GNUTAR{}, and
|
|
@command{pax}, each of which have their own extensions with some
|
|
backwards compatibility.
|
|
|
|
Sparse files were @command{tar}red as sparse files (which you can
|
|
easily test, because the resulting archive gets smaller, and
|
|
@acronym{GNU} @command{cpio} can no longer read it).
|
|
|
|
@node Media
|
|
@chapter Tapes and Other Archive Media
|
|
@UNREVISED{}
|
|
|
|
A few special cases about tape handling warrant more detailed
|
|
description. These special cases are discussed below.
|
|
|
|
Many complexities surround the use of @command{tar} on tape drives. Since
|
|
the creation and manipulation of archives located on magnetic tape was
|
|
the original purpose of @command{tar}, it contains many features making
|
|
such manipulation easier.
|
|
|
|
Archives are usually written on dismountable media---tape cartridges,
|
|
mag tapes, or floppy disks.
|
|
|
|
The amount of data a tape or disk holds depends not only on its size,
|
|
but also on how it is formatted. A 2400 foot long reel of mag tape
|
|
holds 40 megabytes of data when formatted at 1600 bits per inch. The
|
|
physically smaller EXABYTE tape cartridge holds 2.3 gigabytes.
|
|
|
|
Magnetic media are re-usable---once the archive on a tape is no longer
|
|
needed, the archive can be erased and the tape or disk used over.
|
|
Media quality does deteriorate with use, however. Most tapes or disks
|
|
should be discarded when they begin to produce data errors. EXABYTE
|
|
tape cartridges should be discarded when they generate an @dfn{error
|
|
count} (number of non-usable bits) of more than 10k.
|
|
|
|
Magnetic media are written and erased using magnetic fields, and
|
|
should be protected from such fields to avoid damage to stored data.
|
|
Sticking a floppy disk to a filing cabinet using a magnet is probably
|
|
not a good idea.
|
|
|
|
@menu
|
|
* Device:: Device selection and switching
|
|
* Remote Tape Server::
|
|
* Common Problems and Solutions::
|
|
* Blocking:: Blocking
|
|
* Many:: Many archives on one tape
|
|
* Using Multiple Tapes:: Using Multiple Tapes
|
|
* label:: Including a Label in the Archive
|
|
* verify::
|
|
* Write Protection::
|
|
@end menu
|
|
|
|
@node Device
|
|
@section Device Selection and Switching
|
|
@UNREVISED{}
|
|
|
|
@table @option
|
|
@item -f [@var{hostname}:]@var{file}
|
|
@itemx --file=[@var{hostname}:]@var{file}
|
|
Use archive file or device @var{file} on @var{hostname}.
|
|
@end table
|
|
|
|
This option is used to specify the file name of the archive @command{tar}
|
|
works on.
|
|
|
|
If the file name is @samp{-}, @command{tar} reads the archive from standard
|
|
input (when listing or extracting), or writes it to standard output
|
|
(when creating). If the @samp{-} file name is given when updating an
|
|
archive, @command{tar} will read the original archive from its standard
|
|
input, and will write the entire new archive to its standard output.
|
|
|
|
If the file name contains a @samp{:}, it is interpreted as
|
|
@samp{hostname:file name}. If the @var{hostname} contains an @dfn{at}
|
|
sign (@samp{@@}), it is treated as @samp{user@@hostname:file name}. In
|
|
either case, @command{tar} will invoke the command @command{rsh} (or
|
|
@command{remsh}) to start up an @command{/usr/libexec/rmt} on the remote
|
|
machine. If you give an alternate login name, it will be given to the
|
|
@command{rsh}.
|
|
Naturally, the remote machine must have an executable
|
|
@command{/usr/libexec/rmt}. This program is free software from the
|
|
University of California, and a copy of the source code can be found
|
|
with the sources for @command{tar}; it's compiled and installed by default.
|
|
The exact path to this utility is determined when configuring the package.
|
|
It is @file{@var{prefix}/libexec/rmt}, where @var{prefix} stands for
|
|
your installation prefix. This location may also be overridden at
|
|
runtime by using the @option{--rmt-command=@var{command}} option (@xref{Option Summary,
|
|
---rmt-command}, for detailed description of this option. @xref{Remote
|
|
Tape Server}, for the description of @command{rmt} command).
|
|
|
|
If this option is not given, but the environment variable @env{TAPE}
|
|
is set, its value is used; otherwise, old versions of @command{tar}
|
|
used a default archive name (which was picked when @command{tar} was
|
|
compiled). The default is normally set up to be the @dfn{first} tape
|
|
drive or other transportable I/O medium on the system.
|
|
|
|
Starting with version 1.11.5, @GNUTAR{} uses
|
|
standard input and standard output as the default device, and I will
|
|
not try anymore supporting automatic device detection at installation
|
|
time. This was failing really in too many cases, it was hopeless.
|
|
This is now completely left to the installer to override standard
|
|
input and standard output for default device, if this seems
|
|
preferable. Further, I think @emph{most} actual usages of
|
|
@command{tar} are done with pipes or disks, not really tapes,
|
|
cartridges or diskettes.
|
|
|
|
Some users think that using standard input and output is running
|
|
after trouble. This could lead to a nasty surprise on your screen if
|
|
you forget to specify an output file name---especially if you are going
|
|
through a network or terminal server capable of buffering large amounts
|
|
of output. We had so many bug reports in that area of configuring
|
|
default tapes automatically, and so many contradicting requests, that
|
|
we finally consider the problem to be portably intractable. We could
|
|
of course use something like @samp{/dev/tape} as a default, but this
|
|
is @emph{also} running after various kind of trouble, going from hung
|
|
processes to accidental destruction of real tapes. After having seen
|
|
all this mess, using standard input and output as a default really
|
|
sounds like the only clean choice left, and a very useful one too.
|
|
|
|
@GNUTAR{} reads and writes archive in records, I
|
|
suspect this is the main reason why block devices are preferred over
|
|
character devices. Most probably, block devices are more efficient
|
|
too. The installer could also check for @samp{DEFTAPE} in
|
|
@file{<sys/mtio.h>}.
|
|
|
|
@table @option
|
|
@xopindex{force-local, short description}
|
|
@item --force-local
|
|
Archive file is local even if it contains a colon.
|
|
|
|
@opindex rsh-command
|
|
@item --rsh-command=@var{command}
|
|
Use remote @var{command} instead of @command{rsh}. This option exists
|
|
so that people who use something other than the standard @command{rsh}
|
|
(e.g., a Kerberized @command{rsh}) can access a remote device.
|
|
|
|
When this command is not used, the shell command found when
|
|
the @command{tar} program was installed is used instead. This is
|
|
the first found of @file{/usr/ucb/rsh}, @file{/usr/bin/remsh},
|
|
@file{/usr/bin/rsh}, @file{/usr/bsd/rsh} or @file{/usr/bin/nsh}.
|
|
The installer may have overridden this by defining the environment
|
|
variable @env{RSH} @emph{at installation time}.
|
|
|
|
@item -[0-7][lmh]
|
|
Specify drive and density.
|
|
|
|
@xopindex{multi-volume, short description}
|
|
@item -M
|
|
@itemx --multi-volume
|
|
Create/list/extract multi-volume archive.
|
|
|
|
This option causes @command{tar} to write a @dfn{multi-volume} archive---one
|
|
that may be larger than will fit on the medium used to hold it.
|
|
@xref{Multi-Volume Archives}.
|
|
|
|
@xopindex{tape-length, short description}
|
|
@item -L @var{num}
|
|
@itemx --tape-length=@var{size}[@var{suf}]
|
|
Change tape after writing @var{size} units of data. Unless @var{suf} is
|
|
given, @var{size} is treated as kilobytes, i.e. @samp{@var{size} x
|
|
1024} bytes. The following suffixes alter this behavior:
|
|
|
|
@float Table, size-suffixes
|
|
@caption{Size Suffixes}
|
|
@multitable @columnfractions 0.2 0.3 0.3
|
|
@headitem Suffix @tab Units @tab Byte Equivalent
|
|
@item b @tab Blocks @tab @var{size} x 512
|
|
@item B @tab Kilobytes @tab @var{size} x 1024
|
|
@item c @tab Bytes @tab @var{size}
|
|
@item G @tab Gigabytes @tab @var{size} x 1024^3
|
|
@item K @tab Kilobytes @tab @var{size} x 1024
|
|
@item k @tab Kilobytes @tab @var{size} x 1024
|
|
@item M @tab Megabytes @tab @var{size} x 1024^2
|
|
@item P @tab Petabytes @tab @var{size} x 1024^5
|
|
@item T @tab Terabytes @tab @var{size} x 1024^4
|
|
@item w @tab Words @tab @var{size} x 2
|
|
@end multitable
|
|
@end float
|
|
|
|
This option might be useful when your tape drivers do not properly
|
|
detect end of physical tapes. By being slightly conservative on the
|
|
maximum tape length, you might avoid the problem entirely.
|
|
|
|
@xopindex{info-script, short description}
|
|
@xopindex{new-volume-script, short description}
|
|
@item -F @var{command}
|
|
@itemx --info-script=@var{command}
|
|
@itemx --new-volume-script=@var{command}
|
|
Execute @var{command} at end of each tape. This implies
|
|
@option{--multi-volume} (@option{-M}). @xref{info-script}, for a detailed
|
|
description of this option.
|
|
@end table
|
|
|
|
@node Remote Tape Server
|
|
@section Remote Tape Server
|
|
|
|
@cindex remote tape drive
|
|
@pindex rmt
|
|
In order to access the tape drive on a remote machine, @command{tar}
|
|
uses the remote tape server written at the University of California at
|
|
Berkeley. The remote tape server must be installed as
|
|
@file{@var{prefix}/libexec/rmt} on any machine whose tape drive you
|
|
want to use. @command{tar} calls @command{rmt} by running an
|
|
@command{rsh} or @command{remsh} to the remote machine, optionally
|
|
using a different login name if one is supplied.
|
|
|
|
A copy of the source for the remote tape server is provided. Its
|
|
source code can be freely distributed. It is compiled and
|
|
installed by default.
|
|
|
|
@cindex absolute file names
|
|
Unless you use the @option{--absolute-names} (@option{-P}) option,
|
|
@GNUTAR{} will not allow you to create an archive that contains
|
|
absolute file names (a file name beginning with @samp{/}). If you try,
|
|
@command{tar} will automatically remove the leading @samp{/} from the
|
|
file names it stores in the archive. It will also type a warning
|
|
message telling you what it is doing.
|
|
|
|
When reading an archive that was created with a different
|
|
@command{tar} program, @GNUTAR{} automatically
|
|
extracts entries in the archive which have absolute file names as if
|
|
the file names were not absolute. This is an important feature. A
|
|
visitor here once gave a @command{tar} tape to an operator to restore;
|
|
the operator used Sun @command{tar} instead of @GNUTAR{},
|
|
and the result was that it replaced large portions of
|
|
our @file{/bin} and friends with versions from the tape; needless to
|
|
say, we were unhappy about having to recover the file system from
|
|
backup tapes.
|
|
|
|
For example, if the archive contained a file @file{/usr/bin/computoy},
|
|
@GNUTAR{} would extract the file to @file{usr/bin/computoy},
|
|
relative to the current directory. If you want to extract the files in
|
|
an archive to the same absolute names that they had when the archive
|
|
was created, you should do a @samp{cd /} before extracting the files
|
|
from the archive, or you should either use the @option{--absolute-names}
|
|
option, or use the command @samp{tar -C / @dots{}}.
|
|
|
|
@cindex Ultrix 3.1 and write failure
|
|
Some versions of Unix (Ultrix 3.1 is known to have this problem),
|
|
can claim that a short write near the end of a tape succeeded,
|
|
when it actually failed. This will result in the -M option not
|
|
working correctly. The best workaround at the moment is to use a
|
|
significantly larger blocking factor than the default 20.
|
|
|
|
In order to update an archive, @command{tar} must be able to backspace the
|
|
archive in order to reread or rewrite a record that was just read (or
|
|
written). This is currently possible only on two kinds of files: normal
|
|
disk files (or any other file that can be backspaced with @samp{lseek}),
|
|
and industry-standard 9-track magnetic tape (or any other kind of tape
|
|
that can be backspaced with the @code{MTIOCTOP} @code{ioctl}).
|
|
|
|
This means that the @option{--append}, @option{--concatenate}, and
|
|
@option{--delete} commands will not work on any other kind of file.
|
|
Some media simply cannot be backspaced, which means these commands and
|
|
options will never be able to work on them. These non-backspacing
|
|
media include pipes and cartridge tape drives.
|
|
|
|
Some other media can be backspaced, and @command{tar} will work on them
|
|
once @command{tar} is modified to do so.
|
|
|
|
Archives created with the @option{--multi-volume}, @option{--label}, and
|
|
@option{--incremental} (@option{-G}) options may not be readable by other version
|
|
of @command{tar}. In particular, restoring a file that was split over
|
|
a volume boundary will require some careful work with @command{dd}, if
|
|
it can be done at all. Other versions of @command{tar} may also create
|
|
an empty file whose name is that of the volume header. Some versions
|
|
of @command{tar} may create normal files instead of directories archived
|
|
with the @option{--incremental} (@option{-G}) option.
|
|
|
|
@node Common Problems and Solutions
|
|
@section Some Common Problems and their Solutions
|
|
|
|
@ifclear PUBLISH
|
|
|
|
@format
|
|
errors from system:
|
|
permission denied
|
|
no such file or directory
|
|
not owner
|
|
|
|
errors from @command{tar}:
|
|
directory checksum error
|
|
header format error
|
|
|
|
errors from media/system:
|
|
i/o error
|
|
device busy
|
|
@end format
|
|
|
|
@end ifclear
|
|
|
|
@node Blocking
|
|
@section Blocking
|
|
@cindex block
|
|
@cindex record
|
|
|
|
@dfn{Block} and @dfn{record} terminology is rather confused, and it
|
|
is also confusing to the expert reader. On the other hand, readers
|
|
who are new to the field have a fresh mind, and they may safely skip
|
|
the next two paragraphs, as the remainder of this manual uses those
|
|
two terms in a quite consistent way.
|
|
|
|
John Gilmore, the writer of the public domain @command{tar} from which
|
|
@GNUTAR{} was originally derived, wrote (June 1995):
|
|
|
|
@quotation
|
|
The nomenclature of tape drives comes from IBM, where I believe
|
|
they were invented for the IBM 650 or so. On IBM mainframes, what
|
|
is recorded on tape are tape blocks. The logical organization of
|
|
data is into records. There are various ways of putting records into
|
|
blocks, including @code{F} (fixed sized records), @code{V} (variable
|
|
sized records), @code{FB} (fixed blocked: fixed size records, @var{n}
|
|
to a block), @code{VB} (variable size records, @var{n} to a block),
|
|
@code{VSB} (variable spanned blocked: variable sized records that can
|
|
occupy more than one block), etc. The @code{JCL} @samp{DD RECFORM=}
|
|
parameter specified this to the operating system.
|
|
|
|
The Unix man page on @command{tar} was totally confused about this.
|
|
When I wrote @code{PD TAR}, I used the historically correct terminology
|
|
(@command{tar} writes data records, which are grouped into blocks).
|
|
It appears that the bogus terminology made it into @acronym{POSIX} (no surprise
|
|
here), and now Fran@,{c}ois has migrated that terminology back
|
|
into the source code too.
|
|
@end quotation
|
|
|
|
The term @dfn{physical block} means the basic transfer chunk from or
|
|
to a device, after which reading or writing may stop without anything
|
|
being lost. In this manual, the term @dfn{block} usually refers to
|
|
a disk physical block, @emph{assuming} that each disk block is 512
|
|
bytes in length. It is true that some disk devices have different
|
|
physical blocks, but @command{tar} ignore these differences in its own
|
|
format, which is meant to be portable, so a @command{tar} block is always
|
|
512 bytes in length, and @dfn{block} always mean a @command{tar} block.
|
|
The term @dfn{logical block} often represents the basic chunk of
|
|
allocation of many disk blocks as a single entity, which the operating
|
|
system treats somewhat atomically; this concept is only barely used
|
|
in @GNUTAR{}.
|
|
|
|
The term @dfn{physical record} is another way to speak of a physical
|
|
block, those two terms are somewhat interchangeable. In this manual,
|
|
the term @dfn{record} usually refers to a tape physical block,
|
|
@emph{assuming} that the @command{tar} archive is kept on magnetic tape.
|
|
It is true that archives may be put on disk or used with pipes,
|
|
but nevertheless, @command{tar} tries to read and write the archive one
|
|
@dfn{record} at a time, whatever the medium in use. One record is made
|
|
up of an integral number of blocks, and this operation of putting many
|
|
disk blocks into a single tape block is called @dfn{reblocking}, or
|
|
more simply, @dfn{blocking}. The term @dfn{logical record} refers to
|
|
the logical organization of many characters into something meaningful
|
|
to the application. The term @dfn{unit record} describes a small set
|
|
of characters which are transmitted whole to or by the application,
|
|
and often refers to a line of text. Those two last terms are unrelated
|
|
to what we call a @dfn{record} in @GNUTAR{}.
|
|
|
|
When writing to tapes, @command{tar} writes the contents of the archive
|
|
in chunks known as @dfn{records}. To change the default blocking
|
|
factor, use the @option{--blocking-factor=@var{512-size}} (@option{-b
|
|
@var{512-size}}) option. Each record will then be composed of
|
|
@var{512-size} blocks. (Each @command{tar} block is 512 bytes.
|
|
@xref{Standard}.) Each file written to the archive uses at least one
|
|
full record. As a result, using a larger record size can result in
|
|
more wasted space for small files. On the other hand, a larger record
|
|
size can often be read and written much more efficiently.
|
|
|
|
Further complicating the problem is that some tape drives ignore the
|
|
blocking entirely. For these, a larger record size can still improve
|
|
performance (because the software layers above the tape drive still
|
|
honor the blocking), but not as dramatically as on tape drives that
|
|
honor blocking.
|
|
|
|
When reading an archive, @command{tar} can usually figure out the
|
|
record size on itself. When this is the case, and a non-standard
|
|
record size was used when the archive was created, @command{tar} will
|
|
print a message about a non-standard blocking factor, and then operate
|
|
normally@footnote{If this message is not needed, you can turn it off
|
|
using the @option{--warning=no-record-size} option.}. On some tape
|
|
devices, however, @command{tar} cannot figure out the record size
|
|
itself. On most of those, you can specify a blocking factor (with
|
|
@option{--blocking-factor}) larger than the actual blocking factor,
|
|
and then use the @option{--read-full-records} (@option{-B}) option.
|
|
(If you specify a blocking factor with @option{--blocking-factor} and
|
|
don't use the @option{--read-full-records} option, then @command{tar}
|
|
will not attempt to figure out the recording size itself.) On some
|
|
devices, you must always specify the record size exactly with
|
|
@option{--blocking-factor} when reading, because @command{tar} cannot
|
|
figure it out. In any case, use @option{--list} (@option{-t}) before
|
|
doing any extractions to see whether @command{tar} is reading the archive
|
|
correctly.
|
|
|
|
@command{tar} blocks are all fixed size (512 bytes), and its scheme for
|
|
putting them into records is to put a whole number of them (one or
|
|
more) into each record. @command{tar} records are all the same size;
|
|
at the end of the file there's a block containing all zeros, which
|
|
is how you tell that the remainder of the last record(s) are garbage.
|
|
|
|
In a standard @command{tar} file (no options), the block size is 512
|
|
and the record size is 10240, for a blocking factor of 20. What the
|
|
@option{--blocking-factor} option does is sets the blocking factor,
|
|
changing the record size while leaving the block size at 512 bytes.
|
|
20 was fine for ancient 800 or 1600 bpi reel-to-reel tape drives;
|
|
most tape drives these days prefer much bigger records in order to
|
|
stream and not waste tape. When writing tapes for myself, some tend
|
|
to use a factor of the order of 2048, say, giving a record size of
|
|
around one megabyte.
|
|
|
|
If you use a blocking factor larger than 20, older @command{tar}
|
|
programs might not be able to read the archive, so we recommend this
|
|
as a limit to use in practice. @GNUTAR{}, however,
|
|
will support arbitrarily large record sizes, limited only by the
|
|
amount of virtual memory or the physical characteristics of the tape
|
|
device.
|
|
|
|
@menu
|
|
* Format Variations:: Format Variations
|
|
* Blocking Factor:: The Blocking Factor of an Archive
|
|
@end menu
|
|
|
|
@node Format Variations
|
|
@subsection Format Variations
|
|
@cindex Format Parameters
|
|
@cindex Format Options
|
|
@cindex Options, archive format specifying
|
|
@cindex Options, format specifying
|
|
@UNREVISED{}
|
|
|
|
Format parameters specify how an archive is written on the archive
|
|
media. The best choice of format parameters will vary depending on
|
|
the type and number of files being archived, and on the media used to
|
|
store the archive.
|
|
|
|
To specify format parameters when accessing or creating an archive,
|
|
you can use the options described in the following sections.
|
|
If you do not specify any format parameters, @command{tar} uses
|
|
default parameters. You cannot modify a compressed archive.
|
|
If you create an archive with the @option{--blocking-factor} option
|
|
specified (@pxref{Blocking Factor}), you must specify that
|
|
blocking-factor when operating on the archive. @xref{Formats}, for other
|
|
examples of format parameter considerations.
|
|
|
|
@node Blocking Factor
|
|
@subsection The Blocking Factor of an Archive
|
|
@cindex Blocking Factor
|
|
@cindex Record Size
|
|
@cindex Number of blocks per record
|
|
@cindex Number of bytes per record
|
|
@cindex Bytes per record
|
|
@cindex Blocks per record
|
|
@UNREVISED{}
|
|
|
|
@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 (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.
|
|
The default blocking factor is typically 20 (i.e., 10240 bytes), but
|
|
can be specified at installation. To find out the blocking factor of
|
|
an existing archive, use @samp{tar --list --file=@var{archive-name}}.
|
|
This may not work on some devices.
|
|
|
|
Records are separated by gaps, which waste space on the archive media.
|
|
If you are archiving on magnetic tape, using a larger blocking factor
|
|
(and therefore larger records) provides faster throughput and allows you
|
|
to fit more data on a tape (because there are fewer gaps). If you are
|
|
archiving on cartridge, a very large blocking factor (say 126 or more)
|
|
greatly increases performance. A smaller blocking factor, on the other
|
|
hand, may be useful when archiving small files, to avoid archiving lots
|
|
of nulls as @command{tar} fills out the archive to the end of the record.
|
|
In general, the ideal record size depends on the size of the
|
|
inter-record gaps on the tape you are using, and the average size of the
|
|
files you are archiving. @xref{create}, for information on
|
|
writing archives.
|
|
|
|
@FIXME{Need example of using a cartridge with blocking factor=126 or more.}
|
|
|
|
Archives with blocking factors larger than 20 cannot be read
|
|
by very old versions of @command{tar}, or by some newer versions
|
|
of @command{tar} running on old machines with small address spaces.
|
|
With @GNUTAR{}, the blocking factor of an archive is limited
|
|
only by the maximum record size of the device containing the archive,
|
|
or by the amount of available virtual memory.
|
|
|
|
Also, on some systems, not using adequate blocking factors, as sometimes
|
|
imposed by the device drivers, may yield unexpected diagnostics. For
|
|
example, this has been reported:
|
|
|
|
@smallexample
|
|
Cannot write to /dev/dlt: Invalid argument
|
|
@end smallexample
|
|
|
|
@noindent
|
|
In such cases, it sometimes happen that the @command{tar} bundled by
|
|
the system is aware of block size idiosyncrasies, while @GNUTAR{}
|
|
requires an explicit specification for the block size,
|
|
which it cannot guess. This yields some people to consider
|
|
@GNUTAR{} is misbehaving, because by comparison,
|
|
@cite{the bundle @command{tar} works OK}. Adding @w{@kbd{-b 256}},
|
|
for example, might resolve the problem.
|
|
|
|
If you use a non-default blocking factor when you create an archive, you
|
|
must specify the same blocking factor when you modify that archive. Some
|
|
archive devices will also require you to specify the blocking factor when
|
|
reading that archive, however this is not typically the case. Usually, you
|
|
can use @option{--list} (@option{-t}) without specifying a blocking factor---@command{tar}
|
|
reports a non-default record size and then lists the archive members as
|
|
it would normally. To extract files from an archive with a non-standard
|
|
blocking factor (particularly if you're not sure what the blocking factor
|
|
is), you can usually use the @option{--read-full-records} (@option{-B}) option while
|
|
specifying a blocking factor larger then the blocking factor of the archive
|
|
(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.
|
|
|
|
@table @option
|
|
@item --blocking-factor=@var{number}
|
|
@itemx -b @var{number}
|
|
Specifies the blocking factor of an archive. Can be used with any
|
|
operation, but is usually not necessary with @option{--list} (@option{-t}).
|
|
@end table
|
|
|
|
Device blocking
|
|
|
|
@table @option
|
|
@item -b @var{blocks}
|
|
@itemx --blocking-factor=@var{blocks}
|
|
Set record size to @math{@var{blocks}*512} bytes.
|
|
|
|
This option is used to specify a @dfn{blocking factor} for the archive.
|
|
When reading or writing the archive, @command{tar}, will do reads and writes
|
|
of the archive in records of @math{@var{block}*512} bytes. This is true
|
|
even when the archive is compressed. Some devices requires that all
|
|
write operations be a multiple of a certain size, and so, @command{tar}
|
|
pads the archive out to the next record boundary.
|
|
|
|
The default blocking factor is set when @command{tar} is compiled, and is
|
|
typically 20. Blocking factors larger than 20 cannot be read by very
|
|
old versions of @command{tar}, or by some newer versions of @command{tar}
|
|
running on old machines with small address spaces.
|
|
|
|
With a magnetic tape, larger records give faster throughput and fit
|
|
more data on a tape (because there are fewer inter-record gaps).
|
|
If the archive is in a disk file or a pipe, you may want to specify
|
|
a smaller blocking factor, since a large one will result in a large
|
|
number of null bytes at the end of the archive.
|
|
|
|
When writing cartridge or other streaming tapes, a much larger
|
|
blocking factor (say 126 or more) will greatly increase performance.
|
|
However, you must specify the same blocking factor when reading or
|
|
updating the archive.
|
|
|
|
Apparently, Exabyte drives have a physical block size of 8K bytes.
|
|
If we choose our blocksize as a multiple of 8k bytes, then the problem
|
|
seems to disappear. Id est, we are using block size of 112 right
|
|
now, and we haven't had the problem since we switched@dots{}
|
|
|
|
With @GNUTAR{} the blocking factor is limited only
|
|
by the maximum record size of the device containing the archive, or by
|
|
the amount of available virtual memory.
|
|
|
|
However, deblocking or reblocking is virtually avoided in a special
|
|
case which often occurs in practice, but which requires all the
|
|
following conditions to be simultaneously true:
|
|
@itemize @bullet
|
|
@item
|
|
the archive is subject to a compression option,
|
|
@item
|
|
the archive is not handled through standard input or output, nor
|
|
redirected nor piped,
|
|
@item
|
|
the archive is directly handled to a local disk, instead of any special
|
|
device,
|
|
@item
|
|
@option{--blocking-factor} is not explicitly specified on the @command{tar}
|
|
invocation.
|
|
@end itemize
|
|
|
|
If the output goes directly to a local disk, and not through
|
|
stdout, then the last write is not extended to a full record size.
|
|
Otherwise, reblocking occurs. Here are a few other remarks on this
|
|
topic:
|
|
|
|
@itemize @bullet
|
|
|
|
@item
|
|
@command{gzip} will complain about trailing garbage if asked to
|
|
uncompress a compressed archive on tape, there is an option to turn
|
|
the message off, but it breaks the regularity of simply having to use
|
|
@samp{@var{prog} -d} for decompression. It would be nice if gzip was
|
|
silently ignoring any number of trailing zeros. I'll ask Jean-loup
|
|
Gailly, by sending a copy of this message to him.
|
|
|
|
@item
|
|
@command{compress} does not show this problem, but as Jean-loup pointed
|
|
out to Michael, @samp{compress -d} silently adds garbage after
|
|
the result of decompression, which tar ignores because it already
|
|
recognized its end-of-file indicator. So this bug may be safely
|
|
ignored.
|
|
|
|
@item
|
|
@samp{gzip -d -q} will be silent about the trailing zeros indeed,
|
|
but will still return an exit status of 2 which tar reports in turn.
|
|
@command{tar} might ignore the exit status returned, but I hate doing
|
|
that, as it weakens the protection @command{tar} offers users against
|
|
other possible problems at decompression time. If @command{gzip} was
|
|
silently skipping trailing zeros @emph{and} also avoiding setting the
|
|
exit status in this innocuous case, that would solve this situation.
|
|
|
|
@item
|
|
@command{tar} should become more solid at not stopping to read a pipe at
|
|
the first null block encountered. This inelegantly breaks the pipe.
|
|
@command{tar} should rather drain the pipe out before exiting itself.
|
|
@end itemize
|
|
|
|
@xopindex{ignore-zeros, short description}
|
|
@item -i
|
|
@itemx --ignore-zeros
|
|
Ignore blocks of zeros in archive (means EOF).
|
|
|
|
The @option{--ignore-zeros} (@option{-i}) option causes @command{tar} to ignore blocks
|
|
of zeros in the archive. Normally a block of zeros indicates the
|
|
end of the archive, but when reading a damaged archive, or one which
|
|
was created by concatenating several archives together, this option
|
|
allows @command{tar} to read the entire archive. This option is not on
|
|
by default because many versions of @command{tar} write garbage after
|
|
the zeroed blocks.
|
|
|
|
Note that this option causes @command{tar} to read to the end of the
|
|
archive file, which may sometimes avoid problems when multiple files
|
|
are stored on a single physical tape.
|
|
|
|
@xopindex{read-full-records, short description}
|
|
@item -B
|
|
@itemx --read-full-records
|
|
Reblock as we read (for reading 4.2@acronym{BSD} pipes).
|
|
|
|
If @option{--read-full-records} is used, @command{tar}
|
|
will not panic if an attempt to read a record from the archive does
|
|
not return a full record. Instead, @command{tar} will keep reading
|
|
until it has obtained a full
|
|
record.
|
|
|
|
This option is turned on by default when @command{tar} is reading
|
|
an archive from standard input, or from a remote machine. This is
|
|
because on @acronym{BSD} Unix systems, a read of a pipe will return however
|
|
much happens to be in the pipe, even if it is less than @command{tar}
|
|
requested. If this option was not used, @command{tar} would fail as
|
|
soon as it read an incomplete record from the pipe.
|
|
|
|
This option is also useful with the commands for updating an archive.
|
|
|
|
@end table
|
|
|
|
Tape blocking
|
|
|
|
@FIXME{Appropriate options should be moved here from elsewhere.}
|
|
|
|
@cindex blocking factor
|
|
@cindex tape blocking
|
|
|
|
When handling various tapes or cartridges, you have to take care of
|
|
selecting a proper blocking, that is, the number of disk blocks you
|
|
put together as a single tape block on the tape, without intervening
|
|
tape gaps. A @dfn{tape gap} is a small landing area on the tape
|
|
with no information on it, used for decelerating the tape to a
|
|
full stop, and for later regaining the reading or writing speed.
|
|
When the tape driver starts reading a record, the record has to
|
|
be read whole without stopping, as a tape gap is needed to stop the
|
|
tape motion without losing information.
|
|
|
|
@cindex Exabyte blocking
|
|
@cindex DAT blocking
|
|
Using higher blocking (putting more disk blocks per tape block) will use
|
|
the tape more efficiently as there will be less tape gaps. But reading
|
|
such tapes may be more difficult for the system, as more memory will be
|
|
required to receive at once the whole record. Further, if there is a
|
|
reading error on a huge record, this is less likely that the system will
|
|
succeed in recovering the information. So, blocking should not be too
|
|
low, nor it should be too high. @command{tar} uses by default a blocking of
|
|
20 for historical reasons, and it does not really matter when reading or
|
|
writing to disk. Current tape technology would easily accommodate higher
|
|
blockings. Sun recommends a blocking of 126 for Exabytes and 96 for DATs.
|
|
We were told that for some DLT drives, the blocking should be a multiple
|
|
of 4Kb, preferably 64Kb (@w{@kbd{-b 128}}) or 256 for decent performance.
|
|
Other manufacturers may use different recommendations for the same tapes.
|
|
This might also depends of the buffering techniques used inside modern
|
|
tape controllers. Some imposes a minimum blocking, or a maximum blocking.
|
|
Others request blocking to be some exponent of two.
|
|
|
|
So, there is no fixed rule for blocking. But blocking at read time
|
|
should ideally be the same as blocking used at write time. At one place
|
|
I know, with a wide variety of equipment, they found it best to use a
|
|
blocking of 32 to guarantee that their tapes are fully interchangeable.
|
|
|
|
I was also told that, for recycled tapes, prior erasure (by the same
|
|
drive unit that will be used to create the archives) sometimes lowers
|
|
the error rates observed at rewriting time.
|
|
|
|
I might also use @option{--number-blocks} instead of
|
|
@option{--block-number}, so @option{--block} will then expand to
|
|
@option{--blocking-factor} unambiguously.
|
|
|
|
@node Many
|
|
@section Many Archives on One Tape
|
|
|
|
@FIXME{Appropriate options should be moved here from elsewhere.}
|
|
|
|
@findex ntape @r{device}
|
|
Most tape devices have two entries in the @file{/dev} directory, or
|
|
entries that come in pairs, which differ only in the minor number for
|
|
this device. Let's take for example @file{/dev/tape}, which often
|
|
points to the only or usual tape device of a given system. There might
|
|
be a corresponding @file{/dev/nrtape} or @file{/dev/ntape}. The simpler
|
|
name is the @emph{rewinding} version of the device, while the name
|
|
having @samp{nr} in it is the @emph{no rewinding} version of the same
|
|
device.
|
|
|
|
A rewinding tape device will bring back the tape to its beginning point
|
|
automatically when this device is opened or closed. Since @command{tar}
|
|
opens the archive file before using it and closes it afterwards, this
|
|
means that a simple:
|
|
|
|
@smallexample
|
|
$ @kbd{tar cf /dev/tape @var{directory}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
will reposition the tape to its beginning both prior and after saving
|
|
@var{directory} contents to it, thus erasing prior tape contents and
|
|
making it so that any subsequent write operation will destroy what has
|
|
just been saved.
|
|
|
|
@cindex tape positioning
|
|
So, a rewinding device is normally meant to hold one and only one file.
|
|
If you want to put more than one @command{tar} archive on a given tape, you
|
|
will need to avoid using the rewinding version of the tape device. You
|
|
will also have to pay special attention to tape positioning. Errors in
|
|
positioning may overwrite the valuable data already on your tape. Many
|
|
people, burnt by past experiences, will only use rewinding devices and
|
|
limit themselves to one file per tape, precisely to avoid the risk of
|
|
such errors. Be fully aware that writing at the wrong position on a
|
|
tape loses all information past this point and most probably until the
|
|
end of the tape, and this destroyed information @emph{cannot} be
|
|
recovered.
|
|
|
|
To save @var{directory-1} as a first archive at the beginning of a
|
|
tape, and leave that tape ready for a second archive, you should use:
|
|
|
|
@smallexample
|
|
$ @kbd{mt -f /dev/nrtape rewind}
|
|
$ @kbd{tar cf /dev/nrtape @var{directory-1}}
|
|
@end smallexample
|
|
|
|
@cindex tape marks
|
|
@dfn{Tape marks} are special magnetic patterns written on the tape
|
|
media, which are later recognizable by the reading hardware. These
|
|
marks are used after each file, when there are many on a single tape.
|
|
An empty file (that is to say, two tape marks in a row) signal the
|
|
logical end of the tape, after which no file exist. Usually,
|
|
non-rewinding tape device drivers will react to the close request issued
|
|
by @command{tar} by first writing two tape marks after your archive, and by
|
|
backspacing over one of these. So, if you remove the tape at that time
|
|
from the tape drive, it is properly terminated. But if you write
|
|
another file at the current position, the second tape mark will be
|
|
erased by the new information, leaving only one tape mark between files.
|
|
|
|
So, you may now save @var{directory-2} as a second archive after the
|
|
first on the same tape by issuing the command:
|
|
|
|
@smallexample
|
|
$ @kbd{tar cf /dev/nrtape @var{directory-2}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
and so on for all the archives you want to put on the same tape.
|
|
|
|
Another usual case is that you do not write all the archives the same
|
|
day, and you need to remove and store the tape between two archive
|
|
sessions. In general, you must remember how many files are already
|
|
saved on your tape. Suppose your tape already has 16 files on it, and
|
|
that you are ready to write the 17th. You have to take care of skipping
|
|
the first 16 tape marks before saving @var{directory-17}, say, by using
|
|
these commands:
|
|
|
|
@smallexample
|
|
$ @kbd{mt -f /dev/nrtape rewind}
|
|
$ @kbd{mt -f /dev/nrtape fsf 16}
|
|
$ @kbd{tar cf /dev/nrtape @var{directory-17}}
|
|
@end smallexample
|
|
|
|
In all the previous examples, we put aside blocking considerations, but
|
|
you should do the proper things for that as well. @xref{Blocking}.
|
|
|
|
@menu
|
|
* Tape Positioning:: Tape Positions and Tape Marks
|
|
* mt:: The @command{mt} Utility
|
|
@end menu
|
|
|
|
@node Tape Positioning
|
|
@subsection Tape Positions and Tape Marks
|
|
@UNREVISED{}
|
|
|
|
Just as archives can store more than one file from the file system,
|
|
tapes can store more than one archive file. To keep track of where
|
|
archive files (or any other type of file stored on tape) begin and
|
|
end, tape archive devices write magnetic @dfn{tape marks} on the
|
|
archive media. Tape drives write one tape mark between files,
|
|
two at the end of all the file entries.
|
|
|
|
If you think of data as a series of records "rrrr"'s, and tape marks as
|
|
"*"'s, a tape might look like the following:
|
|
|
|
@smallexample
|
|
rrrr*rrrrrr*rrrrr*rr*rrrrr**-------------------------
|
|
@end smallexample
|
|
|
|
Tape devices read and write tapes using a read/write @dfn{tape
|
|
head}---a physical part of the device which can only access one
|
|
point on the tape at a time. When you use @command{tar} to read or
|
|
write archive data from a tape device, the device will begin reading
|
|
or writing from wherever on the tape the tape head happens to be,
|
|
regardless of which archive or what part of the archive the tape
|
|
head is on. Before writing an archive, you should make sure that no
|
|
data on the tape will be overwritten (unless it is no longer needed).
|
|
Before reading an archive, you should make sure the tape head is at
|
|
the beginning of the archive you want to read. You can do it manually
|
|
via @code{mt} utility (@pxref{mt}). The @code{restore} script does
|
|
that automatically (@pxref{Scripted Restoration}).
|
|
|
|
If you want to add new archive file entries to a tape, you should
|
|
advance the tape to the end of the existing file entries, backspace
|
|
over the last tape mark, and write the new archive file. If you were
|
|
to add two archives to the example above, the tape might look like the
|
|
following:
|
|
|
|
@smallexample
|
|
rrrr*rrrrrr*rrrrr*rr*rrrrr*rrr*rrrr**----------------
|
|
@end smallexample
|
|
|
|
@node mt
|
|
@subsection The @command{mt} Utility
|
|
@UNREVISED{}
|
|
|
|
@FIXME{Is it true that this only works on non-block devices?
|
|
should explain the difference, (fixed or variable).}
|
|
@xref{Blocking Factor}.
|
|
|
|
You can use the @command{mt} utility to advance or rewind a tape past a
|
|
specified number of archive files on the tape. This will allow you
|
|
to move to the beginning of an archive before extracting or reading
|
|
it, or to the end of all the archives before writing a new one.
|
|
@FIXME{Why isn't there an "advance 'til you find two tape marks
|
|
together"?}
|
|
|
|
The syntax of the @command{mt} command is:
|
|
|
|
@smallexample
|
|
@kbd{mt [-f @var{tapename}] @var{operation} [@var{number}]}
|
|
@end smallexample
|
|
|
|
where @var{tapename} is the name of the tape device, @var{number} is
|
|
the number of times an operation is performed (with a default of one),
|
|
and @var{operation} is one of the following:
|
|
|
|
@FIXME{is there any use for record operations?}
|
|
|
|
@table @option
|
|
@item eof
|
|
@itemx weof
|
|
Writes @var{number} tape marks at the current position on the tape.
|
|
|
|
@item fsf
|
|
Moves tape position forward @var{number} files.
|
|
|
|
@item bsf
|
|
Moves tape position back @var{number} files.
|
|
|
|
@item rewind
|
|
Rewinds the tape. (Ignores @var{number}.)
|
|
|
|
@item offline
|
|
@itemx rewoff1
|
|
Rewinds the tape and takes the tape device off-line. (Ignores @var{number}.)
|
|
|
|
@item status
|
|
Prints status information about the tape unit.
|
|
|
|
@end table
|
|
|
|
If you don't specify a @var{tapename}, @command{mt} uses the environment
|
|
variable @env{TAPE}; if @env{TAPE} is not set, @command{mt} will use
|
|
the default device specified in your @file{sys/mtio.h} file
|
|
(@code{DEFTAPE} variable). If this is not defined, the program will
|
|
display a descriptive error message and exit with code 1.
|
|
|
|
@command{mt} returns a 0 exit status when the operation(s) were
|
|
successful, 1 if the command was unrecognized, and 2 if an operation
|
|
failed.
|
|
|
|
@node Using Multiple Tapes
|
|
@section Using Multiple Tapes
|
|
|
|
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} 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 file.
|
|
|
|
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}[@var{suf}]
|
|
@itemx -L @var{size}[@var{suf}]
|
|
Set maximum length of a volume. The @var{suf}, if given, specifies
|
|
units in which @var{size} is expressed, e.g. @samp{2M} mean 2
|
|
megabytes (@pxref{size-suffixes}, for a list of allowed size
|
|
suffixes). Without @var{suf}, units of 1024 bytes (kilobyte) are
|
|
assumed.
|
|
|
|
This option selects @option{--multi-volume} automatically. For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --tape-length=41943040 --file=/dev/tape @var{files}}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
or, which is equivalent:
|
|
|
|
@smallexample
|
|
$ @kbd{tar --create --tape-length=4G --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.}:
|
|
|
|
@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.
|
|
|
|
When prompting for a new tape, @command{tar} accepts any of the following
|
|
responses:
|
|
|
|
@table @kbd
|
|
@item ?
|
|
Request @command{tar} to explain possible responses.
|
|
@item q
|
|
Request @command{tar} to exit immediately.
|
|
@item n @var{file-name}
|
|
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}@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, 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{command}
|
|
@itemx --new-volume-script=@var{command}
|
|
@itemx -F @var{command}
|
|
Specify the command to invoke when switching volumes. The @var{command}
|
|
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{command} can contain additional options, if such are needed.
|
|
@xref{external, Running External Commands}, for a detailed discussion
|
|
of the way @GNUTAR{} runs external commands. It inherits
|
|
@command{tar}'s shell environment. Additional data is passed to it
|
|
via the following environment variables:
|
|
|
|
@table @env
|
|
@vrindex TAR_VERSION, info script environment variable
|
|
@item TAR_VERSION
|
|
@GNUTAR{} version number.
|
|
|
|
@vrindex TAR_ARCHIVE, info script environment variable
|
|
@item TAR_ARCHIVE
|
|
The name of the archive @command{tar} is processing.
|
|
|
|
@vrindex TAR_BLOCKING_FACTOR, info script environment variable
|
|
@item TAR_BLOCKING_FACTOR
|
|
Current blocking factor (@pxref{Blocking}).
|
|
|
|
@vrindex TAR_VOLUME, info script environment variable
|
|
@item TAR_VOLUME
|
|
Ordinal number of the volume @command{tar} is about to start.
|
|
|
|
@vrindex TAR_SUBCOMMAND, info script environment variable
|
|
@item TAR_SUBCOMMAND
|
|
A short option describing the operation @command{tar} is executing.
|
|
@xref{Operations}, for a complete list of subcommand options.
|
|
|
|
@vrindex TAR_FORMAT, info script environment variable
|
|
@item TAR_FORMAT
|
|
Format of the archive being processed. @xref{Formats}, for a complete
|
|
list of archive format names.
|
|
|
|
@vrindex TAR_FD, info script environment variable
|
|
@item TAR_FD
|
|
File descriptor which can be used to communicate the new volume
|
|
name to @command{tar}.
|
|
@end table
|
|
|
|
These variables can be used in the @var{command} itself, provided that
|
|
they are properly quoted to prevent them from being expanded by the
|
|
shell that invokes @command{tar}.
|
|
|
|
The volume script can instruct @command{tar} to use new archive name,
|
|
by writing in to file descriptor @env{$TAR_FD} (see below for an example).
|
|
|
|
If the info script fails, @command{tar} exits; otherwise, it begins
|
|
writing the next volume.
|
|
|
|
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
|
|
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). 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 -cM -f /dev/tape0 -f /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 @env{$TAR_FD}. 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
|
|
#! /bin/bash
|
|
# For this script it's advisable to use a shell, such as Bash,
|
|
# that supports a TAR_FD value greater than 9.
|
|
|
|
echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
|
|
|
|
name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
|
|
case $TAR_SUBCOMMAND in
|
|
-c) ;;
|
|
-d|-x|-t) test -r $@{name:-$TAR_ARCHIVE@}-$TAR_VOLUME || exit 1
|
|
;;
|
|
*) exit 1
|
|
esac
|
|
|
|
echo $@{name:-$TAR_ARCHIVE@}-$TAR_VOLUME >&$TAR_FD
|
|
@end group
|
|
@end smallexample
|
|
|
|
The same script can be used while listing, comparing or extracting
|
|
from the created archive. For example:
|
|
|
|
@smallexample
|
|
@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
|
|
|
|
@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
|
|
volume, use @option{--list}, without @option{--multi-volume} specified.
|
|
To extract an archive member from one volume (assuming it is described
|
|
that volume), use @option{--extract}, again without
|
|
@option{--multi-volume}.
|
|
|
|
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
|
|
@samp{tar --extract --multi-volume}---@command{tar} will prompt for later
|
|
volumes as it needs them. @xref{extracting archives}, for more
|
|
information about extracting archives.
|
|
|
|
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}} (@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.
|
|
|
|
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
|
|
@cindex labeling archives
|
|
@opindex label
|
|
@UNREVISED{}
|
|
|
|
To give the archive a name which will be recorded in it, use the
|
|
@option{--label=@var{volume-label}} (@option{-V @var{volume-label}})
|
|
option. This will write a special block identifying
|
|
@var{volume-label} as the name of the archive to the front of the
|
|
archive which will be displayed when the archive is listed with
|
|
@option{--list}. If you are creating a multi-volume archive with
|
|
@option{--multi-volume} (@pxref{Using Multiple Tapes}), then the
|
|
volume label will have @samp{Volume @var{nnn}} appended to the name
|
|
you give, where @var{nnn} is the number of the volume of the archive.
|
|
If you use the @option{--label=@var{volume-label}} option when
|
|
reading an archive, it checks to make sure the label on the tape
|
|
matches the one you gave. @xref{label}.
|
|
|
|
When @command{tar} writes an archive to tape, it creates a single
|
|
tape file. If multiple archives are written to the same tape, one
|
|
after the other, they each get written as separate tape files. When
|
|
extracting, it is necessary to position the tape at the right place
|
|
before running @command{tar}. To do this, use the @command{mt} command.
|
|
For more information on the @command{mt} command and on the organization
|
|
of tapes into a sequence of tape files, see @ref{mt}.
|
|
|
|
People seem to often do:
|
|
|
|
@smallexample
|
|
@kbd{--label="@var{some-prefix} `date +@var{some-format}`"}
|
|
@end smallexample
|
|
|
|
or such, for pushing a common date in all volumes or an archive set.
|
|
|
|
@node Tarcat
|
|
@subsection Concatenate Volumes into a Single Archive
|
|
|
|
@pindex tarcat
|
|
Sometimes it is necessary to convert existing @GNUTAR{} multi-volume
|
|
archive to a single @command{tar} archive. Simply concatenating all
|
|
volumes into one will not work, since each volume carries an additional
|
|
information at the beginning. @GNUTAR{} is shipped with the shell
|
|
script @command{tarcat} designed for this purpose.
|
|
|
|
The script takes a list of files comprising a multi-volume archive
|
|
and creates the resulting archive at the standard output. For example:
|
|
|
|
@smallexample
|
|
@kbd{tarcat vol.1 vol.2 vol.3 | tar tf -}
|
|
@end smallexample
|
|
|
|
The script implements a simple heuristics to determine the format of
|
|
the first volume file and to decide how to process the rest of the
|
|
files. However, it makes no attempt to verify whether the files are
|
|
given in order or even if they are valid @command{tar} archives.
|
|
It uses @command{dd} and does not filter its standard error, so you
|
|
will usually see lots of spurious messages.
|
|
|
|
@FIXME{The script is not installed. Should we install it?}
|
|
|
|
@node label
|
|
@section Including a Label in the Archive
|
|
@cindex Labeling an archive
|
|
@cindex Labels on the archive media
|
|
@cindex Labeling multi-volume archives
|
|
|
|
@opindex label
|
|
To avoid problems caused by misplaced paper labels on the archive
|
|
media, you can include a @dfn{label} entry --- an archive member which
|
|
contains the name of the archive --- in the archive itself. Use the
|
|
@option{--label=@var{archive-label}} (@option{-V @var{archive-label}})
|
|
option@footnote{Until version 1.10, that option was called
|
|
@option{--volume}, but is not available under that name anymore.} in
|
|
conjunction with the @option{--create} operation to include a label
|
|
entry in the archive as it is being created.
|
|
|
|
@table @option
|
|
@item --label=@var{archive-label}
|
|
@itemx -V @var{archive-label}
|
|
Includes an @dfn{archive-label} at the beginning of the archive when
|
|
the archive is being created, when used in conjunction with the
|
|
@option{--create} operation. Checks to make sure the archive label
|
|
matches the one specified (when used in conjunction with any other
|
|
operation).
|
|
@end table
|
|
|
|
If you create an archive using both
|
|
@option{--label=@var{archive-label}} (@option{-V @var{archive-label}})
|
|
and @option{--multi-volume} (@option{-M}), each volume of the archive
|
|
will have an archive label of the form @samp{@var{archive-label}
|
|
Volume @var{n}}, where @var{n} is 1 for the first volume, 2 for the
|
|
next, and so on. @xref{Using Multiple Tapes}, for information on
|
|
creating multiple volume archives.
|
|
|
|
@cindex Volume label, listing
|
|
@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
|
|
explicitly marked as in the example below:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --verbose --list --file=iamanarchive}
|
|
V--------- 0/0 0 1992-03-07 12:01 iamalabel--Volume Header--
|
|
-rw-r--r-- ringo/user 40 1990-05-21 13:30 iamafilename
|
|
@end group
|
|
@end smallexample
|
|
|
|
@opindex test-label
|
|
@anchor{--test-label option}
|
|
However, @option{--list} option will cause listing entire
|
|
contents of the archive, which may be undesirable (for example, if the
|
|
archive is stored on a tape). You can request checking only the volume
|
|
label by specifying @option{--test-label} option. This option reads only the
|
|
first block of an archive, so it can be used with slow storage
|
|
devices. For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --test-label --file=iamanarchive}
|
|
iamalabel
|
|
@end group
|
|
@end smallexample
|
|
|
|
If @option{--test-label} is used with one or more command line
|
|
arguments, @command{tar} compares the volume label with each
|
|
argument. It exits with code 0 if a match is found, and with code 1
|
|
otherwise@footnote{Note that @GNUTAR{} versions up to 1.23 indicated
|
|
mismatch with an exit code 2 and printed a spurious diagnostics on
|
|
stderr.}. No output is displayed, unless you also used the
|
|
@option{--verbose} option. For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --test-label --file=iamanarchive 'iamalabel'}
|
|
@result{} 0
|
|
$ @kbd{tar --test-label --file=iamanarchive 'alabel'}
|
|
@result{} 1
|
|
@end group
|
|
@end smallexample
|
|
|
|
When used with the @option{--verbose} option, @command{tar}
|
|
prints the actual volume label (if any), and a verbose diagnostics in
|
|
case of a mismatch:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --test-label --verbose --file=iamanarchive 'iamalabel'}
|
|
iamalabel
|
|
@result{} 0
|
|
$ @kbd{tar --test-label --verbose --file=iamanarchive 'alabel'}
|
|
iamalabel
|
|
tar: Archive label mismatch
|
|
@result{} 1
|
|
@end group
|
|
@end smallexample
|
|
|
|
If you request any operation, other than @option{--create}, along
|
|
with using @option{--label} option, @command{tar} will first check if
|
|
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 labeled with string @samp{My volume},
|
|
you will get:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar -rf archive --label 'My volume' .}
|
|
tar: Archive not labeled to match 'My volume'
|
|
@end group
|
|
@end smallexample
|
|
|
|
@noindent
|
|
in case its label does not match. This will work even if
|
|
@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}
|
|
specified. In those cases, @var{archive-label} argument is interpreted
|
|
as a globbing-style pattern which must match the actual magnetic
|
|
volume label. @xref{exclude}, for a precise description of how match
|
|
is attempted@footnote{Previous versions of @command{tar} used full
|
|
regular expression matching, or before that, only exact string
|
|
matching, instead of wildcard matchers. We decided for the sake of
|
|
simplicity to use a uniform matching device through
|
|
@command{tar}.}. If the switch @option{--multi-volume} (@option{-M}) is being used,
|
|
the volume label matcher will also suffix @var{archive-label} by
|
|
@w{@samp{ Volume [1-9]*}} if the initial match fails, before giving
|
|
up. Since the volume numbering is automatically added in labels at
|
|
creation time, it sounded logical to equally help the user taking care
|
|
of it when the archive is being read.
|
|
|
|
You can also use @option{--label} to get a common information on
|
|
all tapes of a series. For having this information different in each
|
|
series created through a single script used on a regular basis, just
|
|
manage to get some date string as part of the label. For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar -cM -f /dev/tape -V "Daily backup for `date +%Y-%m-%d`"}
|
|
$ @kbd{tar --create --file=/dev/tape --multi-volume \
|
|
--label="Daily backup for `date +%Y-%m-%d`"}
|
|
@end group
|
|
@end smallexample
|
|
|
|
Some more notes about volume labels:
|
|
|
|
@itemize @bullet
|
|
@item Each label has its own date and time, which corresponds
|
|
to the time when @GNUTAR{} initially attempted to write it,
|
|
often soon after the operator launches @command{tar} or types the
|
|
carriage return telling that the next tape is ready.
|
|
|
|
@item Comparing date labels to get an idea of tape throughput is
|
|
unreliable. It gives correct results only if the delays for rewinding
|
|
tapes and the operator switching them were negligible, which is
|
|
usually not the case.
|
|
@end itemize
|
|
|
|
@node verify
|
|
@section Verifying Data as It is Stored
|
|
@cindex Verifying a write operation
|
|
@cindex Double-checking a write operation
|
|
|
|
@table @option
|
|
@item -W
|
|
@itemx --verify
|
|
@opindex verify, short description
|
|
Attempt to verify the archive after writing.
|
|
@end table
|
|
|
|
This option causes @command{tar} to verify the archive after writing it.
|
|
Each volume is checked after it is written, and any discrepancies
|
|
are recorded on the standard error output.
|
|
|
|
Verification requires that the archive be on a back-space-able medium.
|
|
This means pipes, some cartridge tape drives, and some other devices
|
|
cannot be verified.
|
|
|
|
You can insure the accuracy of an archive by comparing files in the
|
|
system with archive members. @command{tar} can compare an archive to the
|
|
file system as the archive is being written, to verify a write
|
|
operation, or can compare a previously written archive, to insure that
|
|
it is up to date.
|
|
|
|
@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
|
|
specified, @command{tar} checks archive members against their counterparts
|
|
in the file system, and reports discrepancies on the standard error.
|
|
|
|
To verify an archive, you must be able to read it from before the end
|
|
of the last written entry. This option is useful for detecting data
|
|
errors on some tapes. Archives written to pipes, some cartridge tape
|
|
drives, and some other devices cannot be verified.
|
|
|
|
One can explicitly compare an already made archive with the file
|
|
system by using the @option{--compare} (@option{--diff}, @option{-d})
|
|
option, instead of using the more automatic @option{--verify} option.
|
|
@xref{compare}.
|
|
|
|
Note that these two options have a slightly different intent. The
|
|
@option{--compare} option checks how identical are the logical contents of some
|
|
archive with what is on your disks, while the @option{--verify} option is
|
|
really for checking if the physical contents agree and if the recording
|
|
media itself is of dependable quality. So, for the @option{--verify}
|
|
operation, @command{tar} tries to defeat all in-memory cache pertaining to
|
|
the archive, while it lets the speed optimization undisturbed for the
|
|
@option{--compare} option. If you nevertheless use @option{--compare} for
|
|
media verification, you may have to defeat the in-memory cache yourself,
|
|
maybe by opening and reclosing the door latch of your recording unit,
|
|
forcing some doubt in your operating system about the fact this is really
|
|
the same volume as the one just written or read.
|
|
|
|
The @option{--verify} option would not be necessary if drivers were indeed
|
|
able to detect dependably all write failures. This sometimes require many
|
|
magnetic heads, some able to read after the writes occurred. One would
|
|
not say that drivers unable to detect all cases are necessarily flawed,
|
|
as long as programming is concerned.
|
|
|
|
The @option{--verify} (@option{-W}) option will not work in
|
|
conjunction with the @option{--multi-volume} (@option{-M}) option or
|
|
the @option{--append} (@option{-r}), @option{--update} (@option{-u})
|
|
and @option{--delete} operations. @xref{Operations}, for more
|
|
information on these operations.
|
|
|
|
Also, since @command{tar} normally strips leading @samp{/} from file
|
|
names (@pxref{absolute}), a command like @samp{tar --verify -cf
|
|
/tmp/foo.tar /etc} will work as desired only if the working directory is
|
|
@file{/}, as @command{tar} uses the archive's relative member names
|
|
(e.g., @file{etc/motd}) when verifying the archive.
|
|
|
|
@node Write Protection
|
|
@section Write Protection
|
|
|
|
Almost all tapes and diskettes, and in a few rare cases, even disks can
|
|
be @dfn{write protected}, to protect data on them from being changed.
|
|
Once an archive is written, you should write protect the media to prevent
|
|
the archive from being accidentally overwritten or deleted. (This will
|
|
protect the archive from being changed with a tape or floppy drive---it
|
|
will not protect it from magnet fields or other physical hazards.)
|
|
|
|
The write protection device itself is usually an integral part of the
|
|
physical media, and can be a two position (write enabled/write
|
|
disabled) switch, a notch which can be popped out or covered, a ring
|
|
which can be removed from the center of a tape reel, or some other
|
|
changeable feature.
|
|
|
|
@node Reliability and security
|
|
@chapter Reliability and Security
|
|
|
|
The @command{tar} command reads and writes files as any other
|
|
application does, and is subject to the usual caveats about
|
|
reliability and security. This section contains some commonsense
|
|
advice on the topic.
|
|
|
|
@menu
|
|
* Reliability::
|
|
* Security::
|
|
@end menu
|
|
|
|
@node Reliability
|
|
@section Reliability
|
|
|
|
Ideally, when @command{tar} is creating an archive, it reads from a
|
|
file system that is not being modified, and encounters no errors or
|
|
inconsistencies while reading and writing. If this is the case, the
|
|
archive should faithfully reflect what was read. Similarly, when
|
|
extracting from an archive, ideally @command{tar} ideally encounters
|
|
no errors and the extracted files faithfully reflect what was in the
|
|
archive.
|
|
|
|
However, when reading or writing real-world file systems, several
|
|
things can go wrong; these include permissions problems, corruption of
|
|
data, and race conditions.
|
|
|
|
@menu
|
|
* Permissions problems::
|
|
* Data corruption and repair::
|
|
* Race conditions::
|
|
@end menu
|
|
|
|
@node Permissions problems
|
|
@subsection Permissions Problems
|
|
|
|
If @command{tar} encounters errors while reading or writing files, it
|
|
normally reports an error and exits with nonzero status. The work it
|
|
does may therefore be incomplete. For example, when creating an
|
|
archive, if @command{tar} cannot read a file then it cannot copy the
|
|
file into the archive.
|
|
|
|
@node Data corruption and repair
|
|
@subsection Data Corruption and Repair
|
|
|
|
If an archive becomes corrupted by an I/O error, this may corrupt the
|
|
data in an extracted file. Worse, it may corrupt the file's metadata,
|
|
which may cause later parts of the archive to become misinterpreted.
|
|
An tar-format archive contains a checksum that most likely will detect
|
|
errors in the metadata, but it will not detect errors in the data.
|
|
|
|
If data corruption is a concern, you can compute and check your own
|
|
checksums of an archive by using other programs, such as
|
|
@command{cksum}.
|
|
|
|
When attempting to recover from a read error or data corruption in an
|
|
archive, you may need to skip past the questionable data and read the
|
|
rest of the archive. This requires some expertise in the archive
|
|
format and in other software tools.
|
|
|
|
@node Race conditions
|
|
@subsection Race conditions
|
|
|
|
If some other process is modifying the file system while @command{tar}
|
|
is reading or writing files, the result may well be inconsistent due
|
|
to race conditions. For example, if another process creates some
|
|
files in a directory while @command{tar} is creating an archive
|
|
containing the directory's files, @command{tar} may see some of the
|
|
files but not others, or it may see a file that is in the process of
|
|
being created. The resulting archive may not be a snapshot of the
|
|
file system at any point in time. If an application such as a
|
|
database system depends on an accurate snapshot, restoring from the
|
|
@command{tar} archive of a live file system may therefore break that
|
|
consistency and may break the application. The simplest way to avoid
|
|
the consistency issues is to avoid making other changes to the file
|
|
system while tar is reading it or writing it.
|
|
|
|
When creating an archive, several options are available to avoid race
|
|
conditions. Some hosts have a way of snapshotting a file system, or
|
|
of temporarily suspending all changes to a file system, by (say)
|
|
suspending the only virtual machine that can modify a file system; if
|
|
you use these facilities and have @command{tar -c} read from a
|
|
snapshot when creating an archive, you can avoid inconsistency
|
|
problems. More drastically, before starting @command{tar} you could
|
|
suspend or shut down all processes other than @command{tar} that have
|
|
access to the file system, or you could unmount the file system and
|
|
then mount it read-only.
|
|
|
|
When extracting from an archive, one approach to avoid race conditions
|
|
is to create a directory that no other process can write to, and
|
|
extract into that.
|
|
|
|
@node Security
|
|
@section Security
|
|
|
|
In some cases @command{tar} may be used in an adversarial situation,
|
|
where an untrusted user is attempting to gain information about or
|
|
modify otherwise-inaccessible files. Dealing with untrusted data
|
|
(that is, data generated by an untrusted user) typically requires
|
|
extra care, because even the smallest mistake in the use of
|
|
@command{tar} is more likely to be exploited by an adversary than by a
|
|
race condition.
|
|
|
|
@menu
|
|
* Privacy::
|
|
* Integrity::
|
|
* Live untrusted data::
|
|
* Security rules of thumb::
|
|
@end menu
|
|
|
|
@node Privacy
|
|
@subsection Privacy
|
|
|
|
Standard privacy concerns apply when using @command{tar}. For
|
|
example, suppose you are archiving your home directory into a file
|
|
@file{/archive/myhome.tar}. Any secret information in your home
|
|
directory, such as your SSH secret keys, are copied faithfully into
|
|
the archive. Therefore, if your home directory contains any file that
|
|
should not be read by some other user, the archive itself should be
|
|
not be readable by that user. And even if the archive's data are
|
|
inaccessible to untrusted users, its metadata (such as size or
|
|
last-modified date) may reveal some information about your home
|
|
directory; if the metadata are intended to be private, the archive's
|
|
parent directory should also be inaccessible to untrusted users.
|
|
|
|
One precaution is to create @file{/archive} so that it is not
|
|
accessible to any user, unless that user also has permission to access
|
|
all the files in your home directory.
|
|
|
|
Similarly, when extracting from an archive, take care that the
|
|
permissions of the extracted files are not more generous than what you
|
|
want. Even if the archive itself is readable only to you, files
|
|
extracted from it have their own permissions that may differ.
|
|
|
|
@node Integrity
|
|
@subsection Integrity
|
|
|
|
When creating archives, take care that they are not writable by a
|
|
untrusted user; otherwise, that user could modify the archive, and
|
|
when you later extract from the archive you will get incorrect data.
|
|
|
|
When @command{tar} extracts from an archive, by default it writes into
|
|
files relative to the working directory. If the archive was generated
|
|
by an untrusted user, that user therefore can write into any file
|
|
under the working directory. If the working directory contains a
|
|
symbolic link to another directory, the untrusted user can also write
|
|
into any file under the referenced directory. When extracting from an
|
|
untrusted archive, it is therefore good practice to create an empty
|
|
directory and run @command{tar} in that directory.
|
|
|
|
When extracting from two or more untrusted archives, each one should
|
|
be extracted independently, into different empty directories.
|
|
Otherwise, the first archive could create a symbolic link into an area
|
|
outside the working directory, and the second one could follow the
|
|
link and overwrite data that is not under the working directory. For
|
|
example, when restoring from a series of incremental dumps, the
|
|
archives should have been created by a trusted process, as otherwise
|
|
the incremental restores might alter data outside the working
|
|
directory.
|
|
|
|
If you use the @option{--absolute-names} (@option{-P}) option when
|
|
extracting, @command{tar} respects any file names in the archive, even
|
|
file names that begin with @file{/} or contain @file{..}. As this
|
|
lets the archive overwrite any file in your system that you can write,
|
|
the @option{--absolute-names} (@option{-P}) option should be used only
|
|
for trusted archives.
|
|
|
|
Conversely, with the @option{--keep-old-files} (@option{-k}) and
|
|
@option{--skip-old-files} options, @command{tar} refuses to replace
|
|
existing files when extracting. The difference between the two
|
|
options is that the former treats existing files as errors whereas the
|
|
latter just silently ignores them.
|
|
|
|
Finally, with the @option{--no-overwrite-dir} option, @command{tar}
|
|
refuses to replace the permissions or ownership of already-existing
|
|
directories. These options may help when extracting from untrusted
|
|
archives.
|
|
|
|
@node Live untrusted data
|
|
@subsection Dealing with Live Untrusted Data
|
|
|
|
Extra care is required when creating from or extracting into a file
|
|
system that is accessible to untrusted users. For example, superusers
|
|
who invoke @command{tar} must be wary about its actions being hijacked
|
|
by an adversary who is reading or writing the file system at the same
|
|
time that @command{tar} is operating.
|
|
|
|
When creating an archive from a live file system, @command{tar} is
|
|
vulnerable to denial-of-service attacks. For example, an adversarial
|
|
user could create the illusion of an indefinitely-deep directory
|
|
hierarchy @file{d/e/f/g/...} by creating directories one step ahead of
|
|
@command{tar}, or the illusion of an indefinitely-long file by
|
|
creating a sparse file but arranging for blocks to be allocated just
|
|
before @command{tar} reads them. There is no easy way for
|
|
@command{tar} to distinguish these scenarios from legitimate uses, so
|
|
you may need to monitor @command{tar}, just as you'd need to monitor
|
|
any other system service, to detect such attacks.
|
|
|
|
While a superuser is extracting from an archive into a live file
|
|
system, an untrusted user might replace a directory with a symbolic
|
|
link, in hopes that @command{tar} will follow the symbolic link and
|
|
extract data into files that the untrusted user does not have access
|
|
to. Even if the archive was generated by the superuser, it may
|
|
contain a file such as @file{d/etc/passwd} that the untrusted user
|
|
earlier created in order to break in; if the untrusted user replaces
|
|
the directory @file{d/etc} with a symbolic link to @file{/etc} while
|
|
@command{tar} is running, @command{tar} will overwrite
|
|
@file{/etc/passwd}. This attack can be prevented by extracting into a
|
|
directory that is inaccessible to untrusted users.
|
|
|
|
Similar attacks via symbolic links are also possible when creating an
|
|
archive, if the untrusted user can modify an ancestor of a top-level
|
|
argument of @command{tar}. For example, an untrusted user that can
|
|
modify @file{/home/eve} can hijack a running instance of @samp{tar -cf
|
|
- /home/eve/Documents/yesterday} by replacing
|
|
@file{/home/eve/Documents} with a symbolic link to some other
|
|
location. Attacks like these can be prevented by making sure that
|
|
untrusted users cannot modify any files that are top-level arguments
|
|
to @command{tar}, or any ancestor directories of these files.
|
|
|
|
@node Security rules of thumb
|
|
@subsection Security Rules of Thumb
|
|
|
|
This section briefly summarizes rules of thumb for avoiding security
|
|
pitfalls.
|
|
|
|
@itemize @bullet
|
|
|
|
@item
|
|
Protect archives at least as much as you protect any of the files
|
|
being archived.
|
|
|
|
@item
|
|
Extract from an untrusted archive only into an otherwise-empty
|
|
directory. This directory and its parent should be accessible only to
|
|
trusted users. For example:
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{chmod go-rwx .}
|
|
$ @kbd{mkdir -m go-rwx dir}
|
|
$ @kbd{cd dir}
|
|
$ @kbd{tar -xvf /archives/got-it-off-the-net.tar.gz}
|
|
@end group
|
|
@end example
|
|
|
|
As a corollary, do not do an incremental restore from an untrusted archive.
|
|
|
|
@item
|
|
Do not let untrusted users access files extracted from untrusted
|
|
archives without checking first for problems such as setuid programs.
|
|
|
|
@item
|
|
Do not let untrusted users modify directories that are ancestors of
|
|
top-level arguments of @command{tar}. For example, while you are
|
|
executing @samp{tar -cf /archive/u-home.tar /u/home}, do not let an
|
|
untrusted user modify @file{/}, @file{/archive}, or @file{/u}.
|
|
|
|
@item
|
|
Pay attention to the diagnostics and exit status of @command{tar}.
|
|
|
|
@item
|
|
When archiving live file systems, monitor running instances of
|
|
@command{tar} to detect denial-of-service attacks.
|
|
|
|
@item
|
|
Avoid unusual options such as @option{--absolute-names} (@option{-P}),
|
|
@option{--dereference} (@option{-h}), @option{--overwrite},
|
|
@option{--recursive-unlink}, and @option{--remove-files} unless you
|
|
understand their security implications.
|
|
|
|
@end itemize
|
|
|
|
@node Changes
|
|
@appendix Changes
|
|
|
|
This appendix lists some important user-visible changes between
|
|
various versions of @GNUTAR{}. An up-to-date version of this document
|
|
is available at
|
|
@uref{http://www.gnu.org/@/software/@/tar/manual/changes.html,the
|
|
@GNUTAR{} documentation page}.
|
|
|
|
@table @asis
|
|
@item Use of globbing patterns when listing and extracting.
|
|
|
|
Previous versions of GNU tar assumed shell-style globbing when
|
|
extracting from or listing an archive. For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar xf foo.tar '*.c'}
|
|
@end smallexample
|
|
|
|
would extract all files whose names end in @samp{.c}. This behavior
|
|
was not documented and was incompatible with traditional tar
|
|
implementations. Therefore, starting from version 1.15.91, GNU tar
|
|
no longer uses globbing by default. For example, the above invocation
|
|
is now interpreted as a request to extract from the archive the file
|
|
named @file{*.c}.
|
|
|
|
To facilitate transition to the new behavior for those users who got
|
|
used to the previous incorrect one, @command{tar} will print a warning
|
|
if it finds out that a requested member was not found in the archive
|
|
and its name looks like a globbing pattern. For example:
|
|
|
|
@smallexample
|
|
$ @kbd{tar xf foo.tar '*.c'}
|
|
tar: Pattern matching characters used in file names. Please,
|
|
tar: use --wildcards to enable pattern matching, or --no-wildcards to
|
|
tar: suppress this warning.
|
|
tar: *.c: Not found in archive
|
|
tar: Error exit delayed from previous errors
|
|
@end smallexample
|
|
|
|
To treat member names as globbing patterns, use the @option{--wildcards} option.
|
|
If you want to tar to mimic the behavior of versions prior to 1.15.91,
|
|
add this option to your @env{TAR_OPTIONS} variable.
|
|
|
|
@xref{wildcards}, for the detailed discussion of the use of globbing
|
|
patterns by @GNUTAR{}.
|
|
|
|
@item Use of short option @option{-o}.
|
|
|
|
Earlier versions of @GNUTAR{} understood @option{-o} command line
|
|
option as a synonym for @option{--old-archive}.
|
|
|
|
@GNUTAR{} starting from version 1.13.90 understands this option as
|
|
a synonym for @option{--no-same-owner}. This is compatible with
|
|
UNIX98 @command{tar} implementations.
|
|
|
|
However, to facilitate transition, @option{-o} option retains its
|
|
old semantics when it is used with one of archive-creation commands.
|
|
Users are encouraged to use @option{--format=oldgnu} instead.
|
|
|
|
It is especially important, since versions of @acronym{GNU} Automake
|
|
up to and including 1.8.4 invoke tar with this option to produce
|
|
distribution tarballs. @xref{Formats,v7}, for the detailed discussion
|
|
of this issue and its implications.
|
|
|
|
@xref{Options, tar-formats, Changing Automake's Behavior,
|
|
automake, GNU Automake}, for a description on how to use various
|
|
archive formats with @command{automake}.
|
|
|
|
Future versions of @GNUTAR{} will understand @option{-o} only as a
|
|
synonym for @option{--no-same-owner}.
|
|
|
|
@item Use of short option @option{-l}
|
|
|
|
Earlier versions of @GNUTAR{} understood @option{-l} option as a
|
|
synonym for @option{--one-file-system}. Since such usage contradicted
|
|
to UNIX98 specification and harmed compatibility with other
|
|
implementations, it was declared deprecated in version 1.14. However,
|
|
to facilitate transition to its new semantics, it was supported by
|
|
versions 1.15 and 1.15.90. The present use of @option{-l} as a short
|
|
variant of @option{--check-links} was introduced in version 1.15.91.
|
|
|
|
@item Use of options @option{--portability} and @option{--old-archive}
|
|
|
|
These options are deprecated. Please use @option{--format=v7} instead.
|
|
|
|
@item Use of option @option{--posix}
|
|
|
|
This option is deprecated. Please use @option{--format=posix} instead.
|
|
@end table
|
|
|
|
@node Recipes
|
|
@appendix Recipes
|
|
@include recipes.texi
|
|
|
|
@node Configuring Help Summary
|
|
@appendix Configuring Help Summary
|
|
|
|
Running @kbd{tar --help} displays the short @command{tar} option
|
|
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
|
|
the option. For example, here is an excerpt from the actual @kbd{tar
|
|
--help} output:
|
|
|
|
@verbatim
|
|
Main operation mode:
|
|
|
|
-A, --catenate, --concatenate append tar files to an archive
|
|
-c, --create create a new archive
|
|
-d, --diff, --compare find differences between archive and
|
|
file system
|
|
--delete delete from the archive
|
|
@end verbatim
|
|
|
|
@vrindex ARGP_HELP_FMT, environment variable
|
|
The exact visual representation of the help output is configurable via
|
|
@env{ARGP_HELP_FMT} environment variable. The value of this variable
|
|
is a comma-separated list of @dfn{format variable} assignments. There
|
|
are two kinds of format variables. An @dfn{offset variable} keeps the
|
|
offset of some part of help output text from the leftmost column on
|
|
the screen. A @dfn{boolean} variable is a flag that toggles some
|
|
output feature on or off. Depending on the type of the corresponding
|
|
variable, there are two kinds of assignments:
|
|
|
|
@table @asis
|
|
@item Offset assignment
|
|
|
|
The assignment to an offset variable has the following syntax:
|
|
|
|
@smallexample
|
|
@var{variable}=@var{value}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
where @var{variable} is the variable name, and @var{value} is a
|
|
numeric value to be assigned to the variable.
|
|
|
|
@item Boolean assignment
|
|
|
|
To assign @code{true} value to a variable, simply put this variable name. To
|
|
assign @code{false} value, prefix the variable name with @samp{no-}. For
|
|
example:
|
|
|
|
@smallexample
|
|
@group
|
|
# Assign @code{true} value:
|
|
dup-args
|
|
# Assign @code{false} value:
|
|
no-dup-args
|
|
@end group
|
|
@end smallexample
|
|
@end table
|
|
|
|
Following variables are declared:
|
|
|
|
@deftypevr {Help Output} boolean dup-args
|
|
If true, arguments for an option are shown with both short and long
|
|
options, even when a given option has both forms, for example:
|
|
|
|
@smallexample
|
|
-f ARCHIVE, --file=ARCHIVE use archive file or device ARCHIVE
|
|
@end smallexample
|
|
|
|
If false, then if an option has both short and long forms, the
|
|
argument is only shown with the long one, for example:
|
|
|
|
@smallexample
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
@end smallexample
|
|
|
|
@noindent
|
|
and a message indicating that the argument is applicable to both
|
|
forms is printed below the options. This message can be disabled
|
|
using @code{dup-args-note} (see below).
|
|
|
|
The default is false.
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} boolean dup-args-note
|
|
If this variable is true, which is the default, the following notice
|
|
is displayed at the end of the help output:
|
|
|
|
@quotation
|
|
Mandatory or optional arguments to long options are also mandatory or
|
|
optional for any corresponding short options.
|
|
@end quotation
|
|
|
|
Setting @code{no-dup-args-note} inhibits this message. Normally, only one of
|
|
variables @code{dup-args} or @code{dup-args-note} should be set.
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset short-opt-col
|
|
Column in which short options start. Default is 2.
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
$ @kbd{ARGP_HELP_FMT=short-opt-col=6 tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
@end group
|
|
@end smallexample
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset long-opt-col
|
|
Column in which long options start. Default is 6. For example:
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
$ @kbd{ARGP_HELP_FMT=long-opt-col=16 tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
@end group
|
|
@end smallexample
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset doc-opt-col
|
|
Column in which @dfn{doc options} start. A doc option isn't actually
|
|
an option, but rather an arbitrary piece of documentation that is
|
|
displayed in much the same manner as the options. For example, in
|
|
the description of @option{--format} option:
|
|
|
|
@smallexample
|
|
@group
|
|
-H, --format=FORMAT create archive of the given format.
|
|
|
|
FORMAT is one of the following:
|
|
|
|
gnu GNU tar 1.13.x format
|
|
oldgnu GNU format as per tar <= 1.12
|
|
pax POSIX 1003.1-2001 (pax) format
|
|
posix same as pax
|
|
ustar POSIX 1003.1-1988 (ustar) format
|
|
v7 old V7 tar format
|
|
@end group
|
|
@end smallexample
|
|
|
|
@noindent
|
|
the format names are doc options. Thus, if you set
|
|
@kbd{ARGP_HELP_FMT=doc-opt-col=6} the above part of the help output
|
|
will look as follows:
|
|
|
|
@smallexample
|
|
@group
|
|
-H, --format=FORMAT create archive of the given format.
|
|
|
|
FORMAT is one of the following:
|
|
|
|
gnu GNU tar 1.13.x format
|
|
oldgnu GNU format as per tar <= 1.12
|
|
pax POSIX 1003.1-2001 (pax) format
|
|
posix same as pax
|
|
ustar POSIX 1003.1-1988 (ustar) format
|
|
v7 old V7 tar format
|
|
@end group
|
|
@end smallexample
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset opt-doc-col
|
|
Column in which option description starts. Default is 29.
|
|
|
|
@smallexample
|
|
@group
|
|
$ @kbd{tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
$ @kbd{ARGP_HELP_FMT=opt-doc-col=19 tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
|
$ @kbd{ARGP_HELP_FMT=opt-doc-col=9 tar --help|grep ARCHIVE}
|
|
-f, --file=ARCHIVE
|
|
use archive file or device ARCHIVE
|
|
@end group
|
|
@end smallexample
|
|
|
|
@noindent
|
|
Notice, that the description starts on a separate line if
|
|
@code{opt-doc-col} value is too small.
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset header-col
|
|
Column in which @dfn{group headers} are printed. A group header is a
|
|
descriptive text preceding an option group. For example, in the
|
|
following text:
|
|
|
|
@verbatim
|
|
Main operation mode:
|
|
|
|
-A, --catenate, --concatenate append tar files to
|
|
an archive
|
|
-c, --create create a new archive
|
|
@end verbatim
|
|
@noindent
|
|
@samp{Main operation mode:} is the group header.
|
|
|
|
The default value is 1.
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset usage-indent
|
|
Indentation of wrapped usage lines. Affects @option{--usage}
|
|
output. Default is 12.
|
|
@end deftypevr
|
|
|
|
@deftypevr {Help Output} offset rmargin
|
|
Right margin of the text output. Used for wrapping.
|
|
@end deftypevr
|
|
|
|
@node Fixing Snapshot Files
|
|
@appendix Fixing Snapshot Files
|
|
@include tar-snapshot-edit.texi
|
|
|
|
@node Tar Internals
|
|
@appendix Tar Internals
|
|
@include intern.texi
|
|
|
|
@node Genfile
|
|
@appendix Genfile
|
|
@include genfile.texi
|
|
|
|
@node GNU Free Documentation License
|
|
@appendix GNU Free Documentation License
|
|
|
|
@include fdl.texi
|
|
|
|
@node Index of Command Line Options
|
|
@appendix Index of Command Line Options
|
|
|
|
This appendix contains an index of all @GNUTAR{} long command line
|
|
options. The options are listed without the preceding double-dash.
|
|
For a cross-reference of short command line options, see
|
|
@ref{Short Option Summary}.
|
|
|
|
@printindex op
|
|
|
|
@node Index
|
|
@appendix Index
|
|
|
|
@printindex cp
|
|
|
|
@summarycontents
|
|
@contents
|
|
@bye
|
|
|
|
@c Local variables:
|
|
@c texinfo-column-for-description: 32
|
|
@c End:
|