2016-11-06 17 views
1

"01 - Welcome To The Jungle.mp3"というファイルがあり、そのフォルダ内のすべてのファイルのタグを変更するにはeyeD3 -t "Welcome To the Jungle" 01 - Welcome To The Jungle.mp3を実行します。私はawkでファイルから抜粋しました。「Welcome To The Jungle」: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として:

の操作を行います。あなたはecho -ingを避けるために、ここでは、文字列、<<<を活用することができます

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

すでに指摘している。

また、この例では、代わりにawk、 を使用することは、たとえば、タイトルを抽出するためにネイティブバッシュパターン置換を使用する方が良いでしょう:

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

です:

  • 終了時に.mp3を削除する
  • 最初の5文字を​​削除します(カウントプレフィックスNN -
+1

ありがとうございます@ヤノス!私はあなたがそれをすることができるかも知りませんでした! awkコマンドよりもはるかに直感的です! – JPJ

+0

いいえ、ありがとうございます。私は今それを理解していると思う。 – JPJ

1

入力ファイル名にスペースが含まれているため、IFS(デフォルト:スペース、タブ、改行)の単語分割をシェルで防止する必要があります。一般的な回避策は、変数展開を二重引用符で囲むことです。

for i in *.mp3; do eyeD3 -t <<<"$i" | ...; done 
関連する問題