如何查找并删除重复的音乐曲目?

如何查找并删除重复的音乐曲目?

我的问题是,出于某种原因,我有一些音乐曲目重复。但它们的名称并不相同。例如:

音乐/Prefuse 73/One Word Extinguisher/07. Detchibe.mp3

&

音乐/Prefuse 73/One Word Extinguisher/07 - Detchibe.mp3

注意,它们是重复的歌曲,但 07** & 07-正在欺骗基于文件名搜索的重复文件查找器。

答案1

你可以使用fdupes类似问题的答案»如何查找和删除重复文件«建议。我举个例子:

mkdir -p "Music/Prefuse 73/One Word Extinguisher/"
dd if=/dev/urandom of=Music/Prefuse\ 73/One\ Word\ Extinguisher/07.Detchibe.mp3 bs=1023 count=2048
  2048+0 records in
  2048+0 records out
  2095104 bytes (2.1 MB) copied, 0.379806 s, 5.5 MB/s
cp Music/Prefuse\ 73/One\ Word\ Extinguisher/07.Detchibe.mp3 Music/Prefuse\ 73/One\ Word\ Extinguisher/"07 - Detchibe.mp3"
fdupes -rd .
  [1] ./Music/Prefuse 73/One Word Extinguisher/07.Detchibe.mp3
  [2] ./Music/Prefuse 73/One Word Extinguisher/07 - Detchibe.mp3

  Set 1 of 1, preserve files [1 - 2, all]:

首先,我创建了如示例中所示的目录。然后,我用随机数据创建了一个文件,并将其内容复制到另一个文件中。当我运行时,fdupes -rd软件会找到两个完全相同的文件并询问要删除哪一个。

如果您有大量文件,则可以使用选项-1.fdupes将所有重复项打印在一行上。您可以使用xargs和其他 shell 功能来处理它们。

答案2

我找到了一个相当简单的命令链。非常感谢@Oli。

fdupes -rf --quiet ~/Desktop/Dupes2/ | while read i; do mv "$i" ~/Desktop/Dupes/ ; done

这用于fdupes递归 ( -r) 查找重复项,省略第一个 ( -f)。 Bash 通过readamd 逐行读取此行,并将每行移至mv将所有重复项移动到另一个目录。请注意,在循环中使用引号while来处理无法处理的空格和其他可疑标点符号fdupes(即使使用-1/也是如此--sameline)。

答案3

在回答在 Banshee 中手动设置曲目收听数量?,它描述了如何获取 banshee 用于保存所有曲目信息的数据库。

连接到数据库后,在执行查询表上粘贴

select tweaked_track, count(*) from 
  (select replace(replace(replace(title, ' ', ''), '-', ''), '.', '') as tweaked_track 
   from coretracks) 
group by tweaked_track 
order by 2, 1 desc;

进入 SQL 字符串框,然后单击“执行查询”。这将显示所有具有相同标题的曲目,忽略空格、破折号和句点。如果还有其他要忽略的字符,请按照相同的模式将它们添加到查询中。(即replace(在该行的第一个现有“替换”之前和最后一个“)”之后添加,添加, '[character you want removed]', '')

(我不知道您对 SQL 了解多少 - 如果您需要更多详细信息,请发表评论。)

这将为您提供标题列表。您必须亲自执行删除操作。

可能有更好的方法可以做到这一点,但如果有,我不知道。

一旦你有一份要删除的文件列表(无论是通过我的方法还是fdupes其他人提到的方法),将要删除的文件列表放入文本目录中。确保以下之一为真:

选项 #1:文件名包含完整路径。例如,文件可能包含:

/home/doneill/music/weird_al/duped_file.mp3
/home/doneill/music/weird_al/another_dupe.mp3
/home/doneill/music/bach/baroque_dupe.mp3

选项 #2:文件名包含相对路径,并且包含文件名列表的文件保存在父文件夹中。例如,如果您的文件列表保存在 中/home/doneill/music/,它将包含:

weird_al/duped_file.mp3
weird_al/another_dupe.mp3
bach/baroque_dupe.mp3

无论哪种情况,打开一个终端窗口,然后更改为包含列表文件的文件夹 cd /home/doneill/music/

输入:

for a in `cat filelist.txt`; do echo $a; done

(将 filelist.txt 替换为包含列表的文件的名称)。这将列出您要删除的所有文件的列表。花点时间仔细检查列表。如果正确,请输入:

for a in `cat filelist.txt`; do rm $a; done

这基本上告诉你的计算机:对于文件中的每一行filelist.txt,删除一个具有列出名称的文件。

相关内容