0

mp3 でいっぱいのフォルダーがあり、すべての id3 ユーザーテキスト フレーム (replaygain を除く) を削除したい - 私が書いたこのコードはそれを行いますが、見つかったタグごとに各ファイルをループして削除します。これにより、スクリプトは各 mp3 を複数回循環して、必要なタスクを実行します。

動作するコードは次のとおりです。

#!/usr/bin/env bash
userframes=`eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq`

SAVEIFS=$IFS
IFS=$'\n'
for f in $userframes; do
    eyeD3 --user-text-frame="$f:" *.mp3
done
IFS=$SAVEIFS

私はより効率的になり、変数の各エントリを次のように各 mp3 に対して 1 回使用したいと思います。

eyeD3 --user-text-frame="desc1:" --user-text-frame="desc2:" *.mp3

しかし、私はそれを行う方法を理解できません。変数のスイッチを使用してリストを一度に作成しようとすることで近づいたと思いますが、理解できない奇妙な文字エスケープの問題がいくつかあります。

eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq | sed -e "s|'|"'\\\'"'|g" | awk '{print "--user-text-frame=\x27" $0 ":\x27"}' | sed ':a;N;$!ba;s/\n/ /g'

これは次のようなリストを作成します (シングルの代わりにダブル クォーテーションを試し、ダブル クォーテーションをエスケープしました):

--user-text-frame='ALBUMARTISTSORT:' --user-text-frame='ASIN:' --user-text-frame='Album Artist Credit:' --user-text-frame='Artist Credit:' --user-text-frame='CATALOGNUMBER:' --user-text-frame='MusicBrainz Album Artist Id:' --user-text-frame='MusicBrainz Album Id:' --user-text-frame='MusicBrainz Album Release Country:' --user-text-frame='MusicBrainz Album Status:' --user-text-frame='MusicBrainz Album Type:' --user-text-frame='MusicBrainz Artist Id:' --user-text-frame='MusicBrainz Release Group Id:' --user-text-frame='Script:'

しかし、次のように変数として eyeD3 に渡すことができません。

frames=`eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq | sed -e "s|'|"'\\\'"'|g" | awk '{print "--user-text-frame=\x27" $0 ":\x27"}' | sed ':a;N;$!ba;s/\n/ /g'`

eyeD3 $frames *.mp3

エラーが発生するか

「eyeD3: エラー: 認識できない引数: クレジット:' アルバム アーティスト ID:' アルバム ID:' アルバム リリース国:' アルバム ステータス:' アルバム タイプ:' アーティスト ID:' リリース グループ ID:' 01 - Do The Joy.mp3 02 - Love.mp3 03 - So Light Is Her Footfall.mp3 04 - Be A Bee.mp3 05 - Missing The Light Of The Day.mp3 06 - 熱帯病.mp3 07 - 天国の光.mp3 08 - Night Hunter.mp3 09 - Sing Sang Sung.mp3 10 - 私のビートを食べる.mp3 11 - You Can Tell It To Everyone.mp3 12 - アフリカのベルベット.mp3"

または、引用符をエスケープしようとすると、既存のタグの上に重複したタグを追加することになります

'tag
tag

かつてあった場所

tag

多分私がやりたいことをする簡単な方法はありますか?

編集:

ヘルプによる eyeD3 コマンドの構文:

--user-text-frame DESC:TEXT
                    Set the value of a user text frame (i.e., TXXX). To
                    remove the frame, specify an empty value. e.g.,
                    --user-text-frame='SomeDesc:'

例として:

eyeD3 --user-text-frame='ALBUMARTISTSORT:' *.mp3

そのディレクトリ内のすべての mp3 から、説明 ALBUMARTISTSORT を持つユーザー テキスト フレーム タグを削除する必要があります。

1 つのファイルを含む eyeD3 からの典型的な出力 (*mp3 と入力すると、dir 内のすべての mp3 に対して複数のエントリが生成されます)

$ eyeD3 12\ -\ African\ Velvet.mp3 
12 - African Velvet.mp3 [ 6.82 MB ]
-------------------------------------------------------------------------------
Time: 03:51 MPEG1, Layer III    [ ~247 kb/s @ 44100 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: African Velvet
artist: Air
album: Love 2
recording date: 2009
track: 12       genre: Electronic (id 52)
disc: 1/1
BPM: 0
Publisher/label: Emi
Unique File ID: [http://musicbrainz.org] : c5981690-b9ef-45f4-a8ce-7696a75190fb
Comment: [Description: ] [Lang: eng]

Lyrics: [Description: ] [Lang: eng]

UserTextFrame: [Description: replaygain_album_gain]
-9.11 dB
UserTextFrame: [Description: replaygain_album_peak]
1.238762
UserTextFrame: [Description: replaygain_track_gain]
-7.69 dB
UserTextFrame: [Description: replaygain_track_peak]
1.026620
UserTextFrame: [Description: CATALOGNUMBER]
509999663960-3
UserTextFrame: [Description: Album Artist Credit]
Air
UserTextFrame: [Description: MusicBrainz Album Type]
album
UserTextFrame: [Description: MusicBrainz Album Artist Id]
cb67438a-7f50-4f2b-a6f1-2bb2729fd538
UserTextFrame: [Description: MusicBrainz Artist Id]
cb67438a-7f50-4f2b-a6f1-2bb2729fd538
UserTextFrame: [Description: Script]
Latn
UserTextFrame: [Description: ASIN]
B002G9TWQQ
UserTextFrame: [Description: Artist Credit]
Air
UserTextFrame: [Description: ALBUMARTISTSORT]
Air
UserTextFrame: [Description: MusicBrainz Release Group Id]
34961bd0-b55b-4e9c-97eb-99763419afc0
UserTextFrame: [Description: MusicBrainz Album Id]
7e445cb0-3df7-3c38-b318-d68713294ff8
UserTextFrame: [Description: MusicBrainz Album Status]
Official
UserTextFrame: [Description: MusicBrainz Album Release Country]
CA
-------------------------------------------------------------------------------
4

2 に答える 2

0

私は次のようなものを使用します

regex='UserTextFrame: [Description: (.*)]'
eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | while read; do
    [[ $REPLY =~ $regex ]] && echo "${BASH_REMATCH[1]}"
done | sort -u | while read frame; do
    eyeD3 --user-text-frame "$frame:" *.mp3 
done

パイプラインの最初の 3 つのステージは、あなたのものと同じです。次に、単純なwhileループと正規表現の一致を使用して、「説明」に続くテキストを閉じ括弧まで出力します。この while ループの出力は、すべての MP3 のすべての記述で構成されています。これは重複を排除するためにパイプされ、すべての MP3 から一意の各アイテムを削除する別のループにsort -u送られます。while

于 2014-03-12T19:27:25.593 に答える
0

変数を二重引用符で囲んでください

eyeD3 "$frames" *.mp3
于 2014-03-12T09:45:11.107 に答える