次の録音ディレクトリがあります。
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
1行で解析を避けてください。
#!/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
。