> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/pax.1.md).

# pax(1)

`pax` — 读写文件归档并复制目录层级

## 名称

`pax`

## 概要

`pax [-cdnvzO] [-f archive] [-s replstr] ... [-U user] ... [-G group] ... [-T [from_date][,to_date]] ... [pattern ...]`

`pax -r [-cdiknuvzDOYZ] [-f archive] [-o options] ... [-p string] ... [-s replstr] ... [-E limit] [-U user] ... [-G group] ... [-T [from_date][,to_date]] ... [pattern ...]`

`pax -w [-dituvzHLOPX] [-b blocksize] [[-a] [-f archive]] [-x format] [-s replstr] ... [-o options] ... [-U user] ... [-G group] ... [-B bytes] [-T [from_date][,to_date][/[c][m]]] ... [file]`

`pax -r -w [-diklntuvDHLOPXYZ] [-p string] ... [-s replstr] ... [-U user] ... [-G group] ... [-T [from_date][,to_date][/[c][m]]] ... [file] directory`

## 描述

`pax` 实用程序可读取、写入和列出归档文件中的成员，并可复制目录层级。这些操作与具体的归档格式无关，并支持多种不同的归档格式。受支持的归档格式列表参见 `-x` 选项的说明。

`-r` 和 `-w` 选项的出现决定了 `pax` 将在以下功能模式中的哪一种下运行：*list*（列出）、*read*（读取）、*write*（写入）和 *copy*（复制）。

**<无>** *List*（列出）。将来自 `standard input`（标准输入）的归档文件中、路径名与指定 `patterns`（模式）匹配的成员目录表写入 `standard output`（标准输出）。该目录表每行一个文件名，使用单行缓冲写入。

**`-r`** *Read*（读取）。从 `standard input`（标准输入）读取归档文件，提取其中路径名与指定 `patterns` 匹配的成员。归档格式与分块方式在输入时自动判定。当被提取的文件是目录时，以该目录为根的整个文件层级都会被提取。所有提取的文件都相对于当前文件层级创建。提取文件的所有权、访问时间和修改时间以及文件模式的设置在 `-p` 选项中有更详细的说明。

**`-w`** *Write*（写入）。使用指定的归档格式，将包含 `file` 操作数的归档写入 `standard output`（标准输出）。未指定 `file` 操作数时，从 `standard input`（标准输入）读取一份每行一个待复制文件的列表。当 `file` 操作数也是目录时，以该目录为根的整个文件层级都会被包含在内。

**`-r`** `-w` *Copy*（复制）。将 `file` 操作数复制到目标 `directory`。未指定 `file` 操作数时，从 `standard input`（标准输入）读取一份每行一个待复制文件的列表。当 `file` 操作数也是目录时，以该目录为根的整个文件层级都会被包含在内。*copy*（复制）的效果等同于先将被复制的文件写入归档文件再随后提取，但原始文件与被复制文件之间可能存在硬链接（参见下文的 `-l` 选项）。\*警告：\*目标 `directory` 不得是 `file` 操作数之一，也不得是以某个 `file` 操作数为根的文件层级的成员。在这些条件下进行 *copy*（复制）的结果不可预测。

在 *read*（读取）或 *list*（列出）操作期间处理损坏的归档时，`pax` 会尝试从介质缺陷中恢复，并搜索归档以定位并处理尽可能多的归档成员（关于错误处理的更多细节参见 `-E` 选项）。

## 操作数

`directory` 操作数指定一个目标目录路径名。如果 `directory` 操作数不存在，或用户对其无写权限，或其类型不是目录，`pax` 将以非零退出状态退出。

`pattern` 操作数用于选择一个或多个归档成员的路径名。归档成员使用 fnmatch(3) 所描述的模式匹配表示法进行选择。未提供 `pattern` 操作数时，归档中的所有成员都会被选中。当 `pattern` 匹配到某个目录时，以该目录为根的整个文件层级都会被选中。当某个 `pattern` 操作数未选中至少一个归档成员时，`pax` 会将该 `pattern` 操作数以诊断消息的形式写入 `standard error`（标准错误），然后以非零退出状态退出。

