每次服务更新前,做好备份是必要的操作步骤,这里提供linux服务下快速备份文件/文件夹的 shell 脚本。
配置脚本
这里我们采用 别名的方式快速备份文件
在 ~/.bashrc
中添加如下内容
# 独立函数版本(功能更完整)
backup_files() {
local curDir=$(pwd)
local timestamp=$(date "+%Y%m%d_%H%M")
local targets=()
local backup_name=""
local total_size=0
# 检查参数
if [ $# -eq 0 ]; then
echo "使用方法: backup_files <文件/目录1> [文件/目录2] ..."
echo "示例: backup_files project/ doc.txt"
return 1
fi
# 处理所有参数
for arg in "$@"; do
# 去除末尾斜杠
local clean_path="${arg%/}"
# 检查文件/目录是否存在
if [ ! -e "$clean_path" ]; then
echo "⚠️ 警告: '$clean_path' 不存在,跳过"
continue
fi
targets+=("$clean_path")
# 计算大小(如果是目录则递归计算)
if [ -d "$clean_path" ]; then
local size=$(du -sb "$clean_path" 2>/dev/null | cut -f1)
else
local size=$(stat -c%s "$clean_path" 2>/dev/null || echo 0)
fi
total_size=$((total_size + size))
done
# 检查是否有有效目标
if [ ${#targets[@]} -eq 0 ]; then
echo "❌ 没有找到有效的备份目标"
return 1
fi
# 生成备份文件名
if [ ${#targets[@]} -eq 1 ]; then
backup_name="$(basename "${targets[0]}")-${timestamp}-bak.tar.gz"
else
# 多文件备份:取前几个文件名的首字母或简写
local short_names=""
for target in "${targets[@]}"; do
local basename=$(basename "$target")
# 如果文件名较短直接使用,否则取首字母
if [ ${#basename} -le 10 ]; then
short_names="${short_names}${basename}_"
else
short_names="${short_names}${basename:0:5}_"
fi
done
short_names="${short_names%_}" # 去掉最后一个下划线
# 限制总长度
if [ ${#short_names} -gt 30 ]; then
short_names="${short_names:0:25}"
fi
backup_name="${short_names}-${timestamp}-bak.tar.gz"
fi
# 显示备份信息
echo "🔄 开始备份..."
echo "📁 备份目标: ${targets[*]}"
echo "📦 备份文件: ${backup_name}"
echo "📊 预计大小: $(numfmt --to=iec-i --suffix=B $total_size 2>/dev/null || echo "${total_size} bytes")"
# 执行备份
tar -zcf "${curDir}/${backup_name}" "${targets[@]}" 2>/dev/null
if [ $? -eq 0 ]; then
local backup_size=$(stat -c%s "${curDir}/${backup_name}" 2>/dev/null || echo 0)
echo "✅ 备份完成!"
echo "📂 保存位置: ${curDir}/${backup_name}"
echo "💾 压缩后大小: $(numfmt --to=iec-i --suffix=B $backup_size 2>/dev/null || echo "${backup_size} bytes")"
# 计算压缩率
if [ $total_size -gt 0 ]; then
local ratio=$((100 - (backup_size * 100 / total_size)))
echo "📈 压缩率: ${ratio}%"
fi
else
echo "❌ 备份失败,请检查权限或磁盘空间"
return 1
fi
}
# 简化版alias(调用上面的函数)
alias bak='backup_files'
# 使用示例:
# bak project/ # 备份单个目录
# bak file1.txt file2.txt # 备份多个文件
# bak project/ doc.txt config/ # 备份混合内容
保存后 ,source ~/.bashrc
使配置的别名生效
备份效果
Q.E.D.