Bash while 循环等待任务完成
Posted
技术标签:
【中文标题】Bash while 循环等待任务完成【英文标题】:Bash while loop wait until task has completed 【发布时间】:2012-12-09 08:42:34 【问题描述】:我创建了一个 bash 脚本,用于处理文件夹及其子文件夹中的视频:
find . -type f -name '*.mkv' | while read file;
do
ffmpeg -i $file ...
done
问题:不是等待 ffmpeg 完成的 while 循环,而是继续遍历循环。最终结果是,文件没有得到处理。我需要一种方法让当前的 while 循环迭代等到 ffmpeg 完成后再继续下一个。或者另一种方式来排队这些项目。
编辑:所以迭代一组文件时的解决方案是将 -nostdin 参数传递给 ffmpeg。希望这对可能遇到类似问题的其他人有所帮助。
还有文件 --> $file 是复制/粘贴错字。
【问题讨论】:
也许在ffmpeg
命令末尾使用&
将进程粘贴在后台?
你所拥有的应该等待 ffmpeg 完成。您确定您没有收到来自 ffmpeg 的错误(例如无效参数)吗?
您拥有的循环应该等到每个内部命令运行,除非您在行尾放置了&
。您收到任何错误消息吗?尝试在内部命令前加上“echo”并在其后添加 sleep 1,以验证循环本身没有问题。例如,在您提供的命令行中,您使用的是file
而不是$file
将-nostdin
选项添加到ffmpeg
有帮助吗?它可能正在读取 while 循环的所有其余输入。
谢谢巴马尔。成功了!
【参考方案1】:
我意识到我不久前发布了这个,但我找到了解决方案。感谢所有的回复。将 -nostdin 参数提供给 ffmpeg 就可以了。在移动到下一个文件进行处理之前,它将只处理当前文件。
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 的解决方案!
【讨论】:
【参考方案2】:我是一个恶毒的答案抢夺者。我找到了一个:
ffmpeg -i $file &
wait $!
感谢 puchu,这里:apply ffmpeg to many files
【讨论】:
这是一个有趣的方法,我必须尝试一下。谢谢!我发现提供 ffmpeg 参数 -nostdin 可以解决问题。【参考方案3】:这对你有好处吗?
find . -type f -name '*.mkv' -exec ffmpeg -i \;
【讨论】:
【参考方案4】:我认为这就像您在file
之前缺少$
一样简单。
find . -type f -name '*.mkv' | while read file;
do
ffmpeg -i $file ...
done
【讨论】:
以上是关于Bash while 循环等待任务完成的主要内容,如果未能解决你的问题,请参考以下文章