约 58606 字

约 293 分钟

#Bash 的 tar 命令

tar [OPTION...] [FILE]...
tar -c [-f ARCHIVE] [OPTION...] [FILE...]
tar -x [-f ARCHIVE] [OPTION...] [MEMBER...]
tar -t [-f ARCHIVE] [OPTION...] [MEMBER...]

功能

将多个文件打包成单个归档文件,或查看、提取、更新归档文件中的内容;可与 gzip、bzip2、xz、zstd 等压缩程序配合,实现归档文件的压缩和解压。

类型

可执行文件(/usr/bin/tar),属于 tar 软件包。

参数

  • OPTION 选项:
    • 操作模式(必须且只能指定一个):
      • -A, --catenate, --concatenate - 将一个或多个归档文件追加到另一个归档文件的末尾;不能用于压缩归档
      • -c, --create - 创建新的归档文件
      • -d, --diff, --compare - 比较归档文件与文件系统中的对应文件
      • --delete - 从归档文件中删除指定成员;不能用于压缩归档
      • -r, --append - 将文件追加到归档文件末尾
      • -t, --list - 列出归档文件的内容
      • --test-label - 测试归档文件的卷标
      • -u, --update - 仅追加比归档中对应副本更新的文件
      • -x, --extract, --get - 从归档文件中提取文件
      • --show-defaults - 显示内置默认值
      • -?, --help - 显示帮助
      • --usage - 显示可用选项列表
      • --version - 显示版本
    • 文件选择:
      • -f, --file=ARCHIVE - 指定归档文件或设备;- 表示标准输入/输出。省略时依次使用环境变量 TAPE 和编译时的默认值
      • -T, --files-from=FILE - 从 FILE 读取要处理的文件或成员名称,每行一个
      • --null - 与 -T 配合,使用空字符(\0)分隔名称,适合处理 find -print0 的输出
      • --verbatim-files-from - 将 -T 文件中的每一行都视为文件名,即使以 - 开头
      • --no-verbatim-files-from - 恢复默认行为,以 - 开头的名称按选项处理
      • -X, --exclude-from=FILE - 从 FILE 读取排除模式,每行一个
      • --exclude=PATTERN - 排除匹配 PATTERN 的文件
      • --exclude-backups - 排除备份文件和锁文件
      • --exclude-vcs - 排除版本控制系统的目录(如 .git、.svn)
      • --exclude-vcs-ignores - 根据 .gitignore、.cvsignore、.bzrignore、.hgignore 等文件排除
      • --exclude-caches - 排除包含 CACHEDIR.TAG 的目录内容,但保留标签文件
      • --exclude-caches-all - 排除包含 CACHEDIR.TAG 的目录及其标签文件
      • --exclude-caches-under - 排除包含 CACHEDIR.TAG 的目录中的所有内容
      • --exclude-tag=FILE - 排除包含 FILE 的目录内容,但保留 FILE
      • --exclude-tag-all=FILE - 排除包含 FILE 的目录
      • --exclude-tag-under=FILE - 排除包含 FILE 的目录中的所有内容
      • --no-recursion - 不自动递归目录
      • --recursion - 递归目录;默认
      • -P, --absolute-names - 保留文件名开头的 /,不删除绝对路径
      • --strip-components=NUMBER - 提取时去掉文件名前 NUMBER 层路径
      • --transform=EXPRESSION, --xform=EXPRESSION - 使用 sed 替换表达式转换文件名
      • --show-transformed-names, --show-stored-names - 显示转换后的文件名
      • --one-top-level[=DIR] - 将所有文件提取到 DIR;省略参数时使用归档文件名(去掉压缩后缀)作为目录
      • --add-file=FILE - 将 FILE 添加到归档,适用于以 - 开头的文件名
      • -K, --starting-file=MEMBER - 从归档中的指定成员开始处理
      • -N, --newer=DATE, --after-date=DATE - 仅处理比 DATE 新的文件
      • --newer-mtime=DATE - 仅处理数据修改时间比 DATE 新的文件
      • -h, --dereference - 跟随符号链接,归档其指向的文件
      • --hard-dereference - 跟随硬链接,归档其指向的文件
      • --one-file-system - 创建归档时停留在本地文件系统,不跨越挂载点
    • 文件名匹配(同时影响排除和包含模式):
      • --anchored - 模式从文件名开头匹配
      • --no-anchored - 模式在任意 / 之后匹配;排除模式默认
      • --ignore-case - 忽略大小写
      • --no-ignore-case - 区分大小写;默认
      • --wildcards - 使用通配符;排除模式默认
      • --no-wildcards - 按字面字符串匹配
      • --wildcards-match-slash - 通配符可以匹配 /;排除模式默认
      • --no-wildcards-match-slash - 通配符不匹配 /
    • 覆盖控制:
      • -k, --keep-old-files - 提取时不覆盖已存在的文件,并报错
      • --skip-old-files - 提取时不覆盖已存在的文件,静默跳过
      • --keep-newer-files - 不覆盖比归档副本更新的文件
      • --keep-directory-symlink - 提取时不替换指向目录的现有符号链接
      • --overwrite - 提取时覆盖已存在的文件
      • --overwrite-dir - 提取时覆盖已存在目录的元数据;默认
      • --no-overwrite-dir - 保留已存在目录的元数据
      • -U, --unlink-first - 提取前先删除同名文件
      • --recursive-unlink - 提取目录前递归删除目录中的所有文件
      • --remove-files - 将文件加入归档后从磁盘删除
    • 文件属性:
      • -p, --preserve-permissions, --same-permissions - 提取时恢复归档中记录的权限;root 默认
      • --same-owner - 提取时恢复归档中记录的所有者;root 默认
      • --no-same-owner - 以当前用户身份提取;普通用户默认
      • -m, --touch - 不恢复文件的修改时间
      • --numeric-owner - 始终使用数字 UID/GID
      • --owner=NAME[:UID] - 强制将新增文件的所有者设为 NAME
      • --owner-map=FILE - 从 FILE 读取所有者映射
      • --group=NAME[:GID] - 强制将新增文件的所属组设为 NAME
      • --group-map=FILE - 从 FILE 读取所属组映射
      • --mode=CHANGES - 强制将新增文件的权限设为 CHANGES
      • --mtime=DATE-OR-FILE - 设置新增文件的修改时间
      • --clamp-mtime - 仅当文件时间晚于 --mtime 指定值时修改
      • --atime-preserve[=METHOD] - 保留被归档文件的访问时间
      • --delay-directory-restore - 提取结束前不设置目录的修改时间和权限
      • --no-delay-directory-restore - 取消上一个选项的效果
      • --sort=ORDER - 创建归档时按 none、name 或 inode 排序
      • --acls / --no-acls - 启用/禁用 POSIX ACL 支持
      • --selinux / --no-selinux - 启用/禁用 SELinux 上下文支持
      • --xattrs / --no-xattrs - 启用/禁用扩展属性支持
      • --xattrs-include=PATTERN - 指定要包含的扩展属性键模式
      • --xattrs-exclude=PATTERN - 指定要排除的扩展属性键模式
    • 压缩:
      • -a, --auto-compress - 根据归档文件后缀自动选择压缩程序
      • --no-auto-compress - 不根据后缀选择压缩程序
      • -z, --gzip, --gunzip, --ungzip - 使用 gzip 压缩/解压
      • -j, --bzip2 - 使用 bzip2 压缩/解压
      • -J, --xz - 使用 xz 压缩/解压
      • --zstd - 使用 zstd 压缩/解压
      • -Z, --compress, --uncompress - 使用 compress 压缩/解压
      • --lzip - 使用 lzip 压缩/解压
      • --lzma - 使用 lzma 压缩/解压
      • --lzop - 使用 lzop 压缩/解压
      • -I, --use-compress-program=COMMAND - 使用指定的外部程序进行压缩/解压
    • 归档格式:
      • -H, --format=FORMAT - 指定归档格式:gnu、oldgnu、posix(pax)、ustar、v7
      • --old-archive, --portability - 等价于 --format=v7
      • --posix - 等价于 --format=posix
      • --pax-option=KEYWORD[[:]=VALUE]... - 创建 PAX 归档时控制 pax 关键字
      • -V, --label=TEXT - 创建带卷标 TEXT 的归档;列出/提取时按卷标匹配
    • 增量备份与稀疏文件:
      • -g, --listed-incremental=FILE - 创建新 GNU 格式增量备份,FILE 为快照文件
      • -G, --incremental - 创建旧 GNU 格式增量备份
      • --level=NUMBER - 设置增量备份级别;目前仅 0 有意义
      • --check-device - 创建增量备份时检查设备号;默认
      • --no-check-device - 创建增量备份时不检查设备号
      • -S, --sparse - 高效处理稀疏文件
      • --hole-detection=METHOD - 设置稀疏文件的空洞检测方法:seek 或 raw
      • --sparse-version=MAJOR[.MINOR] - 设置稀疏文件格式版本:0.0、0.1 或 1.0
    • 多卷与设备:
      • -M, --multi-volume - 创建/列出/提取多卷归档
      • -L, --tape-length=N - 写入 N×1024 字节后切换卷;隐含 -M
      • -F, --info-script=COMMAND, --new-volume-script=COMMAND - 每卷结束时运行命令;隐含 -M
      • --volno-file=FILE - 在 FILE 中记录多卷归档的当前卷号
      • --force-local - 即使归档名包含冒号也视为本地文件
      • --rmt-command=COMMAND - 指定远程访问时使用的 rmt 命令
      • --rsh-command=COMMAND - 指定远程访问时使用的 rsh 命令(通常设为 ssh)
      • -b, --blocking-factor=BLOCKS - 将记录大小设为 BLOCKS×512 字节
      • -B, --read-full-records - 读取不完整的输入记录
      • -i, --ignore-zeros - 忽略归档中的全零块
      • --record-size=NUMBER - 设置记录大小(字节,必须是 512 的倍数)
      • -n, --seek - 假定归档可随机访问
      • --no-seek - 假定归档不可随机访问
    • 信息输出:
      • -v, --verbose - 详细列出处理的文件;可重复使用以提高详细程度,最多 3 级
      • --totals[=SIGNAL] - 处理结束后输出总字节数
      • --checkpoint[=N] - 每处理 N 个记录显示一次进度;默认 10
      • --checkpoint-action=ACTION - 在每个检查点执行动作
      • --index-file=FILE - 将详细输出写入 FILE
      • -R, --block-number - 在每条消息中显示归档内的块号
      • --show-omitted-dirs - 列出不匹配搜索条件的目录
      • --full-time - 以完整精度显示文件时间
      • --utc - 以 UTC 显示文件修改时间
      • -l, --check-links - 并非所有硬链接都被归档时输出消息
      • --quoting-style=STYLE - 设置文件名引用风格
      • --quote-chars=STRING - 额外引用 STRING 中的字符
      • --no-quote-chars=STRING - 不引用 STRING 中的字符
      • --warning=KEYWORD - 启用或禁用指定警告;以 no- 开头表示禁用
    • 其它:
      • -C, --directory=DIR - 在执行操作前切换到目录 DIR;对后面的选项和参数生效
      • --occurrence[=N] - 仅处理每个文件在归档中的第 N 次出现
      • --restrict - 禁用部分可能有害的选项
      • --ignore-failed-read - 读取失败时不以非零状态退出
      • --backup[=CONTROL] - 删除/覆盖前备份文件
      • --suffix=STRING - 指定备份文件后缀;默认 ~
      • -w, --interactive, --confirmation - 对每个操作进行确认
      • -o - 创建时等价于 --old-archive,提取时等价于 --no-same-owner
  • FILE - 要归档或比较的文件或目录;具体含义取决于操作模式
  • MEMBER - 归档文件中的成员(文件或目录)名称;具体含义取决于操作模式

