| % File src/library/utils/man/tar.Rd |
| % Part of the R package, https://www.R-project.org |
| % Copyright 2009-2018 R Core Team |
| % Distributed under GPL 2 or later |
| |
| \name{tar} |
| \alias{tar} |
| \title{ |
| Create a Tar Archive |
| } |
| \description{ |
| Create a tar archive. |
| } |
| \usage{ |
| tar(tarfile, files = NULL, |
| compression = c("none", "gzip", "bzip2", "xz"), |
| compression_level = 6, tar = Sys.getenv("tar"), |
| extra_flags = "") |
| } |
| |
| \arguments{ |
| \item{tarfile}{The pathname of the tar file: tilde expansion (see |
| \code{\link{path.expand}}) will be performed. Alternatively, a |
| \link{connection} that can be used for binary writes.} |
| |
| \item{files}{A character vector of filepaths to be archived: |
| the default is to archive all files under the current directory.} |
| |
| \item{compression}{character string giving the type of compression to |
| be used (default none). Can be abbreviated.} |
| |
| \item{compression_level}{integer: the level of compression. Only used |
| for the internal method.} |
| |
| \item{tar}{character string: the path to the command to be used. If |
| the command itself contains spaces it needs to be quoted (e.g., by |
| \code{\link{shQuote}}) -- but argument \code{tar} may also contain |
| flags separated from the command by spaces.} |
| |
| \item{extra_flags}{Any extra flags for an external \command{tar}.} |
| } |
| |
| \details{ |
| This is either a wrapper for a \command{tar} command or uses an |
| internal implementation in \R. The latter is used if \code{tarfile} |
| is a connection or if the argument \code{tar} is \code{"internal"} or |
| \code{""} (the \sQuote{factory-fresh} default). Note that whereas |
| Unix-alike versions of \R set the environment variable \env{TAR}, its |
| value is not the default for this function. |
| |
| Argument \code{extra_flags} is passed to an external \command{tar} and |
| so is platform-dependent. Possibly useful values include \option{-h} |
| (follow symbolic links, also \option{-L} on some platforms), |
| \samp{--acls}, \option{--exclude-backups}, \option{--exclude-vcs} (and |
| similar) and on Windows \option{--force-local} (so drives can be |
| included in filepaths: however, this is the default for the |
| \command{Rtools} \command{tar}). For GNU \command{tar}, |
| \option{--format=ustar} forces a more portable format. (The default is |
| set at compilation and will be shown at the end of the output from |
| \command{tar --help}: for version 1.30 \sQuote{out-of-the-box} it is |
| \option{--format=gnu}, but the manual says the intention is to change |
| to \option{--format=posix} which is the same as \code{pax} -- |
| it was never part of the POSIX standard for \command{tar} and should |
| not be used.) |
| For libarchive's \command{bsdtar}, \option{--format=ustar} is more |
| portable than the default. |
| |
| %% This uses -T, not supported by Solaris nor Heirloom Toolchest. |
| One issue which can cause an external command to fail is a command |
| line too long for the system shell: as from \R 3.5.0 this is worked |
| around if the external command is detected to be GNU \command{tar} or |
| libarchive \command{tar} (aka \command{bsdtar}). |
| |
| Note that \code{files = '.'} will usually not work with an external |
| \command{tar} as that would expand the list of files after |
| \code{tarfile} is created. (It does work with the default internal |
| method.) |
| } |
| |
| \value{ |
| The return code from \code{\link{system}} or \code{0} for the internal |
| version, invisibly. |
| } |
| |
| \section{Portability}{ |
| The \sQuote{tar} format no longer has an agreed standard! |
| \sQuote{Unix Standard Tar} was part of POSIX 1003.1:1998 but has been |
| removed in favour of \command{pax}, and in any case many common |
| implementations diverged from the former standard. |
| |
| Many \R platforms use a version of GNU \command{tar} (including |
| \command{Rtools} on Windows), but the behaviour seems to be changed |
| with each version. macOS >= 10.6 and FreeBSD use \command{bsdtar} |
| from the libarchive project (but for macOS, a version from 2010), and |
| commercial Unixes will have their own versions. \command{bsdtar} is |
| available for many other platforms: macOS up to at least 10.9 had GNU |
| \command{tar} as \command{gnutar} and other platforms, |
| e.g.\sspace{}Solaris, have it as \command{gtar}: on a Unix-alike |
| \command{configure} will try \command{gnutar} and \command{gtar} |
| before \code{tar}. |
| |
| %% Heirloom Toolchest (http://heirloom.sourceforge.net/) is |
| %% another implementation available on NetBSD, but probably not the default. |
| |
| Known problems arise from |
| \itemize{ |
| \item The handling of file paths of more than 100 bytes. These were |
| unsupported in early versions of \command{tar}, and supported in one |
| way by POSIX \command{tar} and in another by GNU \command{tar} and |
| yet another by the POSIX \command{pax} command which |
| recent \command{tar} programs often support. The internal |
| implementation warns on paths of more than 100 bytes, |
| uses the \sQuote{ustar} way from the 1998 POSIX |
| standard which supports up to 256 bytes (depending on the path: in |
| particular the final component is limited to 100 bytes) if possible, |
| otherwise the GNU way (which is widely supported, including by |
| \code{\link{untar}}). |
| |
| Most formats do not record the encoding of file paths. |
| |
| \item (File) links. \command{tar} was developed on an OS that used |
| hard links, and physical files that were referred to more than once |
| in the list of files to be included were included only once, the |
| remaining instances being added as links. Later a means to include |
| symbolic links was added. The internal implementation supports |
| symbolic links (on OSes that support them), only. Of course, the |
| question arises as to how links should be unpacked on OSes that do |
| not support them: for regular files file copies can be used. |
| |
| Names of links in the \sQuote{ustar} format are restricted to 100 |
| bytes. There is an GNU extension for arbitrarily long link names, |
| but \command{bsdtar} ignores it. The internal method uses the |
| GNU extension, with a warning. |
| |
| \item Header fields, in particular the padding to be used when |
| fields are not full or not used. POSIX did define the correct |
| behaviour but commonly used implementations did (and still do) |
| not comply. |
| |
| \item File sizes. The \sQuote{ustar} format is restricted to 8GB |
| per (uncompressed) file. |
| } |
| For portability, avoid file paths of more than 100 bytes and all links |
| (especially hard links and symbolic links to directories). |
| |
| The internal implementation writes only the blocks of 512 bytes |
| required (including trailing blocks of nuls), unlike GNU \command{tar} |
| which by default pads with \samp{nul} to a multiple of 20 blocks |
| (10KB). Implementations which pad differ on whether the block padding |
| should occur before or after compression (or both): padding was |
| designed for improved performance on physical tape drives. |
| |
| The \sQuote{ustar} format records file modification times to a |
| resolution of 1 second: on file systems with higher resolution it is |
| conventional to discard fractional seconds. |
| } |
| |
| \section{Compression}{ |
| When an external \command{tar} command is used, compressing the tar |
| archive requires that \command{tar} supports the \option{-z}, |
| \option{-j} or \option{-J} flag, and may require the appropriate |
| command (\command{gzip}, \command{bzip2} or \command{xz}) to be |
| available. For GNU \command{tar}, further compression programs can be |
| specified by e.g.\sspace{}\code{extra_flags = "-I lz4"}. |
| Some versions of \command{bsdtar} accept options such as |
| \option{--lz4}, \option{--lzop} and \option{--lrzip} or an external |
| compressor \emph{via} \code{--use-compress-program lz4}: these could |
| be supplied in \code{extra_flags}. |
| |
| NetBSD prior to 8.0 used flag \option{--xz} rather than \option{-J}, |
| so this should be used \emph{via} \code{extra_flags = "--xz"} rather |
| than \code{compression = "xz"}. The commands from OpenBSD and the |
| Heirloom Toolchest are not documented to support \command{xz}. |
| |
| The \command{tar} programs in commercial Unixen such as AIX and |
| Solaris do not support compression. |
| } |
| |
| \note{ |
| For users of macOS (formerly OS X). Apple's HFS and HFS+ file systems |
| have a legacy concept of \sQuote{resource forks} dating from classic |
| Mac OS and rarely used nowadays. Apple's version of \command{tar} |
| stores these as separate files in the tarball with names prefixed by |
| \file{._}, and unpacks such files into resource forks (if possible): |
| other ways of unpacking (including \code{\link{untar}} in \R) unpack |
| them as separate files. |
| |
| When argument \code{tar} is set to the command \command{tar} on macOS, |
| environment variable \env{COPYFILE_DISABLE=1} is set, which for the |
| system version of \command{tar} prevents these separate files being |
| included in the tarball. |
| } |
| |
| \seealso{ |
| \url{https://en.wikipedia.org/wiki/Tar_(file_format)}, |
| \url{http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06} |
| for the way the POSIX utility \command{pax} handles \command{tar} formats. |
| |
| \url{https://github.com/libarchive/libarchive/wiki/FormatTar}. |
| |
| \code{\link{untar}}. |
| } |
| |
| \keyword{file} |
| \keyword{utilities} |