我有多个文件夹,每个文件夹都包含以下内容
- 一个视频文件
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 文件的路径名,那么pattern
variable
mp4file
${mp4file%.mp4}.mkv
删除.mp4
中路径名末尾的mp4file
,并添加.mkv
。${mp4file%/*}/Subs
删除路径名的文件名部分以及最后一个/
,mp4file
并将其添加/Subs
到其末尾。