#示例

创建归档

$ tree demo
demo
├── a.txt
└── sub
    └── b.txt
$ tar -cvf demo.tar demo      # 将 demo 目录打包为 demo.tar
demo/
demo/a.txt
demo/sub/
demo/sub/b.txt

查看归档内容

$ tar -tf demo.tar             # 仅列出成员名称
demo/
demo/a.txt
demo/sub/
demo/sub/b.txt
$ tar -tvf demo.tar            # 显示权限、所有者、大小和时间
drwxr-xr-x user/user       0 2026-10-21 14:58 demo/
-rw-r--r-- user/user       6 2026-10-21 14:58 demo/a.txt
drwxr-xr-x user/user       0 2026-10-21 14:58 demo/sub/
-rw-r--r-- user/user       6 2026-10-21 14:58 demo/sub/b.txt

解压归档

$ mkdir out
$ tar -xvf demo.tar -C out     # 解压到 out 目录,并显示过程
demo/
demo/a.txt
demo/sub/
demo/sub/b.txt
$ tree out
out
└── demo
    ├── a.txt
    └── sub
        └── b.txt

只提取指定文件

$ tar -xf demo.tar -C out demo/a.txt     # 只提取 demo/a.txt
$ tar -xOf demo.tar demo/a.txt           # 将文件内容提取到标准输出
hello

