Linux Shell批量打包压缩核心是组合tar与gzip/bzip2/xz命令,通过循环或find处理多文件,并需注意路径安全、错误处理及压缩选项选择。

Linux Shell 脚本批量打包压缩,核心是组合 tar 与 gzip/bzip2/xz 命令,并用循环或通配符处理多个文件或目录。关键在于路径安全、错误处理和压缩选项的合理选择。
基础打包压缩命令组合
单个目录打包压缩常用写法:
-
tar -czf archive.tar.gz /path/to/dir:gzip 压缩,体积小、速度快 -
tar -cjf archive.tar.bz2 /path/to/dir:bzip2 压缩,压缩率更高但慢 -
tar -cJf archive.tar.xz /path/to/dir:xz 压缩,最高压缩率,适合归档长期保存
注意:-f 必须是最后一个选项,后面紧跟压缩包名;-c 表示创建新归档,-z/-j/-J 对应不同压缩算法。
批量处理多个目录或文件
用 for 循环遍历目标路径,为每个项目生成独立压缩包:
#!/bin/bash
dirs=("project1" "project2" "docs" "logs")
for dir in "${dirs[@]}"; do
[ -d "$dir" ] || continue
tar -czf "${dir}_$(date +%Y%m%d).tar.gz" "$dir"
done说明:
• 使用数组定义目标项,避免空格或特殊字符导致问题
• [ -d "$dir" ] 判断目录是否存在,提升健壮性
• $(date +%Y%m%d) 加入日期后缀,防止覆盖
按条件筛选并打包(如最近修改的文件)
结合 find 精准选取文件,再交给 tar 打包:
#!/bin/bash # 打包过去7天内修改过的 .log 文件 find /var/log -name "*.log" -mtime -7 -print0 | \ tar -czf recent_logs_$(date +%s).tar.gz --null -T -
要点:
• -print0 和 --null 配合处理含空格或换行的文件名
• -T - 表示从标准输入读取文件列表
• $(date +%s) 用时间戳避免重名
增强脚本可靠性的小技巧
生产环境建议加入以下防护措施:
- 开头加
set -euo pipefail:遇到错误立即退出,未定义变量报错,管道任一环节失败即终止 - 压缩前检查磁盘空间:
df -h . | awk 'NR==2 {print $5}' | sed 's/%//' | [[ $(cat) -lt 80 ]] || { echo "磁盘空间不足"; exit 1; } - 压缩后验证完整性:
tar -tzf archive.tar.gz > /dev/null || echo "压缩包损坏" - 输出日志到文件:
./backup.sh >> /var/log/backup.log 2>&1
不复杂但容易忽略。


















