目前,我正在尝试在我的linux服务器(Ubuntu 16.04)上运行命令来重新编码所有.mp4文件。但是我在文件夹和子文件夹中有很多文件,而且我将浪费大量时间手动运行这些命令

这是我的脚本:

for D in ./*; do
    if [ -d "$D" ]; then
        cd "$D"
        for i in *.mp4; do
            ffmpeg -i "$i" -codec copy -acodec copy -shortest -map 0:v -map 0:m:language:eng "${i%.*}.mp4"
        done
        cd ..
    fi
done

但是,我收到了这个错误:

Error: ENOENT: no such file or directory, stat '*.mp4'

我怎么解决这个问题?

谢谢。

分析解答

使用find。它为您处理sub-directory recursion。像这样:

find . -type f -name "*.mp4" -exec ffmpeg -i {} -codec copy -acodec copy -shortest -map 0:v -map 0:m:language:eng {}  \; -print
  • find将自动处理当前目录和所有sub-directories
  • -type f:仅搜索文件
  • `-name "*.mp4":只有mp4扩展名的文件
  • -exec COMMAND {} \;:对所有找到的文件执行该命令。 {}将替换为每个文件的文件名。 \;结束命令。
  • -print:将打印处理的文件

就您的代码而言,目录可能没有任何"*.mp4"文件,因此当您点击这样的目录时会出现no such file or directory, stat '*.mp4'错误。