我的问题是,出于某种原因,我有一些音乐曲目重复。但它们的名称并不相同。例如:
音乐/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 通过read
amd 逐行读取此行,并将每行移至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
,删除一个具有列出名称的文件。