使用可变参数bash脚本在多个目录中执行命令

使用可变参数bash脚本在多个目录中执行命令

我有多个文件夹,每个文件夹都包含以下内容

  • 一个视频文件xFilename.mp4
  • 一个名为 的文件夹Subs,其中包含许多 srt 文件xFilename.srt

如何为每个文件夹bash执行mkvmerge命令,将每个 mp4 文件与其文件夹中的所有 srt 文件合并Subs,并输出与 mp4 文件同名的 mkv 文件。

就像是

for dir in ./* :
   if (there is an mp4 file) :
       name = "mp4 file name without the extension, dunno how to do that"
       mkvmerge -o ./"$dir"/"$name".mkv ./"$dir"/"$name".mp4 "$dir"/Subs/*.srt

如何在终端中写入?

答案1

修改你的伪代码:

for mp4file in */*.mp4; do
    [ ! -f "$mp4file" ] && continue
    mkvmerge -o "${mp4file%.mp4}.mkv" "$mp4file" "${mp4file%/*}/Subs"/*.srt
done

这里发生的情况是,我迭代在当前目录的任何子目录中找到的所有 MP4 文件,并对每个找到的文件执行该mkvmerge命令。

测试[ ! -f "$mp4file" ]是为了捕获没有文件与给定模式匹配的情况。如果条件为真(变量包含的名称不引用现有常规文件或常规文件的符号链接),则使用 跳过此迭代continue

扩展将从变量值的末尾${variable%pattern}删除最短的匹配子字符串。这意味着给定包含某个 MP4 文件的路径名,那么patternvariablemp4file

  • ${mp4file%.mp4}.mkv删除.mp4中路径名末尾的mp4file,并添加.mkv

  • ${mp4file%/*}/Subs删除路径名的文件名部分以及最后一个/,mp4file并将其添加/Subs到其末尾。

相关内容