@subsection Creating and Reading Compressed Archives
@cindex Compressed archives
@cindex Storing archives in compressed format
-@UNREVISED
+
+@GNUTAR{} is able to create and read compressed archives. It supports
+@command{gzip} and @command{bzip2} compression programms. For backward
+compatibilty, it also supports @command{compress} command, although
+we strongly recommend against using it, since there is a patent
+covering the algorithm it uses and you could be sued for patent
+infringement merely by running @command{compress}! Besides, it is less
+effective than @command{gzip} and @command{bzip2}.
+
+Creating a compressed archive is simple: you just specify a
+@dfn{compression option} along with the usual archive creation
+commands. The compression option is @option{-z} (@option{--gzip}) to
+create a @command{gzip} compressed archive, @option{-j}
+(@option{--bzip2}) to create a @command{bzip2} compressed archive, and
+@option{-Z} (@option{--compress}) to use @command{compress} program.
+For example:
+
+@smallexample
+$ @kbd{tar cfz archive.tar.gz .}
+@end smallexample
+
+Reading compressed archive is even simpler: you don't need to specify
+any additional options as @GNUTAR{} recognizes its format
+automatically. Thus, the following commands will list and extract the
+archive created in previous example:
+
+@smallexample
+# List the compressed archive
+$ @kbd{tar tf archive.tar.gz}
+# Extract the compressed archive
+$ @kbd{tar xf archive.tar.gz}
+@end smallexample
+
+The only case when you have to specify a decompression option while
+reading the archive is when reading from a pipe or from a tape drive
+that does not support random access. However, in this case @GNUTAR{}
+will indicate which option you should use. For example:
+
+@smallexample
+$ @kbd{cat archive.tar.gz | tar tf -}
+tar: Archive is compressed. Use -z option
+tar: Error is not recoverable: exiting now
+@end smallexample
+
+If you see such diagnostics, just add the suggested option to the
+invocation of @GNUTAR{}:
+
+@smallexample
+$ @kbd{cat archive.tar.gz | tar tfz -}
+@end smallexample
+
+Notice also, that there are several restrictions on operations on
+compressed archives. First of all, compressed archives cannot be
+modified, i.e. you cannot update (@value{op-update}) them or delete
+(@value{op-delete}) members from them. Likewise, you cannot append
+another @command{tar} archive to a compressed archive using
+@value{op-append}). Secondly, multi-volume archives cannot be
+compressed.
+
+The following table summarizes compression options used by @GNUTAR{}.
@table @kbd
@item -z
@itemx --gzip
@itemx --ungzip
Filter the archive through @command{gzip}.
-@end table
-
-@FIXME{ach; these two bits orig from "compare" (?). where to put?} Some
-format parameters must be taken into consideration when modifying an
-archive.@FIXME{???} Compressed archives cannot be modified.
You can use @samp{--gzip} and @samp{--gunzip} on physical devices
(tape drives, etc.) and remote files as well as on normal files; data
to or from such devices or remote files is reblocked by another copy
of the @command{tar} program to enforce the specified (or default) record
size. The default compression parameters are used; if you need to
-override them, avoid the @value{op-gzip} option and run @command{gzip}
-explicitly. (Or set the @env{GZIP} environment variable.)
-
-The @value{op-gzip} option does not work with the @value{op-multi-volume}
-option, or with the @value{op-update}, @value{op-append},
-@value{op-concatenate}, or @value{op-delete} operations.
-
-It is not exact to say that @GNUTAR{} is to work in concert
-with @command{gzip} in a way similar to @command{zip}, say. Surely, it is
-possible that @command{tar} and @command{gzip} be done with a single call,
-like in:
-
-@smallexample
-$ @kbd{tar cfz archive.tar.gz subdir}
-@end smallexample
-
-@noindent
-to save all of @samp{subdir} into a @code{gzip}'ed archive. Later you
-can do:
+override them, set @env{GZIP} environment variable, e.g.:
@smallexample
-$ @kbd{tar xfz archive.tar.gz}
+$ @kbd{GZIP=--best tar cfz archive.tar.gz subdir}
@end smallexample
@noindent
-to explode and unpack.
-
-The difference is that the whole archive is compressed. With
-@command{zip}, archive members are archived individually. @command{tar}'s
-method yields better compression. On the other hand, one can view the
-contents of a @command{zip} archive without having to decompress it. As
-for the @command{tar} and @command{gzip} tandem, you need to decompress the
-archive to see its contents. However, this may be done without needing
-disk space, by using pipes internally:
+Another way would be to avoid the @value{op-gzip} option and run
+@command{gzip} explicitly:
@smallexample
-$ @kbd{tar tfz archive.tar.gz}
+$ @kbd{tar cf - subdir | gzip --best -c - > archive.tar.gz}
@end smallexample
@cindex corrupted archives
lose some compressibility. But this would have make recovering easier.
So, there are pros and cons. We'll see!
-@table @kbd
@item -j
@itemx --bzip2
Filter the archive through @code{bzip2}. Otherwise like @value{op-gzip}.
Filter the archive through @command{compress}. Otherwise like
@value{op-gzip}.
-@item --use-compress-program=@var{prog}
-Filter through @var{prog} (must accept @samp{-d}).
-@end table
-
-@value{op-compress} stores an archive in compressed format. This
-option is useful in saving time over networks and space in pipes, and
-when storage space is at a premium. @value{op-compress} causes
-@command{tar} to compress when writing the archive, or to uncompress when
-reading the archive.
-
-To perform compression and uncompression on the archive, @command{tar}
-runs the @command{compress} utility. @command{tar} uses the default
-compression parameters; if you need to override them, avoid the
-@value{op-compress} option and run the @command{compress} utility
-explicitly. It is useful to be able to call the @command{compress}
-utility from within @command{tar} because the @command{compress} utility by
-itself cannot access remote tape drives.
-
-The @value{op-compress} option will not work in conjunction with the
-@value{op-multi-volume} option or the @value{op-append}, @value{op-update}
-and @value{op-delete} operations. @xref{Operations}, for
-more information on these operations.
+The @acronym{GNU} Project recommends you not use
+@command{compress}, because there is a patent covering the algorithm it
+uses. You could be sued for patent infringement merely by running
+@command{compress}.
-If there is no compress utility available, @command{tar} will report an error.
-@strong{Please note} that the @command{compress} program may be covered by
-a patent, and therefore we recommend you stop using it.
+@item --use-compress-program=@var{prog}
+Use external compression program @var{prog}. Use this option if you
+have a compression program that @GNUTAR{} does not support. There
+are two requirements to which @var{prog} should comply:
-@value{op-bzip2} acts like @value{op-compress}, except that it uses
-the @code{bzip2} utility.
+First, when called without options, it should read data from standard
+input, compress it and output it on standard output.
-@table @kbd
-@item --compress
-@itemx --uncompress
-@itemx -z
-@itemx -Z
-When this option is specified, @command{tar} will compress (when
-writing an archive), or uncompress (when reading an archive). Used in
-conjunction with the @value{op-create}, @value{op-extract},
-@value{op-list} and @value{op-compare} operations.
+Secondly, if called with @option{-d} argument, it should do exactly
+the opposite, i.e. read the compressed data from the standard input
+and produce uncompressed data on the standard output.
@end table
-You can have archives be compressed by using the @value{op-gzip} option.
-This will arrange for @command{tar} to use the @command{gzip} program to be
-used to compress or uncompress the archive wren writing or reading it.
-
-To use the older, obsolete, @command{compress} program, use the
-@value{op-compress} option. The @acronym{GNU} Project recommends you not use
-@command{compress}, because there is a patent covering the algorithm it
-uses. You could be sued for patent infringement merely by running
-@command{compress}.
-
@FIXME{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 @value{op-gzip}, but I'd also like
the output to be fed through a program like @acronym{GNU}