Bash 在具有特定扩展名的所有文件夹和子文件夹中运行命令

Bash 在具有特定扩展名的所有文件夹和子文件夹中运行命令,bash,shell,ffmpeg,Bash,Shell,Ffmpeg,目前,我正在尝试在我的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

目前,我正在尝试在我的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 . -type f -name "*.mp4" -exec ffmpeg -i {} -codec copy -acodec copy -shortest -map 0:v -map 0:m:language:eng {}  \; -print
“查找”将自动处理当前目录和所有子目录 -键入f:仅搜索文件 `-name*.mp4:仅限扩展名为mp4的文件 -exec命令{}\;:对所有找到的文件执行该命令。{}将替换为每个文件的文件名。\;结束命令。 -打印:将打印已处理的文件 就您的代码而言,目录可能不包含任何*.mp4文件,因此当您点击此类目录时,会出现无此类文件或目录的stat'*.mp4'错误。

使用find进行此操作。它为您处理子目录递归。像这样:

find . -type f -name "*.mp4" -exec ffmpeg -i {} -codec copy -acodec copy -shortest -map 0:v -map 0:m:language:eng {}  \; -print
“查找”将自动处理当前目录和所有子目录 -键入f:仅搜索文件 `-name*.mp4:仅限扩展名为mp4的文件 -exec命令{}\;:对所有找到的文件执行该命令。{}将替换为每个文件的文件名。\;结束命令。 -打印:将打印已处理的文件
就您的代码而言,目录可能没有任何*.mp4文件,因此当您点击此类目录时,会出现无此类文件或目录的stat'*.mp4'错误。

示例无效,仅执行echo…:


您必须更换echo ffmpeg$src$dst与用于生产的命令行一起使用。您可以从示例中删除-print。

示例无效,仅执行echo…:


您必须更换echo ffmpeg$src$dst与用于生产的命令行一起使用。您可以从示例中删除-print。

您好,如何使用{}获取文件名而不使用扩展名?有时,.mp4应该转换为.mkv。如果我放置{}.mkv返回{filename}.mp4.mkv,您可以使用basename和dirname的组合。但是您只能使用{}一次。我将编写一个脚本,从{}接受文件名,计算新文件名,并调用FFmpeg。然后在find-execk中使用该脚本,而如果需要,计算新文件名的脚本是一个好主意,澄清一下,在某些情况下,find支持在一个命令中多次使用{}。GNU find支持在比POSIX更广泛的条件下对{}的多次使用。正如它目前编写的答案一样,该代码满足{}多次使用的POSIX条件。然而,像{}.mkv这样的表单需要GNU find或类似的格式。您好,如何使用{}而不使用扩展名来获取文件名?有时,.mp4应该转换为.mkv。如果我放置{}.mkv返回{filename}.mp4.mkv,您可以使用basename和dirname的组合。但是您只能使用{}一次。我将编写一个脚本,从{}接受文件名,计算新文件名,并调用FFmpeg。然后在find-execk中使用该脚本,而如果需要,计算新文件名的脚本是一个好主意,澄清一下,在某些情况下,find支持在一个命令中多次使用{}。GNU find支持在比POSIX更广泛的条件下对{}的多次使用。正如它目前编写的答案一样,该代码满足{}多次使用的POSIX条件。然而,像{}.mkv这样的表单需要GNUfind或类似的格式。