【问题标题】:my linux bash script will not loop though all files我的 linux bash 脚本不会遍历所有文件
【发布时间】:2016-11-05 04:21:29
【问题描述】:

我是一个菜鸟,正在尝试为 Plex 构建一个后处理类型脚本。 在一些同事和谷歌的帮助下,我整理了以下脚本来将 mkv 文件转换为 mp4 文件。

该脚本是“找到”媒体目录中的所有文件并将它们转换为 mp4 文件。

它找到第一个,正确处理并退出 - 为什么? 我需要帮助让这个脚本循环。 我已经用这种方式编写了古怪的 find 命令,因此“find”命令将捕获带有空格的文件名,而 dirname 命令将起作用。

脚本---

find -L "/media/4tbdisk/test/" -type f -name '*.mkv' -print0 | while IFS=      read -r -d $'\0' FILE; do
echo "filename is ---" "$FILE";
DIR=$(dirname "${FILE}");
echo "directory is --" $DIR;
transcode-video --mp4 --quick "$FILE" --output "$DIR";
done

脚本会找到一个 mkv 文件并对其进行处理,但不会继续循环处理其余部分。 如果它找到的第一个文件已经被处理,“转码”脚本会说“输出文件存在......”并将继续到下一个,但在创建第一个 mp4 文件后它会停止

提前致谢 呵呵

【问题讨论】:

  • 在这里工作。我怀疑简化你的第一行会更好:find -L "/media/4tbdisk/test/" -type f -name '*.mkv' | while read -r FILE; do
  • 作为第一个测试,您可以尝试单独运行find -L "/media/4tbdisk/test/" -type f -name '*.mkv'(不运行-print0)以查看找到了多少文件
  • 试试transcode-video < /dev/null .....。 ffmpeg 和 mencoder 会吃掉标准输入并导致您所描述的问题,而且这个工具很可能是基于其中之一
  • find 命令有效并且会返回几个文件。

标签: linux bash


【解决方案1】:

您似乎正在使用这个transcode-video 脚本。它基于 HandbrakeCLI 和 mplayer,两者都倾向于过度消耗标准输入,从而在第一次迭代后打破 while read 循环(ex1ex2ex3ex4)。

您可以通过重定向来自 /dev/null 的输入来避免这种情况,这样它就不会消耗任何循环的输入:

find -L "/media/4tbdisk/test/" -type f -name '*.mkv' -print0 | while IFS=      read -r -d $'\0' FILE; do
echo "filename is ---" "$FILE";
DIR=$(dirname "${FILE}");
echo "directory is --" $DIR;
transcode-video < /dev/null --mp4 --quick "$FILE" --output "$DIR";
done

【讨论】:

  • "that other guy" 这行得通 :) :) :) :) :) :) :) -- 咧嘴一笑 -- 超级棒……你摇滚,是的,这就是我的剧本我正在使用,是的,它基于 HandBrake。谢谢一百万!!!!
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2017-09-10
  • 2015-10-14
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多