本文目录导读:

这是为您编写的选择文件压缩级别脚本,支持多种压缩工具和自定义输出路径。
#!/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
使用说明
- 保存脚本:将以上内容保存为
compress_selector.sh。 - 赋予执行权限:
chmod +x compress_selector.sh
- 运行脚本:
./compress_selector.sh
功能特点
- 交互式选择:逐步引导您选择压缩工具、压缩级别、文件和输出目录。
- 多种压缩工具:支持
gzip、bzip2、xz和zip,可根据需求选择。 - 灵活的文件选择:支持通配符(如
*.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
压缩完成!
这个脚本非常适合日常文件压缩需求,让您可以精细控制每项压缩参数,如有特殊需求(如加密、分卷等),可以在此基础上扩展。