Linux bsdtar命令

bsdtar 是libarchive项目提供的跨平台归档工具,与GNU tar相比有更好的格式自动检测能力和更简洁的语法。它支持tar、zip、cpio、ISO、7z、rar等多种格式。

安装bsdtar

bsdtar通常包含在libarchive-tools包中:

Ubuntu/Debian
sudo apt update
sudo apt install libarchive-tools

安装后命令为bsdtar,有时也会安装为tar

CentOS/RHEL
sudo yum install libarchive

或从EPEL源安装:

sudo yum install epel-release
sudo yum install bsdtar
注意:在某些系统上,bsdtar可能直接安装为tar。可以通过tar --version查看是否是bsdtar(会显示"bsdtar"字样)。

语法格式

bsdtar [选项] [文件...]

或使用快捷方式(如果安装为tar):

tar [选项] [文件...]

常用参数

参数 说明
-c 创建新的归档文件
-x 从归档文件中解压文件
-t 列出归档文件的内容
-f [文件] 指定归档文件名
-z 通过gzip过滤归档(压缩/解压.gz或.tgz)
-j 通过bzip2过滤归档(压缩/解压.bz2)
-J 通过xz过滤归档(压缩/解压.xz)
--lzma 通过lzma过滤归档
--zstd 通过zstd过滤归档(压缩/解压.zst)
-v 详细模式,显示处理过程
-p 保留文件权限和属性
-C [目录] 切换到指定目录执行操作
-r 向归档文件末尾追加文件
-u 仅追加比归档中更新的文件
-k 解压时不覆盖现有文件
--exclude 排除匹配模式的文件
--format 指定归档格式(支持tar、pax、cpio、shar等)
--help 显示帮助信息
bsdtar支持的格式
归档格式:
  • tar (默认)
  • pax
  • cpio
  • shar
  • ISO9660 (CD/DVD镜像)
压缩格式:
  • gzip (.gz, .tgz)
  • bzip2 (.bz2, .tbz2)
  • xz (.xz, .txz)
  • lzma
  • zstd (.zst)
  • compress (.Z)
  • lzip
  • lzop
其他格式:
  • zip (读写)
  • 7z (读写)
  • rar (只读)
  • ar (deb包中的格式)
  • mtree

使用示例

示例1:创建归档文件

创建tar归档:

bsdtar -cf archive.tar file1.txt file2.txt directory/

创建gzip压缩的tar归档:

bsdtar -czf archive.tar.gz /path/to/directory/

创建xz压缩的tar归档并显示详细过程:

bsdtar -cJvf archive.tar.xz /path/to/directory/
示例2:解压归档文件

解压tar归档:

bsdtar -xf archive.tar

解压gzip压缩的tar归档:

bsdtar -xzf archive.tar.gz

解压到指定目录:

bsdtar -xzf archive.tar.gz -C /target/directory/

解压时不覆盖现有文件:

bsdtar -xzkf archive.tar.gz
示例3:列出归档内容

列出tar归档内容:

bsdtar -tf archive.tar

列出压缩归档内容并显示详细信息:

bsdtar -tvzf archive.tar.gz

列出zip文件内容:

bsdtar -tf archive.zip
示例4:处理其他格式

创建zip归档:

bsdtar --format=zip -cf archive.zip file1.txt file2.txt

解压zip文件:

bsdtar -xf archive.zip

列出7z文件内容:

bsdtar -tf archive.7z

解压rar文件(只读支持):

bsdtar -xf archive.rar
示例5:高级操作

向归档追加文件:

bsdtar -rf archive.tar newfile.txt

创建归档时排除特定文件:

bsdtar -czf backup.tar.gz --exclude='*.tmp' --exclude='temp/' /home/user/

创建包含多个目录的归档:

bsdtar -czf backup.tar.gz -C /etc/ . -C /home/user/ .

实用技巧

自动格式检测

bsdtar能自动检测大多数压缩格式:

bsdtar -xf archive.tar.gz    # 自动检测gzip压缩
bsdtar -xf archive.tar.bz2   # 自动检测bzip2压缩
bsdtar -xf archive.tar.xz    # 自动检测xz压缩

无需指定-z, -j, -J参数

格式转换

将zip转换为tar.gz:

bsdtar -xf archive.zip -s '|^|extracted/|' --format=ustar | \
bsdtar -czf archive.tar.gz -C extracted/ .
快速备份

使用zstd快速压缩(速度比gzip快,压缩比合理):

bsdtar -cf - /path/to/backup/ | zstd -T0 -o backup.tar.zst
查找特定文件

在归档中搜索文件:

bsdtar -tf archive.tar.gz | grep "pattern"

与GNU tar比较

特性 bsdtar GNU tar
格式自动检测 优秀,自动识别多种压缩格式 有限,需要指定压缩参数
支持的格式 tar, zip, 7z, rar(只读), cpio, ISO等 主要是tar格式,部分支持其他格式
语法简洁性 更简洁,参数顺序灵活 参数顺序有严格要求
跨平台兼容性 优秀,BSD/macOS/Linux一致 主要在Linux/GNU系统
默认安装 macOS默认,Linux需单独安装 大多数Linux发行版默认
功能丰富性 基础功能完整 更多高级选项和功能
如何选择?
  • 使用bsdtar:需要处理多种格式、跨平台脚本、自动格式检测
  • 使用GNU tar:需要高级功能、脚本兼容性、Linux默认环境
  • 通用做法:在脚本中使用tar命令,让系统决定使用哪个实现
注意事项
  • bsdtar和GNU tar在某些参数上不完全兼容,编写跨平台脚本时需注意
  • bsdtar对rar格式只提供读取支持,无法创建rar归档
  • 某些Linux发行版可能同时安装bsdtar和GNU tar,注意命令路径
  • 使用--format参数可以强制指定归档格式
  • bsdtar默认使用pax格式处理扩展属性,而不是ustar格式