帮助编写文件列表上的脚本

帮助编写文件列表上的脚本

我正在使用以下命令

 mkvmerge -o  newfile.mkv  1.mkv  +2.mkv  +3.mkv   +4.mkv  etc...

该命令会整理列表中的视频文件。通常我将此文件放在一个文件夹中,文件数量可以更改(并不总是像示例中那样为 4)。我想得到一个命令:

  1. 获取给定目录中的 mkv 文件列表
  2. 运行上面的命令。

基本上我知道如何获取列表,例如。 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(换行符)。

相关内容