`file` 操作数指定要复制或归档的文件路径名。当某个 `file` 操作数未选中至少一个归档成员时，`pax` 会将该 `file` 操作数路径名以诊断消息的形式写入 `standard error`（标准错误），然后以非零退出状态退出。

## 选项

支持以下选项：

**`-r`** 从 `standard input`（标准输入）读取归档文件并提取指定的 `files`。如果提取某个归档成员需要任何中间目录，这些目录将按调用 mkdir(2) 的方式创建，模式参数为 `S_IRWXU`、`S_IRWXG` 和 `S_IRWXO` 的按位或（inclusive `OR`）。当所选归档格式支持链接文件的说明，而在提取归档时无法链接这些文件，`pax` 会向 `standard error`（标准错误）写入一条诊断消息，并在操作完成时以非零退出状态退出。

**`-w`** 以指定的归档格式将文件写入 `standard output`（标准输出）。未指定 `file` 操作数时，从 `standard input`（标准输入）读取路径名列表，每行一个，不含任何前导或尾随 （空白符）。

**`-a`** 将 `files` 追加到先前已写入的归档末尾。如果未通过 `-x` 选项指定归档格式，则使用该归档当前正在使用的格式。任何试图以与归档中已有格式不同的格式追加内容的尝试，都会使 `pax` 立即以非零退出状态退出。在写入起始处的归档卷所使用的分块大小将在该归档卷的剩余部分继续使用。\*警告：\*许多存储设备无法支持执行追加操作所需的操作。试图向此类设备上存储的归档追加内容可能损坏归档或产生其他不可预测的后果。磁带机尤其可能不支持追加操作。存储于普通文件系统文件或磁盘设备上的归档通常支持追加操作。

**`-b`** `blocksize` 当*写入*归档时，按每次写入归档文件的正十进制整数字节数对输出进行分块。`blocksize` 必须是 512 字节的倍数，最大为 64512 字节。大于 32256 字节的 `blocksize` 违反 POSIX 标准，无法在所有系统间移植。`blocksize` 可以 `k` 或 `b` 结尾，分别表示乘以 1024（1K）或 512。一对 `blocksizes` 可以用 `x` 分隔以表示乘积。特定的归档设备可能对其支持的分块大小施加额外限制。未指定分块时，默认 `blocksize` 取决于所使用的具体归档格式（参见 `-x` 选项）。

**`-c`** 匹配所有由 `pattern` 和 `file` 操作数指定之外的文件或归档成员。

**`-d`** 使正在被复制或归档的目录类型文件，或正在被提取的目录类型归档成员，仅匹配该目录文件或归档成员本身，而不匹配以该目录为根的文件层级。

**`-f`** `archive` 将 `archive` 指定为输入或输出归档的路径名，覆盖默认的 `standard input`（标准输入，用于 *list* 和 *read*）或 `standard output`（标准输出，用于 *write*）。单个归档可跨越多个文件和不同的归档设备。需要时，`pax` 会提示输入归档中下一卷的文件或设备路径名。

**`-i`** 交互式地重命名文件或归档成员。对于每个匹配 `pattern` 操作数的归档成员或每个匹配 `file` 操作数的文件，`pax` 会向 **`/dev/tty`** 提示，给出文件名、文件模式及其修改时间。然后 `pax` 实用程序从 **`/dev/tty`** 读取一行。如果该行为空，跳过该文件或归档成员。如果该行仅含一个句点，按原名处理该文件或归档成员。否则，将其名称替换为该行内容。如果在读取响应时遇到 `<EOF>`，或无法打开 **`/dev/tty`** 进行读写，`pax` 实用程序会立即以非零退出状态退出。

**`-k`** 不覆盖已存在的文件。

**`-l`** 链接文件。（字母 ell。）在 *copy*（复制）模式（`-r -w`）下，尽可能在源和目标文件层级之间建立硬链接。

**`-n`** 选择匹配每个 `pattern` 操作数的第一个归档成员。每个 `pattern` 最多匹配一个归档成员。当匹配到目录类型的成员时，以该目录为根的文件层级也会被匹配（除非同时指定了 `-d`）。

**`-o`** `options` 用于修改提取或写入归档文件算法的信息，特定于由 `-x` 指定的归档格式。通常，`options` 形式为：`name=value`

