2016-11-06 83 views
1

我有一个名为“01 - Welcome To The Jungle.mp3”的文件,我想要eyeD3 -t "Welcome To the Jungle" 01 - Welcome To The Jungle.mp3修改文件夹中所有文件的标签。我从awk文件中提取:“欢迎来到丛林”:如何在bash命令行上使用awk的输出

#!/bin/bash 
for i in *.mp3 
do 
eyeD3 -t $(echo ${i} | awk -F' - ' '{print $2}' | awk -F'.' '{print $1}') ${i} 
done 

它不起作用。整个“$(echo S {i} ....)”和“$ {i}”都不能用于替换各个文件的名称。

回答

0

你需要仔细的报价可能会包含空格的变量,@heemayl已经指出。

另外,在本例中,代替使用awk, 这将是最好使用天然击模式替换来提取的标题,例如:

for file in *.mp3; do 
    title=${file%.mp3} 
    title=${title#?????} 
    eyeD3 -t "$title" "$file" 
done 

即:

  • 在端
  • 除去.mp3除去前5个字符(计数前缀NN -
+1

非常感谢你@janos!我甚至不知道你能做到这一点!它看起来比awk命令更直观! – JPJ

+0

不,谢谢。我想我现在明白了。 – JPJ

1

由于输入文件名包含空格,因此您需要通过shell防止在IFS(默认值:空格,制表符,换行符)处进行分词。典型的解决方法是在变量扩展周围使用双引号。

务必:

for i in *.mp3; do eyeD3 -t "$(echo "$i")" | ...; done 

您可以利用此字符串,<<<,避免echo -ing:

for i in *.mp3; do eyeD3 -t <<<"$i" | ...; done