2

我在这里发现循环调用过程需要很长时间才能完成。我该如何摆脱它?从 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
4

1 回答 1

1

尝试附加|| break

./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v" </dev/null || break
于 2016-01-30T14:43:05.213 回答