当运行以下命令行将多个 .mkv 文件转换为 .mp4 文件时,事情会出错。就好像脚本试图一次运行所有命令,或者它们以某种方式相互纠缠在一起,并且输出变得混乱。我不知道确切。当我刚刚运行这个时,只有第一个文件被转换。其他时候,我似乎得到了意外或随机的结果。
ls -1 *.mkv | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4"; done
Run Code Online (Sandbox Code Playgroud)
但是,如果我执行以下操作,事情会按预期进行:
ls -1 *.mkv | while read f; do echo ffmpeg -i \"$f\" -codec copy \"${f%.*}.mp4\"; done > script; bash script
Run Code Online (Sandbox Code Playgroud)
但为什么?它是什么ffmpeg
?这不会发生在 bash 循环和除ffmpeg
. 我想用一种简单的方法来做,而不需要转义引号、管道到脚本文件等。
che*_*ner 11
ffmpeg
也从标准输入读取,消耗用于read
. 重定向其输入/dev/null
:
... | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4" < /dev/null; done
Run Code Online (Sandbox Code Playgroud)
也就是说,不要ls
像这样读取输出。一个简单的 for 循环就足够了(并消除了原始问题)。
for f in *.mkv; do
ffmpeg -i "$f" -codec copy "${f%.*}.mp4"
done
Run Code Online (Sandbox Code Playgroud)