压缩归档

$ tar -czf demo.tar.gz demo          # gzip
$ tar -cjf demo.tar.bz2 demo         # bzip2
$ tar -cJf demo.tar.xz demo          # xz
$ tar --zstd -cf demo.tar.zst demo   # zstd
$ tar -caf demo.tar.gz demo          # 根据后缀自动选择压缩程序
$ ls demo.tar*
demo.tar  demo.tar.bz2  demo.tar.gz  demo.tar.xz  demo.tar.zst

解压压缩归档

$ tar -xzf demo.tar.gz -C out       # gzip
$ tar -xjf demo.tar.bz2 -C out      # bzip2
$ tar -xJf demo.tar.xz -C out       # xz
$ tar --zstd -xf demo.tar.zst -C out  # zstd
$ tar -xaf demo.tar.gz -C out       # 自动识别压缩格式

查看压缩归档内容

$ tar -tzf demo.tar.gz
demo/
demo/a.txt
demo/sub/
demo/sub/b.txt

排除文件

$ tar -czf project.tar.gz --exclude='*.log' --exclude='node_modules' project
  • --exclude 的模式默认不锚定,可以匹配路径的任意部分
  • 需要从文件读取排除模式时,使用 -X, --exclude-from=FILE

从文件列表创建归档

$ find demo -type f > files.txt
$ tar -czf demo.tar.gz -T files.txt    # 从 files.txt 读取要归档的文件
  • -T 读取的名称默认按命令行参数处理,以 - 开头的名称会被当作选项
  • 文件名可能以 - 开头时,使用 --verbatim-files-from