**`-p`** `string` 指定一个或多个文件特征选项（特权）。`string` 选项参数是一个字符串，指定提取时要保留或丢弃的文件特征。该字符串由说明字符 `a`、`e`、`m`、`o` 和 `p` 组成。多个特征可在同一字符串中串接，也可指定多个 `-p` 选项。各说明字符的含义如下：

**`a`** 不保留文件访问时间。默认情况下，尽可能保留文件访问时间。

**`e`** “保留一切”，即用户 ID、组 ID、文件模式位、文件访问时间和文件修改时间。此选项旨在供 *root*（拥有全部适当特权者）使用，以保留文件在归档中记录时的所有方面。`e` 标志是 `o` 和 `p` 标志之和。

**`m`** 不保留文件修改时间。默认情况下，尽可能保留文件修改时间。

**`o`** 保留用户 ID 和组 ID。

**`p`** “保留”文件模式位。此选项旨在供具有常规特权的 *user*（用户）使用，希望保留除所有权之外文件的所有方面。默认情况下保留文件时间，但提供了另外两个标志来禁用此行为并改用提取时间。

在前述列表中，“保留”表示归档中存储的属性在调用进程权限允许的情况下赋予被提取的文件。否则，被提取文件的属性作为正常文件创建操作的一部分来确定。如果既未指定 `e` 也未指定 `o` 说明字符，或因任何原因未保留用户 ID 和组 ID，`pax` 不会设置文件模式的 `S_ISUID`（*setuid*）和 `S_ISGID`（*setgid*）位。如果因任何原因上述任何一项保留失败，`pax` 会向 `standard error`（标准错误）写入诊断消息。这些项保留失败会影响最终退出状态，但不会导致被提取的文件被删除。如果任何 string 选项参数中的文件特征字母重复或互相冲突，最后给出的优先。例如，若指定：

```
-p eme
```

文件修改时间仍然会被保留。

`pax` 不理解由 chflags(1) 设置的文件标志，但 [tar(1)](/man1/bsdtar.1.md) 和 dump(8) 会保留这些标志。

**`-s`** `replstr` 按照 ed(1) 实用程序正则表达式的语法，根据替换表达式 `replstr` 修改由 `pattern` 或 `file` 操作数指定的文件或归档成员名称。这些正则表达式的格式为：

```
/old/new/[gp]
```

与 ed(1) 中相同，`old` 是基本正则表达式，`new` 可以包含与号（&）、\n（其中 n 为数字）反向引用或子表达式匹配。`old` 字符串还可包含 `<newline>`（换行符）字符。任何非空字符都可用作分隔符（此处展示的是 `/`）。可以指定多个 `-s` 表达式。表达式按其在命令行中指定的顺序应用，直至首次成功替换为止。可选的尾随 `g` 会继续将替换表达式应用于从上次成功替换结束之后第一个字符开始的路径名子串。首次不成功的替换会终止 `g` 选项的操作。可选的尾随 `p` 会使成功替换的最终结果按以下格式写入 `standard error`（标准错误）：

```
<original pathname> >> <new pathname>
```

替换为空字符串的文件或归档成员名称不会被选中，将被跳过。

**`-t`** 将 `pax` 读取或访问过的任何文件或目录的访问时间重置为 `pax` 读取或访问之前的状态。

**`-u`** 忽略比同名既有文件或归档成员更旧（文件修改时间更早）的文件。在 *read*（读取）期间，若归档成员与文件系统中的某个文件同名，且归档成员较新，则会被提取。在 *write*（写入）期间，若文件系统成员与某个归档成员同名，且较该归档成员新，则会被写入归档。在 *copy*（复制）期间，若源层级中的文件较新，目标层级中的文件会被源层级中的文件或指向源层级中该文件的链接所替换。

**`-v`** 在 *list*（列出）操作期间，使用 [ls(1)](/man1/ls.1.md) 实用程序带 `-l` 选项时的格式生成详细目录表。对于表示指向归档中先前成员的硬链接的路径名，输出格式为：

```
<ls -l listing> == <link name>
```

对于表示符号链接的路径名，输出格式为：

```
<ls -l listing> => <link name>
```

