Advertisement
bao3

mkisofs : BDMV to ISO

May 7th, 2025 (edited)
336
0
13 days
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.59 KB | Movies | 0 0
  1. #!/bin/bash
  2.  
  3. # 设置日志文件
  4. LOG_FILE="/mnt/conversion_log.txt"
  5.  
  6. # 清空日志文件
  7. > "$LOG_FILE"
  8.  
  9. echo "===================================" | tee -a "$LOG_FILE"
  10. echo "开始DVD ISO转换过程" | tee -a "$LOG_FILE"
  11. echo "日期时间: $(date)" | tee -a "$LOG_FILE"
  12. echo "===================================" | tee -a "$LOG_FILE"
  13.  
  14. # 检查mkisofs命令是否可用
  15. if ! command -v mkisofs &> /dev/null; then
  16.     echo "错误: mkisofs命令未找到,请安装必要的软件包" | tee -a "$LOG_FILE"
  17.     exit 1
  18. fi
  19.  
  20. # 遍历/mnt目录下的所有文件夹
  21. cd /mnt || { echo "错误: 无法进入/mnt目录" | tee -a "$LOG_FILE"; exit 1; }
  22.  
  23. # 计数器
  24. total_dirs=0
  25. processed_dirs=0
  26. skipped_iso_dirs=0
  27. skipped_missing_folders=0
  28. skipped_existing_iso=0  # 新增:已存在同名ISO文件的计数器
  29. success_count=0
  30. error_count=0
  31.  
  32. for movie_dir in */; do
  33.     # 检查是否是目录
  34.     if [ -d "$movie_dir" ]; then
  35.         ((total_dirs++))
  36.        
  37.         # 获取目录名(去掉末尾的斜杠)
  38.         dir_name=${movie_dir%/}
  39.        
  40.         echo "---------------------------------" | tee -a "$LOG_FILE"
  41.         echo "处理目录 ($total_dirs): $dir_name" | tee -a "$LOG_FILE"
  42.        
  43.         # 检查是否存在.iso文件
  44.         if find "$movie_dir" -maxdepth 1 -name "*.iso" -type f | grep -q .; then
  45.             echo "跳过目录: 发现.iso文件" | tee -a "$LOG_FILE"
  46.             ((skipped_iso_dirs++))
  47.             continue
  48.         fi
  49.        
  50.         # 检查是否存在BDMV和CERTIFICATE文件夹
  51.         if [ -d "${movie_dir}BDMV" ] && [ -d "${movie_dir}CERTIFICATE" ]; then
  52.             ((processed_dirs++))
  53.            
  54.             # 提取电影名称(年份之前的部分)
  55.             movie_name="$dir_name"
  56.            
  57.             # 使用Bash正则表达式查找第一个4位数字(年份)
  58.             if [[ "$dir_name" =~ ([0-9]{4}) ]]; then
  59.                 year=${BASH_REMATCH[1]}
  60.                
  61.                 # 查找年份在原始字符串中的位置
  62.                 year_pos=$(echo "$dir_name" | grep -b -o "$year" | head -1 | cut -d':' -f1)
  63.                
  64.                 if [ -n "$year_pos" ] && [ "$year_pos" -gt 0 ]; then
  65.                     # 提取年份之前的部分
  66.                     movie_name="${dir_name:0:$year_pos}"
  67.                    
  68.                     # 清理电影名称末尾的特殊字符
  69.                     movie_name=$(echo "$movie_name" | sed 's/[._ -]*$//')
  70.                 else
  71.                     echo "警告: 无法准确定位年份位置,使用完整名称" | tee -a "$LOG_FILE"
  72.                 fi
  73.             else
  74.                 echo "警告: 无法在 $dir_name 中找到年份,使用完整名称" | tee -a "$LOG_FILE"
  75.             fi
  76.            
  77.             # ISO卷标长度限制(最多32个字符)
  78.             if [ ${#movie_name} -gt 32 ]; then
  79.                 echo "警告: 电影名称 '$movie_name' 超过32个字符,将被截断" | tee -a "$LOG_FILE"
  80.                 movie_name=${movie_name:0:32}
  81.             fi
  82.            
  83.             # 生成ISO文件名
  84.             iso_file="/mnt/${dir_name}.iso"
  85.            
  86.             echo "提取的电影名称: $movie_name" | tee -a "$LOG_FILE"
  87.             echo "将生成ISO文件: $iso_file" | tee -a "$LOG_FILE"
  88.            
  89.             # 检查是否已存在同名的ISO文件
  90.             if [ -f "$iso_file" ]; then
  91.                 echo "跳过: 已存在同名ISO文件: $iso_file" | tee -a "$LOG_FILE"
  92.                 ((skipped_existing_iso++))
  93.                 continue
  94.             fi
  95.            
  96.             # 使用mkisofs生成标准DVD ISO文件
  97.             echo "开始生成ISO..." | tee -a "$LOG_FILE"
  98.            
  99.             # 使用mkisofs生成标准DVD格式的ISO,开启debug模式
  100.             #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
  101.             #mkisofs -v -debug -o "$iso_file" -allow-limited-size -J -R -V "$movie_name" -dvd-video "${movie_dir}"  >> "$LOG_FILE" 2>&1
  102.             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
  103.             # 检查命令执行状态
  104.             if [ $? -eq 0 ]; then
  105.                 echo "成功: 生成ISO: $iso_file" | tee -a "$LOG_FILE"
  106.                 ((success_count++))
  107.             else
  108.                 echo "错误: 生成ISO失败: $iso_file" | tee -a "$LOG_FILE"
  109.                 ((error_count++))
  110.             fi
  111.         else
  112.             echo "跳过目录: 缺少BDMV或CERTIFICATE文件夹" | tee -a "$LOG_FILE"
  113.             ((skipped_missing_folders++))
  114.         fi
  115.     fi
  116. done
  117.  
  118. # 打印总结
  119. echo "===================================" | tee -a "$LOG_FILE"
  120. echo "转换过程完成" | tee -a "$LOG_FILE"
  121. echo "总共扫描目录数: $total_dirs" | tee -a "$LOG_FILE"
  122. echo "处理目录数: $processed_dirs" | tee -a "$LOG_FILE"
  123. echo "跳过的包含ISO文件的目录数: $skipped_iso_dirs" | tee -a "$LOG_FILE"
  124. echo "跳过的缺少必要文件夹的目录数: $skipped_missing_folders" | tee -a "$LOG_FILE"
  125. echo "跳过的已存在同名ISO文件数: $skipped_existing_iso" | tee -a "$LOG_FILE"  # 新增统计
  126. echo "成功生成ISO数: $success_count" | tee -a "$LOG_FILE"
  127. echo "生成ISO失败数: $error_count" | tee -a "$LOG_FILE"
  128. echo "详细日志请查看: $LOG_FILE" | tee -a "$LOG_FILE"
  129. echo "===================================" | tee -a "$LOG_FILE"
  130.  
  131. # 返回状态码
  132. if [ $error_count -gt 0 ]; then
  133.     exit 1
  134. else
  135.     exit 0
  136. fi
  137.  
Advertisement
Comments
  • bao3
    16 days
    # Markdown 0.70 KB | 0 0

    在 docker 的 container 里,安装 mkisofs (debian 下 apt install genisoimage ) 。
    然后执行上述脚本。
    实现的几个功能:

    1. 默认是 /mnt 目录下的所有目录进行扫描
    2. 如果目录下有 *.iso 文件,则跳过
    3. 对目录下,包含了 BDMVCERTVERRIFIED ,进行转换,将会转换为 ISO
    4. 转换为 *.iso 的文件,文件名使用前述的目录名;而生成的 ios 的光盘 label 则是目录名称中年份之前的文字(年份,是指目录名中的第一个 4 个数字
    5. 生成的 *.iso 默认存放位置,与目录在同一级,例如 /mnt 下面
    6. 如果在 /mnt 下存在同名的目录和 *.iso 则跳过转换
Add Comment
Please, Sign In to add comment
Advertisement