如何编写选择文件压缩级别脚本

wen 实用脚本 30

本文目录导读:

如何编写选择文件压缩级别脚本

  1. 使用说明
  2. 功能特点
  3. 示例

这是为您编写的选择文件压缩级别脚本,支持多种压缩工具和自定义输出路径。

#!/bin/bash
# 文件名: compress_selector.sh
# 用途: 交互式选择文件并指定压缩级别,支持 gzip、bzip2、xz、zip
# ------------------------ 配置区域 ------------------------
DEFAULT_COMPRESSOR="gzip"
DEFAULT_LEVEL=""      # 留空表示使用工具默认级别
# ---------------------------------------------------------
# 显示压缩级别说明
show_level_info() {
    echo "================================================"
    echo "         压缩级别选择帮助"
    echo "================================================"
    echo "支持的压缩工具与级别范围:"
    echo "  gzip   : 1-9   (1=最快, 6=默认, 9=最佳压缩)"
    echo "  bzip2  : 1-9   (1=最快, 9=最佳压缩)"
    echo "  xz     : 0-9   (0=无压缩, 6=默认, 9=最佳)"
    echo "  zip    : 0-9   (0=仅存储, 6=默认, 9=最佳)"
    echo "-----------------------------------------------"
    echo "输入 'q' 或 'quit' 可随时退出"
    echo "================================================"
}
# 选择压缩工具
select_compressor() {
    echo ""
    echo "请选择压缩工具:"
    echo "  1) gzip  (通用, 速度快)"
    echo "  2) bzip2 (压缩率较高, 较慢)"
    echo "  3) xz    (高压缩率, 很慢)"
    echo "  4) zip   (兼容性好, 可打包目录)"
    read -p "输入编号 (1-4, 默认: 1): " comp_choice
    case "${comp_choice:-1}" in
        1) COMPRESSOR="gzip" ;;
        2) COMPRESSOR="bzip2" ;;
        3) COMPRESSOR="xz" ;;
        4) COMPRESSOR="zip" ;;
        *) echo "无效选择,使用默认 gzip"; COMPRESSOR="gzip" ;;
    esac
    echo "→ 已选择: $COMPRESSOR"
}
# 输入压缩级别并验证
input_level() {
    local min=1 max=9
    [[ "$COMPRESSOR" == "xz" ]] && min=0
    while true; do
        read -p "请输入压缩级别 ($min-$max, 留空=默认): " level
        level="${level:-$DEFAULT_LEVEL}"
        if [[ -z "$level" ]]; then
            echo "→ 使用工具默认级别"
            LEVEL=""
            break
        fi
        if [[ "$level" == "q" || "$level" == "quit" ]]; then
            echo "退出程序。"
            exit 0
        fi
        # 验证是否为数字且在范围内
        if [[ "$level" =~ ^[0-9]+$ ]] && (( level >= min && level <= max )); then
            LEVEL="$level"
            echo "→ 已选择级别: $LEVEL"
            break
        else
            echo "错误: 请输入 $min-$9 之间的整数。"
        fi
    done
}
# 选择文件(支持多文件/目录)
select_files() {
    echo ""
    echo "请输入要压缩的文件或目录 (支持通配符,如 *.txt)"
    echo "多项用空格分隔,直接回车可选择当前目录下所有文件"
    read -p "输入: " -r file_input
    if [[ -z "$file_input" ]]; then
        # 默认: 当前目录下所有非隐藏文件
        FILES=(*)
        if [[ ${#FILES[@]} -eq 0 ]]; then
            echo "错误: 当前目录没有可压缩的文件。"
            exit 1
        fi
        echo "→ 已选择所有文件: ${FILES[*]}"
    else
        # 展开通配符并检查存在性
        shopt -s nullglob
        FILES=($file_input)
        shopt -u nullglob
        if [[ ${#FILES[@]} -eq 0 ]]; then
            echo "错误: 未找到匹配的文件 '$file_input'"
            exit 1
        fi
        echo "→ 选择了 ${#FILES[@]} 个项目"
    fi
}
# 选择输出目录
select_output_dir() {
    echo ""
    read -p "请输入输出目录 (留空=当前目录): " out_dir
    out_dir="${out_dir:-.}"
    if [[ ! -d "$out_dir" ]]; then
        read -p "目录 '$out_dir' 不存在,是否创建? (y/n): " create
        if [[ "$create" == "y" ]]; then
            mkdir -p "$out_dir" || { echo "创建失败"; exit 1; }
            echo "→ 已创建目录: $out_dir"
        else
            echo "使用当前目录"
            out_dir="."
        fi
    fi
}
# 执行压缩(根据工具和级别)
do_compress() {
    local cmd=""
    local ext=""
    echo ""
    echo "开始压缩..."
    echo "================================================"
    for item in "${FILES[@]}"; do
        if [[ ! -e "$item" ]]; then
            echo "跳过不存在的项目: $item"
            continue
        fi
        # 构建输出路径
        local base_name=$(basename "$item")
        local output_path="$out_dir/$base_name"
        case "$COMPRESSOR" in
            gzip)
                [[ -n "$LEVEL" ]] && cmd="gzip -$LEVEL -c \"$item\" > \"$output_path.gz\"" || cmd="gzip -c \"$item\" > \"$output_path.gz\""
                ext=".gz"
                ;;
            bzip2)
                [[ -n "$LEVEL" ]] && cmd="bzip2 -$LEVEL -c \"$item\" > \"$output_path.bz2\"" || cmd="bzip2 -c \"$item\" > \"$output_path.bz2\""
                ext=".bz2"
                ;;
            xz)
                [[ -n "$LEVEL" ]] && cmd="xz -$LEVEL -c \"$item\" > \"$output_path.xz\"" || cmd="xz -c \"$item\" > \"$output_path.xz\""
                ext=".xz"
                ;;
            zip)
                # zip 处理稍有不同,支持多个文件合并到一个压缩包
                if [[ ${#FILES[@]} -eq 1 ]]; then
                    [[ -n "$LEVEL" ]] && cmd="zip -$LEVEL \"$output_path.zip\" \"$item\"" || cmd="zip \"$output_path.zip\" \"$item\""
                else
                    # 多文件/目录:全部打进同一个 zip
                    local zipname="${out_dir}/multi_files_$(date +%Y%m%d_%H%M%S).zip"
                    local filelist=""
                    for f in "${FILES[@]}"; do
                        filelist="$filelist \"$f\""
                    done
                    [[ -n "$LEVEL" ]] && cmd="zip -$LEVEL \"$zipname\" $filelist" || cmd="zip \"$zipname\" $filelist"
                    ext=".zip"
                fi
                ;;
        esac
        echo "执行: $cmd"
        eval "$cmd"
        if [[ $? -eq 0 ]]; then
            echo "✓ 成功压缩: $item → ${output_path}${ext}"
        else
            echo "✗ 压缩失败: $item"
        fi
        echo "-----------------------------------------------"
    done
    # zip 且多文件,输出 final 信息
    if [[ "$COMPRESSOR" == "zip" && ${#FILES[@]} -gt 1 ]]; then
        echo "所有文件已打包到: $zipname"
    fi
}
# ----------------------------- 主流程 -----------------------------
echo "===== 文件压缩级别选择脚本 ====="
show_level_info
while true; do
    select_compressor
    input_level
    select_files
    select_output_dir
    # 确认信息
    echo ""
    echo "========== 压缩配置摘要 =========="
    echo "压缩工具 : $COMPRESSOR"
    echo "压缩级别 : ${LEVEL:-默认}"
    echo "文件列表 : ${FILES[*]}"
    echo "输出目录 : $out_dir"
    echo "================================="
    read -p "确认执行? (y/n, 默认 y): " confirm
    confirm="${confirm:-y}"
    if [[ "$confirm" == "y" ]]; then
        do_compress
        echo "压缩完成!"
        break
    else
        echo "重新选择..."
    fi
done

使用说明

  1. 保存脚本:将以上内容保存为 compress_selector.sh
  2. 赋予执行权限
    chmod +x compress_selector.sh
  3. 运行脚本
    ./compress_selector.sh

功能特点

  • 交互式选择:逐步引导您选择压缩工具、压缩级别、文件和输出目录。
  • 多种压缩工具:支持 gzipbzip2xzzip,可根据需求选择。
  • 灵活的文件选择:支持通配符(如 *.log)和多个文件/目录。
  • 级别验证:自动检查输入的压缩级别是否在有效范围内。
  • 默认值:所有选项都有合理的默认值,直接回车即可使用。
  • 安全性:执行前会显示摘要确认,避免误操作。
  • 输出目录:可指定输出目录,若不存在会询问是否创建。

示例

===== 文件压缩级别选择脚本 =====
================================================
         压缩级别选择帮助
================================================
...
请选择压缩工具:
  1) gzip
  2) bzip2
  3) xz
  4) zip
输入编号 (1-4, 默认: 1): 3
→ 已选择: xz
请输入压缩级别 (0-9, 留空=默认): 9
→ 已选择级别: 9
请输入要压缩的文件或目录 (支持通配符,如 *.txt)
输入: document.pdf image.png
→ 选择了 2 个项目
请输入输出目录 (留空=当前目录): ./compressed
目录 './compressed' 不存在,是否创建? (y/n): y
→ 已创建目录: ./compressed
========== 压缩配置摘要 ==========
...
确认执行? (y/n, 默认 y): y
开始压缩...
✓ 成功压缩: document.pdf → ./compressed/document.pdf.xz
✓ 成功压缩: image.png → ./compressed/image.png.xz
压缩完成!

这个脚本非常适合日常文件压缩需求,让您可以精细控制每项压缩参数,如有特殊需求(如加密、分卷等),可以在此基础上扩展。

抱歉,评论功能暂时关闭!