#!/bin/bash # convert_ogg.sh - Convert WAV and MP3 files to OGG format # Usage: ./convert_ogg.sh [quality] [directory] # Quality range: 0-10 (default: 7), Directory (default: current) set -euo pipefail # 严格错误处理 # 默认参数 QUALITY=${1:-7} TARGET_DIR=${2:-.} EXTENSIONS=("mp3" "wav") # 验证质量参数 if ! [[ "$QUALITY" =~ ^[0-9]|10$ ]]; then echo "错误:质量参数必须在 0-10 之间" >&2 exit 1 fi # 验证目录存在 if [[ ! -d "$TARGET_DIR" ]]; then echo "错误:目录 '$TARGET_DIR' 不存在" >&2 exit 1 fi # 检查 ffmpeg 是否安装 if ! command -v ffmpeg &> /dev/null; then echo "错误:未找到 ffmpeg,请先安装" >&2 exit 1 fi # 转换函数 convert_to_ogg() { local input_file="$1" local output_file="${input_file%.*}.ogg" # 检查输出文件是否已存在 if [[ -f "$output_file" ]]; then read -p "文件 '$output_file' 已存在,是否覆盖?(y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "跳过:$input_file" return 0 fi fi echo "转换中:$input_file -> $output_file" if ffmpeg -i "$input_file" -c:a libvorbis -qscale:a "$QUALITY" "$output_file" -y &>/dev/null; then echo "✓ 完成:$output_file" return 0 else echo "✗ 失败:$input_file" >&2 return 1 fi } # 主逻辑 cd "$TARGET_DIR" total_files=0 converted_files=0 failed_files=0 # 统计文件总数 for ext in "${EXTENSIONS[@]}"; do count=$(find . -maxdepth 1 -name "*.$ext" -type f | wc -l) total_files=$((total_files + count)) done if [[ $total_files -eq 0 ]]; then echo "在 '$TARGET_DIR' 中未找到 MP3 或 WAV 文件" exit 0 fi echo "找到 $total_files 个文件,质量设置:$QUALITY" echo "开始转换..." echo # 转换文件 for ext in "${EXTENSIONS[@]}"; do while IFS= read -r -d '' file; do if convert_to_ogg "$file"; then ((converted_files++)) else ((failed_files++)) fi done < <(find . -maxdepth 1 -name "*.$ext" -type f -print0) done # 显示结果统计 echo echo "转换完成!" echo "成功:$converted_files 个文件" if [[ $failed_files -gt 0 ]]; then echo "失败:$failed_files 个文件" exit 1 fi