我有一个装满 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 使用变量中的每个条目一次:
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 - Tropical disease.mp3 07 - Heaven's Light.mp3 08 - Night Hunter.mp3 09 - Sing Sang Sung.mp3 10 - 吃我的节拍.mp3 11 - 你可以告诉每个人.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 描述的用户文本框架标签
带有一个文件的 eyeD3 的典型输出(输入 *mp3 只会为目录中的所有 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
-------------------------------------------------------------------------------