pax is an archiving utility available for various operating systems and defined since 1995. Rather than sort out the incompatible options that have crept up between
cpio, along with their implementations across various versions of Unix, the IEEE designed a new archive utility that could support various archive formats with useful options from both archivers. The
pax command is available on Unix and Unix-like operating systems and on IBM i, Microsoft Windows NT, and Windows 2000.
IEEE, in 2001, defined a new pax format which is basically tar with additional extended attributes.
The name "pax" is an acronym for portable archive exchange. The command invocation and structure is somewhat a unification of both
A version of the pax program was created by Keith Muller in 1992–1993. The version first appeared in 4.4BSD (1995). Pax was accepted into X/Open issue 4 (Single Unix Specification version 1) in 1995. These versions of pax only defined the command-line interface as a tar/cpio hybrid, but the pax file format was not yet defined. (The work on defining Pax likely precedes Muller's work; it appears to be in the early POSIX.2 and IEEE 1003.1b drafts circa 1991.)
In 1997, Sun Microsystems proposed a method for adding extensions to the ustar format. This method was later accepted for the POSIX.1-2001 standard, as the new pax file format. The POSIX specification for the pax utility was updated to include this format.
pax has four general modes that are invoked by a combination of the -r ("read") and -w ("write") options.
This table summarizes the modal behaviour:
|(none)||"list"||shows contents of archive, does not modify or extract anything.|
|-r||"read"||reads and extracts contents of an archive|
|-w||"write"||creates archives or appends files to an archive|
|-rw||"copy"||reads and copies files and directory tree to a specified directory|
This model is similar to cpio, which has a similar set of basic operations.
List contents of an archive:
$ pax < archive.tar
Extract contents of an archive into the current directory:
$ pax -r < archive.tar
Create an archive of the current directory:
$ printf '.' | pax -w > archive.tar $ pax -w . > archive.tar
Copy current directory tree to another location:
$ printf '.' | pax -w > archive.tar $ pax -rw target_dir .
(The target directory must exist beforehand!)
By default, it uses the standard input/output for archive and listing operations, but this can be overwridden with the "tar-style" option
-f that specifies the archive file. Pax differs from cpio by recursively considering the content of a directory; to disable this behavior, POSIX pax has an option
-d to disable it.
The pax command is a mish-mash of cpio and tar features. Like tar, pax processes directory entries recursively, a feature that can be disabled with
-d for cpio-style behavior. The handling of file input/outputs is also a mix: when a list of file names is specified on the command line, they are taken as shell globs for file input or listing (tar-like); otherwise pax takes the cpio-style behavior of using the standard input for a file list. Finally, pax supports reading/writing to a named archive file using tar's
-f FILE option.
For example, if one desires a cpio-style archiving of the current directory, pax can be used with find just like one does using cpio:
$ find . -depth -print | pax -wd > archive.tar
(This construct is pointless without any filters for find, as it becomes identical to the above example.)
The command for extracting the contents for an archive is the same as cpio:
$ pax -r < archive.tar
It is possible to invoke these commands in a
tar-like syntax as well:
$ pax -wf archive.tar . # write (archive) $ pax -rf archive.tar # read (extract) $ pax -f archive.tar # list $ pax -rw . archive_dir # copy
Most implementations of pax use the -z (gzip) and -j (bzip2) switches for compression; this feature however, is not specified by POSIX. It is important to note that pax cannot append to compressed archives.
Example for extracting a gzipped archive:
$ pax -rzf archive.tar.gz
As in tar and cpio, pax output can be piped to another compressor/decompressor program. As an example xz is used here:
$ pax -w . | xz > archive.tar.xz
and listing an xz-compressed archive as the input:
$ xzcat archive.tar.xz | pax
Almost all extant versions of pax stemmed from the original 4.4BSD implementation. Most of them inherits the formats supported by that version, selectable via the -x option:
- cpio – The extended cpio interchange format specified in the IEEE Std 1003.2 ("POSIX.2") standard.
- bcpio – The old binary cpio format.
- sv4cpio – The System V release 4 cpio.
- sv4crc – The System V release 4 cpio with file crc checksums.
- tar – The old BSD tar format as found in BSD4.3.
- ustar (default) – The tar interchange format specified in the IEEE Std 1003.2 ("POSIX.2") standard.
Notably, the support for the 2001 pax format is not supported by this legacy pax. This is the case on most Linux distributions (which uses the MirBSD branch pf MirCPIO-paxmirabilis) and on FreeBSD.
pax supports archiving on multiple volumes. When the end of a volume is reached, the following message appears:
$ pax -wf /dev/fd0 . ATTENTION! pax archive volume change required. /dev/fd0 ready for archive volume: 2 Load the NEXT STORAGE MEDIA (if required) and make sure it is WRITE ENABLED. Type "y" to continue, "." to quit pax, or "s" to switch to new device. If you cannot change storage media, type "s" Is the device ready and online? >
When restoring an archive from multiple media, pax asks for the next media in the same fashion, when the end of the media is reached before the end of the archive.
Standardization, reception and popularity
Despite being standardized in 2001 by IEEE, as of 2010, pax enjoys relatively little popularity or adoption. This is in part because there was not any need for it from the Unix users; it was just the POSIX committee that wants to have a more consistent interface. Pax is also fairly chatty and expects user interactions when things go wrong.
pax is required to be present in all conformant systems by Linux Standard Base since version 3.0 (released on July 6, 2005), but so far few Linux distributions ship and install it by default. However, most distributions include pax as a separately installable package.
pax has also been present in Windows NT, where it is limited to file archives (tapes not supported). It was later moved to the Interix subsystem. It does not support archiving or restoring Win32 ACLs.
- The Open Group Base Specifications Issue 6 - POSIX.1-2001 (IEEE Std 1003.1) Copyright © 2001-2004 The IEEE and The Open Group
- IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.
- Eric Pearce (1997). Windows NT in a nutshell: a desktop quick reference for system administrators. O'Reilly Media, Inc. p. 271. ISBN 978-1-56592-251-8.
- "GNU tar 1.30: 8.1 Using Less Space through Compression". www.gnu.org. Retrieved 22 April 2018.
- FreeBSD General Commands Manual –
- "MirCPIO — paxmirabilis: tar and even ar!". MirBSD. Retrieved 24 January 2020.
- "MirCPIO in Launchpad". launchpad.net. Retrieved 22 April 2018.
- "Bug #456405 "pax lack of support for "pax" format fails LSB" : Bugs : MirCPIO". bugs.launchpad.net. Retrieved 22 April 2018.
- "pax.1". heirloom.sourceforge.net. Retrieved 22 April 2018.
- Release notes for LSB 3.0 Archived 2011-07-17 at the Wayback Machine note that pax was added: LSB 3.0. Commands and Utilities requires pax, but LSB 2.1.0. Commands and Utilities does not require it
- "Extracting files from a pax.gz package". cocoabuilder.com. Archived from the original on 14 February 2015. Retrieved 15 August 2013.