使用命令行从 MP3 文件中删除专辑封面

使用命令行从 MP3 文件中删除专辑封面

我想删除嵌入在一堆 MP3(数千个)中的专辑封面,但找不到命令行方法来执行此操作。我可以通过添加艺术lame,我可以添加或删除几乎任何其他标签,id3tag但我找不到一种方法来执行以下操作:

for file in **/*.mp3 do <remove image command> $file; done

有人知道我可能会投入什么吗<remove image command>

答案1

似乎没有一个好的解决方案,我想出的最好的解决方案是使用 ffmpeg 快速创建一个新文件。 @awesome14 提供的命令在我的系统上对我不起作用(大部分情况下是有效的,但它产生了许多错误,导致歌曲未被复制)。这是我想出的命令。

for song in **/*.mp3
   do NAME=$(echo ${song%/*} | sed -e 's|[/ ]|-|g’)
      ffmpeg -y -i $song -vn -c copy /path/NOART/"$NAME-"${song##*/}; 
done

这适用于 bash5 或 zsh shell。

  1. **/*.mp3当前目录下每个目录中与 .mp3 匹配的每个文件

  2. echo ${song%/*} | sed -e 's|[/ ]|-|g’将路径部分(不在文件名中)中的所有斜杠和空格转换为破折号

  3. —vn -c copy请勿复制视频(视频号),否则复制未修改的文件

  4. /path/NOART/"$NAME-"${song##*/}保存到路径,文件名设置为 NAME 变量和 $song 的基本名称。

  5. 输出文件名将类似于“10Cc-Look-Hear-Dressed To Kill.mp3”。

这样做的另一个优点是不会删除歌曲中的所有元数据,仅删除“视频”,在本例中是专辑封面艺术。

答案2

@BowlOfRed 正确地指出一个简单的答案 使用eyeD3 包他们的评论。如果只是一个文件的话

eyeD3 --删除所有图像文件名.mp3

并针对原始问题进行定制,

for file in **/*.mp3; do eyeD3 --remove-all-images "$file"; done

甚至

eyeD3 --remove-all-images **/*.mp3

当然,globstar必须设置“ ” shell 选项,“ **”才能像这些示例中那样工作。

答案3

您可以安装kid-cli,它可用于从 CLI 更改元数据标签。在看到这个问题之前,我从未用它来删除专辑艺术,但我想我已经弄清楚了如何:

for file in **/*.mp3 do (sleep 2; printf %s\\n 'set "Picture:" ""' save exit) | kid3-cli $file; done

尽管它是一个 cli 程序,但kid3-cli 旨在交互式使用。因此,命令应该以交互方式输入。另外,由于某种原因,除非有延迟,否则上述命令不起作用。如果您有一大堆文件需要处理,也许您可​​以通过在多个文件上并行运行该命令来缓解这种情况。

for file in **/*.mp3 do (:; (sleep 2; printf %s\\n 'set "Picture:" ""' save exit) | kid3-cli $file)&; done; wait

或者:

(sleep 2; printf %s\\n 'set "Picture:" ""' save exit; sleep 2) | kid3-cli *.mp3; done

在后一种情况下,kid3-cli 需要延迟命令也已通过管道输入。我不知道为什么,但至少您可以一次处理所有文件。

PS:我没有任何 mp3 文件来测试这个,所以我使用了一些 ogg/vorbis 文件。由于 ogg 使用与 mp3 (id3) 不同的标记系统(vorbis 注释),因此这在两种格式上可能效果相同。然而,无论如何,这*应该*适用于 mp3。

答案4

安装孩子3

$ pacman -Ss kid3
community/kid3 3.9.1-2 [installed]
    An MP3, Ogg/Vorbis and FLAC tag editor, KDE version

并运行脚本:

#!/bin/bash

for filename in ./*.mp3; do
    echo $filename
    kid3-cli -c 'set Picture ""' $filename
done

相关内容