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

ls1行で解析を避けてください。

#!/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

このように、サブシェルは引用符を使用したり、引用符をリテラルに渡したりする場所が少なくなりますid3tag

関連情報