如何使用 trap 终止包含由 /dev/null 重定向提供的 ffmpeg 的循环?

How to use trap to terminate while loop containing ffmpeg fed by redirect from /dev/null?

我在这里 发现从 find 到调用 ffmpeg cli [HandBrakeCLI] 的 while 循环的管道将不会处理多个输入文件,因为 ffmpeg 有一个怪癖,它 'eats' 所有一次性输入列表和 'starves' 循环。

解决方案是根据 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

尝试追加|| break:

./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v" </dev/null || break