2016-11-06 1 views
1

У меня есть файл с именем «01 - Welcome To The Jungle.mp3», и я хочу сделать eyeD3 -t "Welcome To the Jungle" 01 - Welcome To The Jungle.mp3, чтобы изменить тег всех файлов в папке. Я извлек из файла awk: «Добро пожаловать в джунгли»:Как использовать вывод awk в командной строке bash

#!/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, было бы лучше использовать родной замену Bash шаблон, чтобы извлечь заголовок, например:

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

Вам необходимо предотвратить разбиение слов на IFS (по умолчанию: пробел, табуляция, новая строка) оболочкой, так как ваше имя входного файла содержит пробелы. Типичным обходным путем является использование двойных кавычек вокруг расширения переменной.

Do:

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

Вы можете использовать здесь строку, <<<, чтобы избежать echo -ing:

for i in *.mp3; do eyeD3 -t <<<"$i" | ...; done 
Смежные вопросы