其中 \<ls -l listing> 是 [ls(1)](/man1/ls.1.md) 实用程序使用 `-l` 选项时指定的输出格式。否则，对于所有其他操作模式（*read*、*write* 和 *copy*），路径名在该文件或归档成员开始处理时即写入并刷新到 `standard error`（标准错误），不含尾随的 `<newline>`（换行符）。尾随的 `<newline>` 不被缓冲，仅在文件读取或写入完成后才写入。

**`-x`** `format` 指定输出归档格式，默认格式为 `ustar`。`pax` 实用程序目前支持以下格式：

**`cpio`** IEEE Std 1003.2 ("POSIX.2") 标准中规定的扩展 cpio 交换格式。此格式的默认分块大小为 5120 字节。可能被此格式截断的文件 inode 和设备信息（此格式用于检测文件硬链接）会被 `pax` 检测并修复。

**`bcpio`** 旧的二进制 cpio 格式。此格式的默认分块大小为 5120 字节。此格式不太可移植，当其他格式可用时不应使用。可能被此格式截断的文件 inode 和设备信息（此格式用于检测文件硬链接）会被 `pax` 检测并修复。

**`sv4cpio`** System V release 4 cpio。此格式的默认分块大小为 5120 字节。可能被此格式截断的文件 inode 和设备信息（此格式用于检测文件硬链接）会被 `pax` 检测并修复。

**`sv4crc`** 带文件 crc 校验和的 System V release 4 cpio。此格式的默认分块大小为 5120 字节。可能被此格式截断的文件 inode 和设备信息（此格式用于检测文件硬链接）会被 `pax` 检测并修复。

**`tar`** 4.3BSD 中的旧 BSD tar 格式。此格式的默认分块大小为 10240 字节。此格式存储的路径名长度不得超过 100 个字符。仅 *regular*（普通）文件、*hard links*（硬链接）、*soft links*（软链接）和 *directories*（目录）会被归档（不支持其他文件系统类型）。为了与更早的 tar 格式向后兼容，写入归档时可使用 `-o` 选项以省略目录的存储。此选项形式为：

```
-o write_opt=nodir
```

**`ustar`** IEEE Std 1003.2 ("POSIX.2") 标准中规定的扩展 tar 交换格式。此格式的默认分块大小为 10240 字节。此格式存储的路径名长度不得超过 255 个字符。目录部分最多 155 个字符，每个路径组件必须少于 100 个字符。

`pax` 实用程序会检测并报告任何因具体归档格式限制而无法存储或提取的文件。各归档格式可能对使用施加额外限制。典型的归档格式限制包括（但不限于）：文件路径名长度、文件大小、链接路径名长度以及文件类型。

**`-z`** 使用 [gzip(1)](/man1/gzip.1.md) 在写入（读取）时压缩（解压）归档。与 `-a` 不兼容。

**`-B`** `bytes` 将写入单个归档卷的字节数限制为 `bytes`。`bytes` 限制可以 `m`、`k` 或 `b` 结尾，分别表示乘以 1048576（1M）、1024（1K）或 512。一对 `bytes` 限制可以用 `x` 分隔以表示乘积。注意，指定的大小是针对未压缩的 pax 镜像本身的。如果同时使用 `-z` 选项，根据归档内容的可压缩性，所得文件可能包含更少的 `bytes`。如果需要可预测大小的压缩卷，参见 zip(1)（`ports/archivers/zip`）。\*警告：\*仅当向支持基于最后（或最大）写入偏移读取结束条件的设备（如普通文件或磁带机）写入归档时才使用此选项。不建议将此选项用于软盘或硬盘。

**`-D`** 此选项与 `-u` 选项相同，但检查文件 inode 更改时间而非文件修改时间。文件 inode 更改时间可用于选择 inode 信息（如 uid、gid 等）比目标 `directory` 中文件副本更新的文件。

**`-E`** `limit` 将尝试读取有缺陷归档时连续读故障的次数限制为 `limit`。`limit` 为正值时，`pax` 会尝试从归档读错误中恢复，并从归档中存储的下一个文件继续处理。`limit` 为 0 会使 `pax` 在归档卷上首次检测到读错误后停止操作。`limit` 为 `NONE` 会使 `pax` 永远尝试从读错误中恢复。默认 `limit` 为较小的正数次重试。\*警告：\*将此选项与 `NONE` 一起使用应极其谨慎，因为 `pax` 可能在严重损坏的归档上陷入无限循环。

