如何使用嵌套循环访问文件夹/子文件夹/文件进行文件转换?

如何使用嵌套循环访问文件夹/子文件夹/文件进行文件转换?

在这样的结构中:

/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获取文件本身的名称以及它们的路径和扩展名。

相关内容