我想评论一个与此非常相似的问题的答案,但我没有足够的代表。我正在寻找一种方法来改变这行代码:
for i in *.mkv; do ffmpeg -i "$i" "${i%.*}.mp4"; done
因此它包含.avi文件,以便它可以搜索嵌套文件夹。我希望能够定位/Videos
并让脚本自动遍历文件夹树到/Videos/2016/January
,转换该文件夹中包含的所有视频文件,然后对/Videos/2016/February
执行相同操作等等。
提前致谢。
(以上代码行的信用证从Lord this帖子转到LordNeckBeard。)
答案 0 :(得分:2)
使用LordNeckBeard对find
的引用,我提出了以下解决方案:
find ./ -iname '*.avi' -o -iname '*.mkv' -exec bash -c 'ffmpeg -i "{}" -c:v libx265 -preset medium -crf 28 -c:a aac "{}".mp4' \;
完全按照我的预期进行测试和工作,因此它目前正在整个库中运行。
如果您希望为转换后的文件指定与原始文件不同的名称,请参阅Parameter Expansion。
如果您希望破坏性地转换所有文件,请使用以下命令非常小心:
find ./ -iname '*.avi' -o -iname '*.mkv' -exec bash -c 'ffmpeg -i "{}" -c:v libx265 -preset medium -crf 28 -c:a aac "{}".mp4 && rm "{}"' \;
注意:上面的命令不是防弹的,并且正在删除一些文件之前转换过程已经完成,这意味着我现在丢失了这些文件(感谢上帝用于备份)。我使用一次性文件进行了测试,并确保在开始此过程之前对数据进行了全面的功能备份。