我正在使用以下命令
mkvmerge -o newfile.mkv 1.mkv +2.mkv +3.mkv +4.mkv etc...
该命令会整理列表中的视频文件。通常我将此文件放在一个文件夹中,文件数量可以更改(并不总是像示例中那样为 4)。我想得到一个命令:
- 获取给定目录中的 mkv 文件列表
- 运行上面的命令。
基本上我知道如何获取列表,例如。 FileList=$(ls *mkv)),但是我不知道如何获取文件名前面的“+”(不包括列表中的第一个)。
有人可以帮忙吗?
问候皮埃尔
答案1
LIST=''
for i in *.mkv; do
if [ -n "$LIST" ]; then LIST="$LIST +"; fi
LIST="$LIST$i"
done
mkvmerge -o newfile.mkv $LIST
测试列表是否为空;如果没有,则需要添加一个空格和+
。然后使用生成的列表运行命令。
答案2
和bash
shopt -s nullglob
shopt -s extglob
first_file=1.mkv
add_files=(!(${first_file%.mkv}).mkv)
printf "%s\n" "${first_file}" "${add_files[@]/#/+}"
1.mkv
+2.mkv
+3.mkv
+4.mkv
mkvmerge -o newfile.mkv "${first_file}" "${add_files[@]/#/+}"
答案3
该方法不使用循环。
另外,为了允许嵌入不可打印的字符(例如空格),ls -Q
请引用文件名
eval "$(ls -Q1 *.mkv | sed '1s/^/mkvmerge -o newfile.mkv /; 1!s/^/ +/' | tr -d '\n')"
请注意,该tr
操作作用于字节级别,因此将删除嵌入非 ascii 文件名字符中的 \x0D(换行符)。