Linux tar命令

简介

tar是Linux系统中最常用的归档打包工具,全称为"Tape Archive"。它可以将多个文件或目录打包成一个单独的文件(归档文件),并支持多种压缩格式(gzip、bzip2、xz等)。tar命令是系统管理、备份和数据传输中不可或缺的工具。

特点:tar不仅可以打包文件,还能保留文件的权限、所有权、时间戳等信息,并支持增量备份、排除文件等高级功能。

语法格式

tar [选项] [文件名] [文件或目录...]

tar命令有三种主要操作模式:

  1. 创建模式 (c) - 创建新的归档文件
  2. 提取模式 (x) - 从归档文件中提取文件
  3. 列表模式 (t) - 列出归档文件中的内容

这三种模式通常与以下选项组合使用:

# 创建归档文件
tar -cf archive.tar file1 file2 dir1

# 提取归档文件
tar -xf archive.tar

# 列出归档内容
tar -tf archive.tar

常用选项

选项 说明
-c, --create 创建新的归档文件
-x, --extract 从归档文件中提取文件
-t, --list 列出归档文件中的内容
-f, --file=ARCHIVE 指定归档文件名(必须选项)
-z, --gzip 通过gzip压缩/解压归档文件(.tar.gz或.tgz)
-j, --bzip2 通过bzip2压缩/解压归档文件(.tar.bz2或.tbz2)
-J, --xz 通过xz压缩/解压归档文件(.tar.xz或.txz)
-v, --verbose 显示详细的处理信息
-C, --directory=DIR 切换到指定目录执行操作
-P, --absolute-names 使用绝对路径(默认使用相对路径)
--exclude=PATTERN 排除匹配模式的文件或目录
--wildcards 在文件模式中使用通配符
-r, --append 向归档文件中追加文件
-u, --update 仅追加比归档中更新的文件
-p, --preserve-permissions 保留文件权限(仅对提取操作)
-k, --keep-old-files 提取时不覆盖已存在的文件
--strip-components=N 提取时去除路径中的前N个目录组件
--overwrite 提取时覆盖已存在的文件

常用压缩格式对比

格式 tar选项 扩展名 压缩速度 压缩率 CPU占用
不压缩 -cf .tar 最快 不压缩 最低
gzip -czf .tar.gz, .tgz 中等
bzip2 -cjf .tar.bz2, .tbz2
xz -cJf .tar.xz, .txz 最慢 最高 最高
lzma --lzma .tar.lzma
zstd --zstd .tar.zst

使用示例

示例1:基本打包和解包

创建和提取tar归档文件:

# 创建测试文件
mkdir testdir
echo "File 1 content" > testdir/file1.txt
echo "File 2 content" > testdir/file2.txt

# 创建tar归档
tar -cf testdir.tar testdir/

# 查看归档内容
tar -tf testdir.tar

# 提取到当前目录
tar -xf testdir.tar

# 提取到指定目录
tar -xf testdir.tar -C /tmp/
示例2:创建压缩归档

使用不同的压缩格式:

# 创建gzip压缩归档(.tar.gz)
tar -czf archive.tar.gz testdir/

# 创建bzip2压缩归档(.tar.bz2)
tar -cjf archive.tar.bz2 testdir/

# 创建xz压缩归档(.tar.xz)
tar -cJf archive.tar.xz testdir/

# 查看文件大小比较
ls -lh archive.tar.*
示例3:查看归档内容

列出压缩归档中的文件:

# 列出gzip压缩归档内容
tar -tzf archive.tar.gz

# 列出bzip2压缩归档内容
tar -tjf archive.tar.bz2

# 列出xz压缩归档内容
tar -tJf archive.tar.xz

# 列出详细信息(类似ls -l)
tar -tvf archive.tar.gz
示例4:提取特定文件

从归档中提取特定文件或目录:

# 提取单个文件
tar -xzf archive.tar.gz testdir/file1.txt

# 提取多个文件
tar -xzf archive.tar.gz testdir/file1.txt testdir/file2.txt

# 使用通配符提取文件
tar -xzf archive.tar.gz "testdir/*.txt"

# 提取目录
tar -xzf archive.tar.gz testdir/subdir/
示例5:向归档中添加文件

向已存在的归档中添加新文件:

# 创建新文件
echo "New file content" > newfile.txt

