ID3tag - 用于从文件名中提取元数据的脚本

ID3tag - 用于从文件名中提取元数据的脚本

我有以下录音目录:

foo - bar-202009.opus
unix - tilde-2020se.opus
stack - exchange-29328f.opus

我尝试从文件名设置元foo - bar.202009.opus (有一些不一致 - 所以简单的方法就是废弃-<6digitchars>.opus

song title = foo - bar 

使用 sed 进行报废,

$ ls | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g'

foo - bar
unix - tilde
stack - exchange

我使用id3tag来设置,synatx

id3tag --song=[tilte] [file]

我在目录中拥有所有这些,因此用 while & read 进行迭代,

ls | while read x; \
    do id3tag \
    $(echo \
    --song=\"$(echo $x | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')\"  \
    \"${x}\"
    ); \
    done

上面的问题是,输入文件中的空格导致 id3 解释为另一个文件(即使用 括起来\"${x}\"

所以现在输出,

foo
'bar"'
'"bar-202009.opus"'
.
.

有没有办法让 i3dtag 将带有空格的文件视为单个文件。

答案1

避免ls解析,一行。

#!/bin/sh

for file in *; do
    scrap="$(echo $file | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')"
    id3tag --song="${scrap}" "${f}"
done

答案2

我建议你不要试图让它成为一句台词:

ls | while read x; do
    x="$(echo $x | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')"
    id3tag --song="${x}"
done

annahri 提出的关于不解析输出的观点ls很好,所以你可以这样做

for x in *.opus; do
 .... the rest is the same

通过这种方法,子 shell 使用引号或将引号作为文字传递到 的位置更少id3tag

相关内容