Extract files from or list the contents of a tar archive.
untar(tarfile, files = NULL, list = FALSE, exdir = ".", compressed = NA, extras = NULL, verbose = FALSE, restore_times = TRUE, support_old_tars = Sys.getenv("R_SUPPORT_OLD_TARS", FALSE), tar = Sys.getenv("TAR"))
The pathname of the tar file: tilde expansion (see
path.expand) will be performed. Alternatively, a
connection that can be used for binary reads. For a
tarfile, and if a connection is to be used,
that should be created by
gzcon(.) which currently only works for
gzfile() works for all compressions available in
A character vector of recorded filepaths to be extracted: the default is to extract all files.
TRUE, list the files (the equivalent of
tar -tf). Otherwise extract the files (the equivalent of
The directory to extract files to (the equivalent of
tar -C). It will be created if necessary.
(Deprecated in favour of auto-detection, used only
for an external
tar command.) Logical or character
that form of compression (and may be abbreviated to the first
FALSE no known compression, and
NA (the default)
indicates that the type is to be inferred from the file header.
The external command may ignore the selected compression type but detect a type automagically.
NULL or a character string: further command-line
flags such as -p to be passed to an external
logical: if true echo the command used for an external
logical. If true (default) restore file modification times. If false, the equivalent of the -m flag. Times in tarballs are supposed to be in UTC, but tarballs have been submitted to CRAN with times in the future or far past: this argument allows such times to be discarded.
Note that file times in a tarball are stored with a resolution of 1 second, and can only be restored to the resolution supported by the file system (which on a FAT system is 2 seconds).
logical. If false (the default), the external
tar command is assumed to be able handle compressed
tarfiles and if
compressed does not specify it, to
automagically detect the type of compression. (The major
implementations have done so since 2009; for GNU
If true, the R code calls an appropriate decompressor and pipes
the output to
compressed = NA examining
the tarfile header to determine the type of compression.
character string: the path to the command to be used or
"internal". If the command itself contains spaces it needs
to be quoted -- but
tar can also contain flags separated from
the command by spaces.
list = TRUE, a character vector of (relative or absolute)
paths of files contained in the tar archive.
Otherwise the return code from
system with an external
This is either a wrapper for a
tar command or for an
internal implementation written in R. The latter is used if
tarfile is a connection or if the argument
"" (except on Windows, when
tar.exe is tried first).
Unless otherwise stated three types of compression of the tar file are
What options are supported will depend on the
implementation used: the
"internal" one is intended to provide
support for most in a platform-independent way.
tar versions support
compressed archives and since 1.15 are able to detect the type of
compression automatically: version 1.22 added support for
On a Unix-alike,
configure will set environment variable
TAR, preferring GNU tar if found.
%% bsdtar had it in FreeBSB 5.3 (2004)
macOS 10.6 and later (and FreeBSD and some
other OSes) have a
from the libarchive project which detects all three forms
of compression automagically (even if undocumented in macOS).
It is undocumented if NetBSD's
detect compression automagically: for versions before 8 the flag
xz compression was --xz not -J.
support_old_tars = TRUE is recommended (or use
bsdtar if installed).
tar does not detect compression
automagically. It has no support for
xz beyond reporting
that the file is
= TRUE is recommended.
tar does automagically
bzip2 compression (undocumented)
but has no support for
R_GZIPCMD gives the
command to decompress
gzip files, and
bzip2 files. (On Unix-alikes
these are set at installation if found.)
xz is used if
available: if not decompression is expected to fail.
verbose are only
used when an external
tar is used.
tar commands will detect some of
zstd compression in addition to
xz. (For some external
commands, compressed tarfiles can only be read if the appropriate
utility program is available.) For GNU
(de)compression programs can be specified by e.g.
= "-I lz4". For
bsdtar this could be
"--use-compress-program lz4". Most commands will detect (the
nowadays rarely seen)
.tar.Z archives compressed by
The internal implementation restores symbolic links as links on a
Unix-alike, and as file copies on Windows (which works only for
existing files, not for directories), and hard links as links. If the
linking operation fails (as it may on a FAT file system), a file copy
is tried. Since it uses
gzfile to read a file it can
handle files compressed by any of the methods that function can
handle: at least
xz compression, and some types of
compression. It does not guard against restoring absolute file paths,
tar implementations do. It will create the parent
directories for directories or files in the archive if necessary. It
handles the USTAR/POSIX, GNU and
pax ways of handling file
paths of more than 100 bytes, and the GNU way of handling link targets
of more than 100 bytes.
You may see warnings from the internal implementation such as
unsupported entry type 'x'
This often indicates an invalid archive: entry types
allowed as extensions, but other types are reserved. The only thing
you can do with such an archive is to find a
tar program that
handles it, and look carefully at the resulting files. There may also
be the warning
using pax extended headers
This indicates that additional information may have been discarded, such as ACLs, encodings ….
The former standards only supported ASCII filenames (indeed, only
alphanumeric plus period, underscore and hyphen).
no attempt to map filenames to those acceptable on the current system,
and treats the filenames in the archive as applicable without any
re-encoding in the current locale.
The internal implementation does not special-case ‘resource
forks’ in macOS: that system's
tar command does. This may
lead to unexpected files with names with prefix