我在这里发现循环调用过程需要很长时间才能完成。我该如何摆脱它?从 find 到调用 ffmpeg cli [HandBrakeCLI] 的 while 循环的管道将不会处理多个输入文件,因为 ffmpeg 有一个怪癖,它会一次性“吃掉”所有输入列表并“饿死”循环。
解决方案是根据http://mywiki.wooledge.org/BashFAQ/089从/dev/null重定向,并且效果很好。然而,它让我回到了最初的问题和我要解决的问题:
因为 /dev/null 现在有一个完整的列表,包含所有提供给 HandBrakeCLI 的文件,ctrl-c 本身不足以退出循环。
我已经尝试了各种陷阱排列,但除了停止 HandBrakeCLI 处理当前输入之前,我无法让它做任何事情,然后再继续下一个。它不是立即终止循环,而是在 HandBrakeCLI 行之后立即处理 mv。
所以,有两件事我在这里没有得到: 1. 如何使用 ctrl-c 或 kill 命令终止所有内容?2、如(1.)未处理,如何防止循环内的mv被执行?
为了解决这个问题,这是代码的简化版本:
#!/bin/bash
source_dir="/Volumes/Volumename"
dest_dir="/Volumes/Volumename/Converted/"
finished_dir="Volumes/Volumename/Processed/"
find "$source_dir" -type d -name "VIDEO_TS" | while read -r dir; do
name=${dir%/VIDEO_TS}
mov_dir=${dir%/*}
name=${name##*/}
./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v" </dev/null
mv "$mov_dir" "finished_dir"
done