97 lines
2.3 KiB
Bash
97 lines
2.3 KiB
Bash
|
#!/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
|