= Tar = '''`tar(1)`''' is the '''t'''ape '''ar'''chive utility. It creates '''tarballs''' that may or may not be compressed and/or encrypted. There are multiple implementations: <> ---- == Installation == All [[Linux]] and [[BSD]] distributions will have `tar(1)` installed, though the implementation will differ. * '''GNU `tar(1)`''' (or '''`gtar(1)`'''), which is an extended implementation * [[BusyBox]] * '''`paxtar(1)`''' * '''`bsdtar(1)`''' (despite the name, [[BSD/FreeBSD|FreeBSD]] is the only BSD using it) * some distributions will offer `bsdtar(1)` with non-standard compilation features, such as `zstd(1)` support [[Linux/Arch|Arch Linux]] uses `bsdtar(1)`, but packages for all other `tar(1)` implementations are available. `gtar` and `bsdtar` packages are the most widely available. ---- == Syntax Across Implementations == POSIX `tar(1)` uses a '''bundled-argument''' format. All flags are bundled into the first argument. {{{ tar cvf output.tar input-file-list }}} It should be immediately evident that ''this is a strange syntax''. The '''Unix''' format bridged the gap between this a more ''normal'' syntax. {{{ tar -cvf output.tar input-file-list #or tar -c -v -f output.tar input-file-list }}} Each flag or cluster of flags is prefixed with `-`. If a flag that takes an argument is ''in'' a cluster, it ''must'' be at the end. Mandatory arguments can either be the following word (`-f output.tar`) or fused to the flag (`-foutput.tar`). A frequent tripping point: optional arguments ''must'' be fused to the flag (`-g/tmp/snar.db`). The '''GNU''' format extended this with much-beloved syntactic sugar: ''long options''. {{{ tar --create --verbose --file output.tar input-file-list }}} Additionally, mandatory options can now be any of: the following word (`--file output.tar`), fused to the flag (`--fileoutput.tar`), or joined to the flag by `=` (`--file=output.tar`). `bsdtar(1)` is compatible with all formats and brings additional features (automatic discovery of compression algorithms, handling of sparse files, etc.). Per the manual of `bsdtar(1)`: "For maximum portability, scripts that invoke tar should use the bundled-argument format above, should limit themselves to the c, t, and x modes, and the b, f, m, v, and w options." ---- == Usage == Create a tarball. {{{ tar --create --file archive.tar -- file1 file2 file3 }}} Create a `gzip(1)`-compressed tarball. {{{ tar --create --gzip --file archive.tar.gz -- file1 file2 file3 }}} Compression options: * `-z` and `--gzip` for `gzip(1)` * `-j` and `--bzip2` for `bzip2(1)` * `-J` and `--xz` for `xz(1)` * `--auto-compress` to determine compression algorithm from the file extension * ''this is a `bsdtar(1)` extension'' * `--zstd` for `zstd(1)` * ''this is a `bsdtar(1)` extension that is only available on some BSD and Linux distributions'' * `--lzip` for `lzip(1)`, `--lzma` for `lzma(1)`, `--lzop` for `lzop(1)`, and `-Z`/`--compress` for `compress(1)` * ''don't use these'' Create a `gzip(1)`-compressed, `gpg(1)`-encrypted tarball. {{{ tar --compress --gzip -- file1 file2 | gpg --symmetric --output archive.tar.gz.gpg }}} Extract the contents of a tarball. {{{ tar --extract --file archive.tar }}} Extract the contents of a `gzip(1)`-compressed tarball. {{{ tar --extract --gzip --file archive.tar.gz }}} Extract the contents of a `gzip(1)`-compressed, `gpg(1)`-encrypted tarball. {{{ gpg --decrypt archive.tar.gz.gpg | tar --extract --gzip }}} List the contents of a tarball. {{{ tar --list --file archive.tar }}} ---- == See also == [[https://man.archlinux.org/man/tar.1|tar(1)]] [[https://man.archlinux.org/man/bsdtar.1|bsdtar(1)]] ---- CategoryRicottone