追加与更新

$ tar -rvf demo.tar new.txt     # 将 new.txt 追加到归档末尾
$ tar -uvf demo.tar demo        # 仅追加比归档中副本更新的文件

比较归档与文件

$ tar -df demo.tar demo         # 无输出表示归档与文件系统内容一致
$ echo $?
0

增量备份

$ tar -czf backup-0.tar.gz -g backup.snar demo    # 0 级(完整)备份
$ echo 'new content' >> demo/a.txt                # 修改文件
$ tar -czf backup-1.tar.gz -g backup.snar demo    # 1 级(增量)备份
$ mkdir restore
$ tar -xzf backup-0.tar.gz -C restore -g /dev/null
$ tar -xzf backup-1.tar.gz -C restore -g /dev/null
  • backup.snar 是快照文件,用于记录上次备份的状态
  • 增量归档中仍会包含目录项,以及自上次备份以来发生变化的文件
  • 提取增量归档时需要按顺序提取,并用 -g /dev/null 满足语法要求

保留权限和所有者

$ sudo tar -xpvf demo.tar -C /restore      # 保留归档中记录的权限
$ sudo tar --same-owner -xvf demo.tar -C /restore   # 保留归档中记录的所有者
  • 普通用户提取时默认使用当前用户身份,只有 root 才会默认保留所有者

去掉路径前缀

$ mkdir out2
$ tar -xf demo.tar --strip-components=1 -C out2
$ tree out2
out2
├── a.txt
└── sub
    └── b.txt

通过管道传输

$ tar -czf - demo | ssh user@host 'cat > demo.tar.gz'    # 将归档写到标准输出并通过 SSH 传输
$ ssh user@host 'tar -czf - demo' | tar -xzf -           # 从远程读取归档并解压到当前目录

#相关命令

命令说明
cp复制文件或目录
find查找文件,结果可通过 -T 传给 tar
rsync同步文件和目录
split拆分文件,可用于分割大型归档

#推荐阅读

#手册

更新: 2026/10/21

作者: planc

创建: 2026/10/21