Linux 递归转换嵌套文件夹中的文件

Linux 递归转换嵌套文件夹中的文件,linux,ffmpeg,Linux,Ffmpeg,我只想对一个与此非常类似的问题的答案发表评论,但我没有足够的代表。我正在寻找一种方法来更改这行代码: for i in *.mkv; do ffmpeg -i "$i" "${i%.*}.mp4"; done 这样它就包含了.avi文件,并且可以在嵌套的文件夹中进行搜索。我希望能够以/Videos为目标,让脚本自动穿过文件夹树进入/Videos/2016/January,转换该文件夹中包含的所有视频文件,然后对/Videos/2016/Junuary执行相同的操作,以此类推 提前谢谢 (以上代

我只想对一个与此非常类似的问题的答案发表评论,但我没有足够的代表。我正在寻找一种方法来更改这行代码:

for i in *.mkv; do ffmpeg -i "$i" "${i%.*}.mp4"; done
这样它就包含了.avi文件,并且可以在嵌套的文件夹中进行搜索。我希望能够以
/Videos
为目标,让脚本自动穿过文件夹树进入
/Videos/2016/January
,转换该文件夹中包含的所有视频文件,然后对
/Videos/2016/Junuary
执行相同的操作,以此类推

提前谢谢


(以上代码行的功劳归洛德内克比尔德(LordNeckBeard)所有。

利用洛德内克比尔德对的引用,我想出了以下解决方案:

find ./ -iname '*.avi' -o -iname '*.mkv' -exec bash -c 'ffmpeg -i "{}" -c:v libx265 -preset medium -crf 28 -c:a aac "{}".mp4' \;
测试和工作完全符合我的预期,因此它目前正在整个库中运行

如果要为转换后的文件指定与原始文件不同的名称,请参阅

如果希望以破坏性方式转换所有文件,请务必小心使用此命令:

find ./ -iname '*.avi' -o -iname '*.mkv' -exec bash -c 'ffmpeg -i "{}" -c:v libx265 -preset medium -crf 28 -c:a aac "{}".mp4 && rm "{}"' \;

注意:上面的命令不是防弹的,在转换过程完成之前删除了一些文件,这意味着我现在丢失了这些文件(感谢上帝提供了备份)。我使用一次性文件进行了测试,并确保在开始此过程之前有一个功能齐全的数据备份。

find-name*.mkv此命令从我的计算机中删除了大量文件。我现在花了一天的时间试图恢复这些文件。我建议将rm“{}”完全从这段代码中删除,以防有人像我一样匆忙复制它。另外,至少在OSX上,
find~/
以用户文件夹中的所有文件为目标,而不仅仅是搜索当前目录。如果有人犯了我以前犯过的同样错误,那么删除它可能是值得的。我注意到您提到您也丢失了一些文件,正如您所说的“感谢上帝提供了备份”。我必须说,这个答案可能对像我这样没有备份的人没有特别的帮助。@MysteryPancake在上述两个不同的场合,我警告读者自动化使用
rm
命令的极端风险。然后我继续发布答案的一个版本,它不会删除任何文件。我没有责任确保您在“匆忙复制”任何代码之前阅读答案的全部内容。提供的代码回答了所提出的问题,因此它将保持被接受的答案。我希望您已经学到了非常宝贵的一课。无论使用哪个版本,都会搜索用户文件夹
~/
,而不是当前目录。我认为至少更改此选项以搜索正确的目录是有用的,因为OP从未提到要搜索整个用户文件夹,而不仅仅是文件夹
/Videos