tar是Linux系统中最常用的归档打包工具,全称为"Tape Archive"。它可以将多个文件或目录打包成一个单独的文件(归档文件),并支持多种压缩格式(gzip、bzip2、xz等)。tar命令是系统管理、备份和数据传输中不可或缺的工具。
tar [选项] [文件名] [文件或目录...]
tar命令有三种主要操作模式:
这三种模式通常与以下选项组合使用:
# 创建归档文件
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 | 快 | 高 | 低 |
创建和提取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/
使用不同的压缩格式:
# 创建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.*
列出压缩归档中的文件:
# 列出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
从归档中提取特定文件或目录:
# 提取单个文件
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/
向已存在的归档中添加新文件:
# 创建新文件
echo "New file content" > newfile.txt
# 向归档中追加文件(仅对非压缩归档有效)
tar -rf archive.tar newfile.txt
# 仅追加比归档中更新的文件
tar -uf archive.tar newfile.txt
# 注意:对于压缩归档,需要先解压再重新压缩
创建归档时排除特定文件或目录:
# 排除特定文件
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/
使用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
# 查找并打包所有.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 {} +
创建大型归档的分卷压缩:
# 创建每卷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/
通过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/
# 查看归档并选择要提取的文件
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选项时,归档文件名必须是下一个参数-P选项处理绝对路径时要格外小心-P选项)创建归档时,提取可能会覆盖系统重要文件。建议总是使用相对路径。
压缩工具,常与tar配合使用
另一种常用的压缩工具,跨平台兼容性好
另一种归档工具,常用于RPM包和initramfs