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