循环调用需要很长时间才能完成的过程。我该如何摆脱它?

Loop calls process that takes a long time to complete. How do I break out of it?

我昨天在此处的帮助下找到了这个解决方案(它找到了要使用 HandBrakeCLI 处理的目录列表,并将结果放在硬编码目录中):

#!/bin/bash
source_dir=/Volumes/VolumeName
dest_dir=/Volumes/OtherName

export dest_dir # export allows use by subprocesses!

find "$source_dir" -type d -name "VIDEO_TS" -exec bash -c '
  for dir; do
    name=${dir%/VIDEO_TS}
    name=${name##*/}
    ./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v"
  done
' _ {} +

shell 脚本工作正常,但如果我试图通过终止主进程来停止它:

kill -9 <pid>

它似乎可以正常工作,但随后恢复正常并使用 find 生成的列表中的下一个文件调用 HandBrakeCLI。

有没有办法可靠地停止整个事情?我假设将来以某种方式调用 CLI queued/cached,但是有人可以解释一下发生了什么吗?

通过从查找中调用 bash,您的脚本变得不必要地复杂。我建议迭代 find.

的输出
#!/usr/bin/env bash

source_dir=/Volumes/VolumeName
dest_dir=/Volumes/OtherName

find "${source_dir}" -type d -name "VIDEO_TS" | while read dir; do
  name=${dir%/VIDEO_TS}
  name=${name##*/}
  ./HandBrakeCLI -i "${dir}" -o "${dest_dir}/${name}.m4v"
done

我发现按照@JonNailey 和 HandBrakeCLI(以及其他调用 ffmpeg 的进程)的建议,使用管道输送到 while 循环的查找存在问题:它 'sucks up' 来自 find 命令的所有输入并使环形。有关详细信息,请参阅 http://mywiki.wooledge.org/BashFAQ/089

我选择的解决方案是将此重定向放在调用 HandBrakeCLI 的行上:

</dev/null