V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
SCGabriel
V2EX  ›  问与答

在 bash 脚本里用 find 命令和管道自动把文件名导入 ffmpeg 的 input 的时候,总有不完整或者错误的路径被导入 input,求大佬们帮忙看下问题

  •  
  •   SCGabriel · 2022-01-13 15:06:07 +08:00 · 1163 次点击
    这是一个创建于 1082 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #!/bin/bash
    clear
    read -p "请输入视频格式后缀[比如 mkv 或者 mp4]:"
    videotype=$REPLY
    read -p "请输入字幕格式后缀[比如 ass 或者 srt]:"
    subtype=$REPLY
    read -p "请输入字幕信息[比如制作字幕的字幕组或者语言信息,示例 白月字幕组简体中文(Simplified Chinese) ]:"
    subinfo=$REPLY
    read -p "请输入输出文件夹路径[输出文件夹路径请不要设置成当前文件夹或者当前文件夹的子文件夹]:"
    outputtotaldir=$REPLY
    find . -type d -exec mkdir -p $outputtotaldir/\{\} \; # 在输出文件夹建立与当前文件夹内一模一样的目录结构
    find . -type f -name "*.$videotype" -print0 | while read -r -d "" video # 查找所有.mkv 的视频文件并逐个将文件名写入$video 参数
    do
    	prevideo="${video#*/}" # 去掉$video 路径里面最左边的 /以及 /左边的字符
    	subtitle="$(echo "$video" | sed "s/.$videotype$/.$subtype/")" # 用 sed 命令将$line 参数里"xxx xxx.mkv"的文件名转换成 jpg 结尾"xxx xxx.ass"
    	output="$outputtotaldir/$(echo "$prevideo" | sed "s/.$videotype$/[chs\&eng].mkv/")"
    	ffmpeg -i "$video" -i "$subtitle" -map 0:v -map 0:a -map 1:s -metadata:s:s:0 language="$subinfo" -metadata:s:s:0 title="$subinfo" -c copy "$output"
    done
    

    自己写的一个简单 bash 脚本,就是想批量处理下视频省点力气。结果不知道为什么,这个脚本对零星几个视频文件执行起来一点错误也没有。但是视频数量一多,比如这批正在处理的 100 多个视频文件,就会时不时跳出来错误。

    而且错误原因全是 ffmpeg 的 input 被输入了不存在的文件路径,咱认为是管道传递过去的文件路径缺失不完整,但是完全不知道是什么原因,也不知道怎么修。。。报错的截图如下,求大佬们帮忙看下 https://s2.loli.net/2022/01/13/M58vsOBHWP6eSQI.jpg https://s2.loli.net/2022/01/13/xgZ6RwYmTSyvbQH.png https://s2.loli.net/2022/01/13/oKNkR1y3eGXnOLT.png

    9 条回复    2022-01-13 17:18:33 +08:00
    rationa1cuzz
        1
    rationa1cuzz  
       2022-01-13 15:59:31 +08:00   ❤️ 1
    没仔细看,把命令都打印出来,手动执行一遍看什么问题?
    mxT52CRuqR6o5
        2
    mxT52CRuqR6o5  
       2022-01-13 16:09:54 +08:00   ❤️ 1
    确定和数量有关系吗?你给的报错的那几个文件单独处理是没问题吗?
    pcmid
        3
    pcmid  
       2022-01-13 16:56:24 +08:00 via iPhone   ❤️ 1
    set -x 看看
    SCGabriel
        4
    SCGabriel  
    OP
       2022-01-13 17:05:56 +08:00
    GeruzoniAnsasu
        5
    GeruzoniAnsasu  
       2022-01-13 17:08:21 +08:00   ❤️ 1
    你这脚本里双引号套双引号了真的没问题吗……
    「输入了不存在的路径」 第一反应是有空格捣乱
    SCGabriel
        6
    SCGabriel  
    OP
       2022-01-13 17:08:37 +08:00
    @rationa1cuzz @mxT52CRuqR6o5 @pcmid
    报错的单独执行都没问题,刚刚群里有人出手帮忙看了下,其实是循环有问题,改了下就好了。
    咱萌新,就硬把一些代码拼凑在一起所以出错了,咱把改的贴出来算了

    ```bash
    #!/bin/bash
    clear
    read -p "请输入视频格式后缀[比如 mkv 或者 mp4]:"
    videotype=$REPLY
    read -p "请输入字幕格式后缀[比如 ass 或者 srt]:"
    subtype=$REPLY
    read -p "请输入字幕信息[比如制作字幕的字幕组或者语言信息,示例 白月字幕组简体中文(Simplified Chinese) ]:"
    subinfo=$REPLY
    read -p "请输入输出文件夹路径[输出文件夹路径请不要设置成当前文件夹或者当前文件夹的子文件夹]:"
    outputtotaldir=$REPLY
    find . -type d -exec mkdir -p $outputtotaldir/\{\} \; # 在输出文件夹建立与当前文件夹内一模一样的目录结构
    IFS_BAK=$IFS
    IFS=$'\n'
    for video in `find . -type f -name "*.$videotype"` # 查找所有.mkv 的视频文件并逐个将文件名写入$video 参数
    do
    prevideo="${video#*/}" # 去掉$video 路径里面最左边的 /以及 /左边的字符
    subtitle="$(echo "$video" | sed "s/.$videotype$/.$subtype/")" # 用 sed 命令将$line 参数里"xxx xxx.mkv"的文件名转换成 jpg 结尾"xxx xxx.ass"
    output="$outputtotaldir/$(echo "$prevideo" | sed "s/.$videotype$/[chs\&eng].mkv/")" # 用 sed 命令将$line 参数里"xxx xxx.mkv"的文件名转换成 jpg 结尾"xxx xxx[chs&eng].mkv"
    ffmpeg -i "$video" -i "$subtitle" -map 0:v -map 0:a -map 1:s -metadata:s:s:0 language="$subinfo" -metadata:s:s:0 title="$subinfo" -c copy "$output"
    done
    IFS=$IFS_BAK
    ```
    SCGabriel
        7
    SCGabriel  
    OP
       2022-01-13 17:09:59 +08:00
    @GeruzoniAnsasu 实际这个反而没有问题,ffmpeg 支持整个路径用双引号括起来输入,是咱循环有问题,群里有人帮改了下就行了,改过的贴上面了
    amrnxcdt
        8
    amrnxcdt  
       2022-01-13 17:12:46 +08:00
    应该是一些文件名含有特殊符号(比如空格或者斜杠)被 shell 转义了,当成是参数传入了 ffmpeg 。
    SCGabriel
        9
    SCGabriel  
    OP
       2022-01-13 17:18:33 +08:00
    @amrnxcdt 转义的问题咱昨天遇到了,但这个问题确实不是转义的问题。有人出手帮咱修正了,已经解决了,也谢谢您
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.