在这样的结构中:
/home/me/Videos/Downloads/Videos/xml tutorials/Main/video1.mp4
/home/me/Videos/Downloads/Videos/xml tutorials/Main/video2.mp4
....
/home/me/Videos/Downloads/Videos/java tutorials/Main/video1.mp4
/home/me/Videos/Downloads/Videos/java tutorials/Main/video2.mp4
....
我需要转换视频并保存新文件,如下所示:
/home/me/Videos/Downloads/Videos/xml tutorials/Converted/video1.mp4
/home/me/Videos/Downloads/Videos/xml tutorials/Converted/video2.mp4
/home/me/Videos/Downloads/Videos/java tutorials/Converted/video1.mp4
/home/me/Videos/Downloads/Videos/java tutorials/Converted/video2.mp4
我想通过ffmpeg
运行嵌套循环来转换这些视频Folder/Subfolders/Videos
。
通过运行这个我可以循环遍历当前目录中的所有文件:
for f in *; do ffmpeg -i "$f" ... ; done
我怎样才能为此使用嵌套循环,以便 bash 本身可以自动浏览Videos/xml tutorials/main/
并执行转换,将它们放入Videos/xml tutorials/converted
,然后本身移动到Videos/java tutorials/main/
?
答案1
终于搞明白了,很可能有更高效/优化的方法,但目前不管怎样都行。但 ffmpeg 不接受名称中的空格,因此必须通过将空格替换为下划线来重命名所有名称。
在包含不同教程的“视频”文件夹中,运行此操作即可 -
for f in * ; do
for g in "$f"/Main/* ; do
ffmpeg -i "$g" -s 854x480 -c:v libx265 "$f"/Converted/$(basename $g)
done
done
这里,$f
获取文件夹的名称,然后$g
获取文件本身的名称以及它们的路径和扩展名。