# 向归档中追加文件(仅对非压缩归档有效)
tar -rf archive.tar newfile.txt

# 仅追加比归档中更新的文件
tar -uf archive.tar newfile.txt

# 注意:对于压缩归档,需要先解压再重新压缩
示例6:排除特定文件

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

# 排除特定文件
tar -czf backup.tar.gz --exclude="*.log" --exclude="temp/" /path/to/dir/

# 使用排除文件列表
echo "*.log" > exclude.txt
echo "*.tmp" >> exclude.txt
tar -czf backup.tar.gz -X exclude.txt /path/to/dir/

# 排除隐藏文件(以.开头的文件)
tar -czf backup.tar.gz --exclude=".*" /path/to/dir/
示例7:增量备份

使用tar进行增量备份:

# 创建完整备份
tar -czf full-backup-$(date +%Y%m%d).tar.gz --listed-incremental=backup.snar /home/user/

# 创建增量备份(基于之前的备份)
tar -czf inc-backup-$(date +%Y%m%d).tar.gz --listed-incremental=backup.snar /home/user/

# 恢复完整备份
tar -xzf full-backup-20231201.tar.gz

# 恢复增量备份
tar -xzf inc-backup-20231202.tar.gz

高级用法

1. 结合find命令
# 查找并打包所有.txt文件
find . -name "*.txt" -type f -exec tar -czf textfiles.tar.gz {} +

# 查找并打包最近7天修改的文件
find /var/log -type f -mtime -7 -exec tar -czf logs-weekly.tar.gz {} +

# 排除特定目录
find . -type f ! -path "./node_modules/*" ! -path "./.git/*" -exec tar -czf project.tar.gz {} +
2. 创建分卷归档

创建大型归档的分卷压缩:

# 创建每卷100MB的分卷归档
tar -czf - largefile.iso | split -b 100M - largefile.tar.gz.

# 恢复分卷归档
cat largefile.tar.gz.* | tar -xzf -

# 或者使用multi-volume选项(某些版本支持)
tar -cMf archive.tar /large/dir/
3. 远程备份与恢复

通过SSH进行远程备份和恢复:

# 远程备份到服务器
tar -czf - /local/dir/ | ssh user@remote "cat > /backup/backup.tar.gz"

# 从服务器恢复
ssh user@remote "tar -czf - /remote/dir/" | tar -xzf - -C /local/restore/

# 使用rsync配合tar
tar -czf - /local/dir/ | rsync -avz -e ssh - user@remote:/backup/
4. 同时查看和提取
# 查看归档并选择要提取的文件
tar -tzf archive.tar.gz | grep "important"
tar -xzf archive.tar.gz important-file.txt

# 提取时去除路径前缀
tar -xzf archive.tar.gz --strip-components=2 path/in/archive/file.txt

实用命令组合

命令 说明
tar -czf backup.tar.gz dir/ 创建gzip压缩的归档文件
tar -xzf backup.tar.gz 解压gzip压缩的归档文件
tar -tvf backup.tar.gz 查看归档文件详细内容
tar -czf backup.tar.gz --exclude="*.tmp" dir/ 排除特定文件类型后压缩
tar -cjf backup.tar.bz2 dir/ && rm -rf dir/ 压缩后删除原目录(谨慎使用)
tar -czf - dir/ | wc -c 计算压缩后的大小而不保存文件
tar -cf - dir/ | tar -xf - -C /new/location/ 快速复制目录结构

注意事项

  • 使用-f选项时,归档文件名必须是下一个参数
  • 创建归档时使用相对路径,避免提取时覆盖系统文件
  • 压缩大型文件时,xz和bzip2会消耗大量内存和时间
  • 对于文本文件,gzip通常足够且速度更快
  • tar默认不会压缩符号链接指向的文件,只会保存链接本身
  • 使用-P选项处理绝对路径时要格外小心
  • 归档文件名最好使用标准扩展名(.tar.gz, .tar.bz2等)以便识别
警告:使用绝对路径(-P选项)创建归档时,提取可能会覆盖系统重要文件。建议总是使用相对路径。

相关命令

gzip

压缩工具,常与tar配合使用

zip

另一种常用的压缩工具,跨平台兼容性好

cpio

另一种归档工具,常用于RPM包和initramfs