归档(Archiving)是将多个文件和目录组合成单个文件的过程,通常用于: - 备份数据 - 传输多个文件 - 长期存储 - 释放磁盘空间
最常用的Linux归档工具,特点: - 保留文件权限和属性 - 可结合压缩工具使用 - 支持增量备份
基本语法:
tar [选项] [归档文件名] [要归档的文件/目录]
另一种归档工具,常用于: - RPM软件包创建 - initramfs映像制作 - 从find命令接收输入
POSIX标准归档工具,兼容tar和cpio格式
# 创建归档(不压缩)
tar -cvf archive.tar file1 file2 dir1
# 创建并压缩归档
tar -czvf archive.tar.gz file1 file2 dir1 # gzip压缩
tar -cjvf archive.tar.bz2 file1 file2 dir1 # bzip2压缩
tar -cJvf archive.tar.xz file1 file2 dir1 # xz压缩
tar -tvf archive.tar
tar -tzvf archive.tar.gz
# 提取到当前目录
tar -xvf archive.tar
# 提取到指定目录
tar -xvf archive.tar -C /target/directory
# 提取特定文件
tar -xvf archive.tar file1 dir1/file2
# 增量备份
tar -g snapshot.file -czvf backup-$(date +%Y%m%d).tar.gz /data
# 排除特定文件
tar --exclude='*.tmp' -czvf backup.tar.gz /data
# 多卷归档(分割大文件)
tar -cvzf - /large/data | split -b 2G - backup.tar.gz.
工具 | 扩展名 | 压缩率 | 速度 | CPU使用 | 适用场景 |
---|---|---|---|---|---|
gzip | .gz | 中等 | 快 | 低 | 通用,快速压缩解压 |
bzip2 | .bz2 | 高 | 慢 | 高 | 需要更高压缩率 |
xz | .xz | 最高 | 最慢 | 最高 | 极致压缩,不频繁访问 |
lzma | .lzma | 高 | 慢 | 高 | 类似xz |
zstd | .zst | 可变 | 很快 | 中等 | 需要快速压缩解压 |
# 备份整个系统(排除特殊目录)
tar --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/mnt --exclude=/tmp \
--exclude=/run --exclude=/media -czpvf /backup/full-backup-$(date +%F).tar.gz /
# 归档并压缩30天前的日志
find /var/log -name "*.log" -mtime +30 -exec tar -rvf old-logs.tar {} \;
gzip old-logs.tar
mysqldump -u user -p database | gzip > db-backup-$(date +%F).sql.gz
# 通过SSH传输归档文件
tar -czf - /source/dir | ssh user@remote "cat > /backup/backup.tar.gz"
# 从远程服务器获取归档
ssh user@remote "tar -czf - /remote/dir" > local_backup.tar.gz
#!/bin/bash
# 自动备份脚本
BACKUP_DIR="/backups"
SOURCE_DIRS="/home /etc /var/www"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILE="$BACKUP_DIR/backup_$DATE.tar.gz"
LOG_FILE="/var/log/backup.log"
# 检查备份目录
[ -d "$BACKUP_DIR" ] || mkdir -p "$BACKUP_DIR"
# 执行备份
echo "[$DATE] Starting backup..." >> "$LOG_FILE"
tar --exclude='*.tmp' --exclude='*.cache' -czpf "$BACKUP_FILE" $SOURCE_DIRS 2>> "$LOG_FILE"
# 检查结果
if [ $? -eq 0 ]; then
echo "[$(date +%Y-%m-%d_%H-%M-%S)] Backup succeeded: $BACKUP_FILE" >> "$LOG_FILE"
# 删除30天前的备份
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +30 -delete
else
echo "[$(date +%Y-%m-%d_%H-%M-%S)] Backup failed!" >> "$LOG_FILE"
fi
tar -tf
检查内容,提取后验证文件完整性find
命令自动删除过期备份gpg
)通过掌握这些归档技术和最佳实践,您可以有效地管理Linux系统中的文件备份和数据传输需求。