如何使用 Bash 脚本递归查找 .mov 文件并使用 ffmpeg 将其转换为 .mp4

如何使用 Bash 脚本递归查找 .mov 文件并使用 ffmpeg 将其转换为 .mp4

我在一家视频公司的 Mac 系统上工作,必须清理许多包含大型中间视频文件的文件夹和子文件夹。

因此,我一直在寻找使用 ffmpeg 将许多 .mov 文件批量转换为 h.264 .mp4 文件的方法。我找到了几个使用类似脚本进行批量转换的代码

for f in '*.mov';
   do ffmpeg -i $f -c:v libx264 -f mp4 "${%f.mov}.mp4" ; 
done

然而,这只适用于运行脚本的当前文件夹,而我正在寻找一种查找 .mov 文件的方法递归地,并将它们全部批量转换。

目前,对我来说有用的解决方案感觉有点蛮力;我只是使用查找并执行 ffmpeg;

 find . -name '*.mov' -type f -exec ffmpeg -i {} -c:v libx264 -f mp4 {}.mp4 

但是,我遇到的一个问题是,我似乎无法在此格式中用 .mp4 替换 .mov,因此输出会将 .mp4 添加到 {},文件最终为 *.mov.mp4

除此之外,我猜这不是最安全或最友好的批量渲染方式。

我想知道是否有一种更安全或更少终端密集的方法来为 ffmpeg 创建批处理,甚至可以解决我的命名问题,或者有一种方法可以让“for f in *mov”命令递归地查找最多 5 个文件夹深度的视频。

任何帮助将不胜感激。

答案1

这是一个简单的 bash 脚本,它可以执行您想要的操作(我认为):1)递归查找所有 MOV 文件并转换它们,2)正确地将 .mov 文件扩展名替换为 .mp4 文件扩展名。

#!/bin/bash
while read mov; do
  mp4=$(echo "$mov"|sed -e 's|\.mov$|.mp4|i')
  if [ "$mov" == "$mp4" ]; then
    echo "Failed to generate unique MP4 filename for file $mov"
    exit 1
  fi
  echo ffmpeg -i "$mov" -c:v libx264 -f mp4 "$mp4"
done < <(find . -type f -iname '*.mov')

如上所述,这实际上不会进行转换,它只是回显将要运行的 ffmpeg 命令。一旦您确定它会执行您想要的操作,只需从 ffmpeg 命令前面删除“echo”即可。

答案2

这有帮助吗?

for i in `find . -name "*.mov" -print0| xargs -0`; do echo ffmpeg -i $i -c:v libx264 -f mp4 ${i%.mov}.mp4; done

如果您对生成的 ffmpeg 命令满意,请删除回声。

这会考虑包含一个或多个空格的文件名(通过 -print0 和 xargs -0)

相关内容