每次服务更新前,做好备份是必要的操作步骤,这里提供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 使配置的别名生效

备份效果

image.png

image.png

Q.E.D.


寻门而入,破门而出