Bash while循环等待任务完成

9

我有一个Bash脚本,我创建它用于处理文件夹及其子文件夹中的视频:

find . -type f -name '*.mkv' | while read file;
do
  ffmpeg -i $file ...
done
问题:while循环没有等待ffmpeg完成,而是继续迭代循环。结果是文件没有被处理。我需要一种方法让当前的while循环等待ffmpeg完成后再继续到下一个循环。或者另外一种方法是将这些项目排队。
编辑:所以,当迭代一组文件时,解决方案是向ffmpeg传递-nostdin参数。希望这能帮助任何其他可能遇到类似问题的人。
另外,文件->$file是复制/粘贴错误。

也许可以在ffmpeg命令的末尾使用&将进程放到后台运行? - squiguy
你的程序应该等待ffmpeg完成。你确定没有收到来自ffmpeg的错误(如无效参数)吗? - Mat
3
您所给出的循环应该等待每个内部命令运行,除非您在行末加上"&"符号。您有收到任何错误信息吗?尝试在内部命令前添加"echo"并在其后添加"sleep 1"来验证循环本身是否存在问题。例如,在您给出的命令行中,您使用了"file"而不是"$file"。 - user295691
4
-nostdin 选项添加到 ffmpeg 是否有帮助?它可能在 while 循环中读取所有剩余的输入。 - Barmar
4个回答

9

我知道我之前发布了这个问题,但是我已经找到了解决方案。感谢所有的回复。在使用ffmpeg时提供-nostdin参数就可以解决问题。它只会处理当前文件并在处理完后再转移到下一个文件。

ffmpeg的-nostdin选项避免尝试从标准输入读取用户输入,否则视频文件本身会被解释。

ffmpeg -i <filename> ... -nostdin

使用上述方法的最大优点是,如果输出中出现错误,您仍然可以继续使用冗长的语言来进行解释。
ffmpeg -i <filename> ... -nostdin -loglevel panic 

或者如果您想将输出报告到文件中,则可以使用以下方式:

# Custom log name (optional). Helpful when multiple files are involved.
# FFREPORT=./${filename}-$(date +%h.%m.%s).log
ffmpeg -i <filename> ... -nostdin -report

你也可以同时使用这两种方法。还要感谢@Barmar提供的解决方案!

3
我认为您错过了file前面的$符号,这很简单。
find . -type f -name '*.mkv' | while read file;
do
    ffmpeg -i $file ...
done

3
这对你有好处吗?
find . -type f -name '*.mkv' -exec ffmpeg -i {} \;

3

这是一个有趣的方法,我得尝试一下。谢谢!我发现提供ffmpeg参数-nostdin就可以解决问题。 - mac2017

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接