我有以下录音目录:
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
。