**`-G`** `group` 根据 `group` 名称选择文件，或当以 `#` 开头时按数字 gid 选择。可用 `\` 转义 `#`。可提供多个 `-G` 选项，检查在首次匹配时停止。

**`-H`** 在执行物理文件系统遍历时，仅跟随命令行上的符号链接。

**`-L`** 跟随所有符号链接以执行逻辑文件系统遍历。

**`-O`** 强制归档为单卷。如果某卷提前结束，`pax` 不会提示输入新卷。此选项适用于无法由人工进行错误恢复的自动化任务。

**`-P`** 不跟随符号链接，执行物理文件系统遍历。这是默认模式。

**`-T`** `[from_date][,to_date][/[c][m]]` 允许根据文件修改或 inode 更改时间是否落在 `from_date` 至 `to_date` 的指定时间范围内（包含两端）来选择文件。如果仅提供 `from_date`，则选择所有修改或 inode 更改时间等于或晚于该时间的文件。如果仅提供 `to_date`，则选择所有修改或 inode 更改时间等于或早于该时间的文件。当 `from_date` 等于 `to_date` 时，仅选择修改或 inode 更改时间恰好为该时间的文件。

当 `pax` 处于 *write*（写入）或 *copy*（复制）模式时，可选的尾随字段 `[c][m]` 可用于确定比较时使用哪种文件时间（inode 更改、文件修改或两者）。如果两者都未指定，默认仅使用文件修改时间。`m` 指定比较文件修改时间（文件最后一次被写入的时间）。`c` 指定比较 inode 更改时间（文件 inode 最后一次被更改的时间；例如所有者、组、模式等的更改）。当 `c` 和 `m` 都指定时，修改时间和 inode 更改时间都会被比较。inode 更改时间比较在选择属性最近被更改的文件，或选择最近创建但其修改时间被重置为更早时间的文件（如从归档提取文件并保留修改时间时发生的情况）时很有用。当 `pax` 用于创建基于时间的增量归档（仅归档在指定时间范围内被更改的文件）时，使用两种文件时间进行比较很有用。

时间范围由六个不同的字段组成，每个字段必须包含两位数字。格式为：

```
[[[[[cc]yy]mm]dd]HH]MM[.SS]
```

其中 `cc` 是年份的前两位（世纪），`yy` 是年份的后两位，第一个 `mm` 是月份（01 到 12），`dd` 是日（01 到 31），`HH` 是小时（00 到 23），`MM` 是分钟（00 到 59），`SS` 是秒（00 到 59）。分钟字段 `MM` 是必需的，其他字段可选，且必须按以下顺序添加：`HH`、`dd`、`mm`、`yy`、`cc`。`ss` 字段可独立于其他字段添加。时间范围相对于当前时间，因此：

```
-T 1234/cm
```

会选择所有修改或 inode 更改时间为今天 12:34 PM 或更晚的文件。可以提供多个 `-T` 时间范围，检查在首次匹配时停止。

**`-U`** `user` 根据 `user` 名称选择文件，或当以 `#` 开头时按数字 uid 选择。可用 `\` 转义 `#`。可提供多个 `-U` 选项，检查在首次匹配时停止。

**`-X`** 在遍历某路径名指定的文件层级时，不进入具有不同设备 ID 的目录。关于设备 ID 的更多信息，参见 stat(2) 中描述的 `st_dev` 字段。

**`-Y`** 此选项与 `-D` 选项相同，但使用所有文件名修改完成之后所创建的路径名检查 inode 更改时间。

**`-Z`** 此选项与 `-u` 选项相同，但使用所有文件名修改完成之后所创建的路径名检查修改时间。

作用于文件或归档成员名称的选项（`-c`、`-i`、`-n`、`-s`、`-u`、`-v`、`-D`、`-G`、`-T`、`-U`、`-Y` 和 `-Z`）按如下方式交互。

在 *read*（读取）操作期间提取文件时，归档成员仅基于用户指定的 pattern 操作数（经 `-c`、`-n`、`-u`、`-D`、`-G`、`-T`、`-U` 选项修改）被“选中”。然后任何 `-s` 和 `-i` 选项将按此顺序修改这些被选中文件的名称。然后 `-Y` 和 `-Z` 选项基于最终路径名应用。最后 `-v` 选项会写入这些修改所产生的名称。

