Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # 设置日志文件
- LOG_FILE="/mnt/conversion_log.txt"
- # 清空日志文件
- > "$LOG_FILE"
- echo "===================================" | tee -a "$LOG_FILE"
- echo "开始DVD ISO转换过程" | tee -a "$LOG_FILE"
- echo "日期时间: $(date)" | tee -a "$LOG_FILE"
- echo "===================================" | tee -a "$LOG_FILE"
- # 检查mkisofs命令是否可用
- if ! command -v mkisofs &> /dev/null; then
- echo "错误: mkisofs命令未找到,请安装必要的软件包" | tee -a "$LOG_FILE"
- exit 1
- fi
- # 遍历/mnt目录下的所有文件夹
- cd /mnt || { echo "错误: 无法进入/mnt目录" | tee -a "$LOG_FILE"; exit 1; }
- # 计数器
- total_dirs=0
- processed_dirs=0
- skipped_iso_dirs=0
- skipped_missing_folders=0
- skipped_existing_iso=0 # 新增:已存在同名ISO文件的计数器
- success_count=0
- error_count=0
- for movie_dir in */; do
- # 检查是否是目录
- if [ -d "$movie_dir" ]; then
- ((total_dirs++))
- # 获取目录名(去掉末尾的斜杠)
- dir_name=${movie_dir%/}
- echo "---------------------------------" | tee -a "$LOG_FILE"
- echo "处理目录 ($total_dirs): $dir_name" | tee -a "$LOG_FILE"
- # 检查是否存在.iso文件
- if find "$movie_dir" -maxdepth 1 -name "*.iso" -type f | grep -q .; then
- echo "跳过目录: 发现.iso文件" | tee -a "$LOG_FILE"
- ((skipped_iso_dirs++))
- continue
- fi
- # 检查是否存在BDMV和CERTIFICATE文件夹
- if [ -d "${movie_dir}BDMV" ] && [ -d "${movie_dir}CERTIFICATE" ]; then
- ((processed_dirs++))
- # 提取电影名称(年份之前的部分)
- movie_name="$dir_name"
- # 使用Bash正则表达式查找第一个4位数字(年份)
- if [[ "$dir_name" =~ ([0-9]{4}) ]]; then
- year=${BASH_REMATCH[1]}
- # 查找年份在原始字符串中的位置
- year_pos=$(echo "$dir_name" | grep -b -o "$year" | head -1 | cut -d':' -f1)
- if [ -n "$year_pos" ] && [ "$year_pos" -gt 0 ]; then
- # 提取年份之前的部分
- movie_name="${dir_name:0:$year_pos}"
- # 清理电影名称末尾的特殊字符
- movie_name=$(echo "$movie_name" | sed 's/[._ -]*$//')
- else
- echo "警告: 无法准确定位年份位置,使用完整名称" | tee -a "$LOG_FILE"
- fi
- else
- echo "警告: 无法在 $dir_name 中找到年份,使用完整名称" | tee -a "$LOG_FILE"
- fi
- # ISO卷标长度限制(最多32个字符)
- if [ ${#movie_name} -gt 32 ]; then
- echo "警告: 电影名称 '$movie_name' 超过32个字符,将被截断" | tee -a "$LOG_FILE"
- movie_name=${movie_name:0:32}
- fi
- # 生成ISO文件名
- iso_file="/mnt/${dir_name}.iso"
- echo "提取的电影名称: $movie_name" | tee -a "$LOG_FILE"
- echo "将生成ISO文件: $iso_file" | tee -a "$LOG_FILE"
- # 检查是否已存在同名的ISO文件
- if [ -f "$iso_file" ]; then
- echo "跳过: 已存在同名ISO文件: $iso_file" | tee -a "$LOG_FILE"
- ((skipped_existing_iso++))
- continue
- fi
- # 使用mkisofs生成标准DVD ISO文件
- echo "开始生成ISO..." | tee -a "$LOG_FILE"
- # 使用mkisofs生成标准DVD格式的ISO,开启debug模式
- #mkisofs -v -debug -o "$iso_file" -allow-limited-size -J -R -V "$movie_name" -dvd-video "${movie_dir}BDMV" "${movie_dir}CERTIFICATE" >> "$LOG_FILE" 2>&1
- #mkisofs -v -debug -o "$iso_file" -allow-limited-size -J -R -V "$movie_name" -dvd-video "${movie_dir}" >> "$LOG_FILE" 2>&1
- mkisofs -v -debug -udf -allow-limited-size -input-charset "utf-8" -o "$iso_file" -J -R -V "$movie_name" "${movie_dir}" >> "$LOG_FILE" 2>&1
- # 检查命令执行状态
- if [ $? -eq 0 ]; then
- echo "成功: 生成ISO: $iso_file" | tee -a "$LOG_FILE"
- ((success_count++))
- else
- echo "错误: 生成ISO失败: $iso_file" | tee -a "$LOG_FILE"
- ((error_count++))
- fi
- else
- echo "跳过目录: 缺少BDMV或CERTIFICATE文件夹" | tee -a "$LOG_FILE"
- ((skipped_missing_folders++))
- fi
- fi
- done
- # 打印总结
- echo "===================================" | tee -a "$LOG_FILE"
- echo "转换过程完成" | tee -a "$LOG_FILE"
- echo "总共扫描目录数: $total_dirs" | tee -a "$LOG_FILE"
- echo "处理目录数: $processed_dirs" | tee -a "$LOG_FILE"
- echo "跳过的包含ISO文件的目录数: $skipped_iso_dirs" | tee -a "$LOG_FILE"
- echo "跳过的缺少必要文件夹的目录数: $skipped_missing_folders" | tee -a "$LOG_FILE"
- echo "跳过的已存在同名ISO文件数: $skipped_existing_iso" | tee -a "$LOG_FILE" # 新增统计
- echo "成功生成ISO数: $success_count" | tee -a "$LOG_FILE"
- echo "生成ISO失败数: $error_count" | tee -a "$LOG_FILE"
- echo "详细日志请查看: $LOG_FILE" | tee -a "$LOG_FILE"
- echo "===================================" | tee -a "$LOG_FILE"
- # 返回状态码
- if [ $error_count -gt 0 ]; then
- exit 1
- else
- exit 0
- fi
Advertisement
Comments
-
在 docker 的 container 里,安装
mkisofs
(debian 下apt install genisoimage
) 。
然后执行上述脚本。
实现的几个功能:- 默认是
/mnt
目录下的所有目录进行扫描 - 如果目录下有
*.is
o 文件,则跳过 - 仅对目录下,包含了
BDMV
和CERTVERRIFIED
,进行转换,将会转换为 ISO - 转换为 *.iso 的文件,文件名使用前述的目录名;而生成的 ios 的
光盘 label
则是目录名称中年份之前的文字(年份,是指目录名中的第一个 4 个数字
) - 生成的 *.iso 默认存放位置,
与目录在同一级
,例如 /mnt 下面 - 如果在 /mnt 下存在同名的目录和 *.iso 则跳过转换
- 默认是
Add Comment
Please, Sign In to add comment
Advertisement