在 *write*（写入）操作期间归档文件，或 *copy*（复制）操作期间复制文件时，归档成员仅基于用户指定的路径名（经 `-n`、`-u`、`-D`、`-G`、`-T` 和 `-U` 选项修改）被“选中”（`-D` 选项仅在复制操作期间适用）。然后任何 `-s` 和 `-i` 选项将按此顺序修改这些被选中文件的名称。然后在 *copy*（复制）操作期间，`-Y` 和 `-Z` 选项基于最终路径名应用。最后 `-v` 选项会写入这些修改所产生的名称。

当 `-u` 或 `-D` 选项中的一个或两个与 `-n` 选项一起指定时，除非文件比其比较对象新，否则不视为被选中。

## 退出状态

`pax` 实用程序将以以下值之一退出：

**0** 所有文件处理成功。

**1** 发生错误。

## 实例

命令：

```sh
pax -w -f /dev/sa0 .
```

将当前目录的内容复制到设备 **`/dev/sa0`**。

命令：

```sh
pax -v -f filename
```

给出存储在 `filename` 中的归档的详细目录表。

以下命令：

```sh
mkdir /tmp/to
```

```sh
cd /tmp/from
```

```sh
pax -rw . /tmp/to
```

将整个 **`/tmp/from`** 目录层级复制到 **`/tmp/to`**。

命令：

```sh
pax -r -s ',^//*usr//*,,' -f a.pax
```

读取归档 `a.pax`，将所有根目录为 `/usr` 的文件提取到相对于当前目录的位置。

命令：

```sh
pax -rw -i . dest_dir
```

可用于交互式地选择要从当前目录复制到 `dest_dir` 的文件。

命令：

```sh
pax -r -pe -U root -G bin -f a.pax
```

将从归档 `a.pax` 中提取所有由 *root* 拥有、组为 *bin* 的文件，并保留所有文件权限。

命令：

```sh
pax -r -w -v -Y -Z home /backup
```

将仅更新（并列出）目标目录 **`/backup`** 中那些比源文件树 `home` 中同名文件更旧（inode 更改时间或文件修改时间更早）的文件。

## 诊断

当 `pax` 在读取归档时无法创建文件或链接，或在写入归档时无法找到文件，或指定了 `-p` 选项时无法保留用户 ID、组 ID 或文件模式，会向 `standard error`（标准错误）写入诊断消息并返回非零退出状态，但处理会继续。在 pax 无法创建到文件链接的情况下，`pax` 不会创建该文件的第二份副本。

如果从归档提取文件的过程被信号或错误提前终止，`pax` 可能仅部分提取了用户所需的文件。此外，被提取文件和目录的文件模式可能含有不正确的文件位，修改时间和访问时间也可能有误。

如果归档创建过程被信号或错误提前终止，`pax` 可能仅部分创建了归档，这可能违反特定归档格式规范。

如果在执行 *copy*（复制）时 `pax` 检测到某文件即将覆盖自身，该文件不会被复制，会向 `standard error`（标准错误）写入诊断消息，且 `pax` 完成时会以非零退出状态退出。

## 参见

cpio(1), [tar(1)](/man1/bsdtar.1.md)

## 标准

`pax` 实用程序是 IEEE Std 1003.2 ("POSIX.2") 标准的超集。选项 `-z`、`-B`、`-D`、`-E`、`-G`、`-H`、`-L`、`-O`、`-P`、`-T`、`-U`、`-Y`、`-Z`，归档格式 `bcpio`、`sv4cpio`、`sv4crc`、`tar`，以及 `list` 和 `read` 操作期间对有缺陷归档的处理，都是对 POSIX 标准的扩展。

## 历史

`pax` 实用程序出现于 4.4BSD。

## 作者

Keith Muller，加州大学圣迭戈分校

## 缺陷

`pax` 实用程序无法识别多字节字符。

由 chflags(1) 设置的文件标志不会被 `pax` 保留。chflags(1) 的 BUGS 章节列出了一份不了解标志的工具清单。
