如何找到(并删除)重复文件

我有一个相当大的音乐收藏,里面有一些重复的文件。有没有办法找到重复的文件呢?至少可以通过哈希值来判断两个文件是否相同。
如果还能找到除了扩展名之外文件名相同的文件,那就更好了——我想我有一些歌曲既有mp3格式版本,又有ogg格式版本。
如果使用命令行是最简单的方式,我也很愿意使用。
12个回答

我用fdupes来做这个。它是一个命令行程序,可以通过sudo apt install fdupes从软件源安装。你可以像这样调用它:fdupes -r /dir/ect/ory,它会打印出一份重复文件的列表。fdupes还有一个GitHub上的README和一个维基百科文章,列出了一些更多的程序。


12它还有一个“-d”选项,让您选择要保留的副本,并删除其他副本(或者您可以全部保留)。 - Matthew Crumley
如何使用 -d 选项来解决我的问题?详细内容请参考这里 - John McKean Pruitt
fdupes能否列出重复的文件夹而不是重复的文件? - Anderson Green
不,我不这么认为。 - qbi
2你能详细解释一下如何在递归目录树中删除所有重复文件(只保留一个副本)吗?我希望能自动完成这个操作,也就是说,不需要每次都指定要保留哪个文件。系统应该自动选择其中一个副本。 - a06e
我在这里添加了一些关于该命令的更多解释:http://stackoverflow.com/a/31630565/54964。我希望有一个类似的静态文件,可以记住我之前的愿望,这样下次就不用再说哪些重复项不要删除了。 - Léo Léopold Hertz 준영
12使用fdupes -r . -d -N命令可以保存第一个实例并删除重复文件。我刚刚成功地使用fdupes . -d -N命令对单个文件夹进行了清理,但没有递归查找。 - Simon B
这似乎对所有音乐文件都不起作用。只有其中一些能正常播放。不确定原因是什么? - Daniel

列出可以在*nix下找到重复项并运行的程序/脚本/bash解决方案的清单:
1. dupedit: 一次比较多个文件,无需进行校验和。当多个路径指向同一文件时,避免将文件与自身进行比较。 2. dupmerge: 可在各种平台上运行(包括带有Cygwin的Win32/64、*nix、Linux等)。 3. dupseek: 使用经过优化的算法的Perl,以减少读取次数。 4. fdf: 基于Perl/c,在大多数平台上运行(包括Win32、*nix和可能的其他平台)。使用MD5、SHA1和其他校验算法。 5. freedups: shell脚本,可搜索您指定的目录。当找到两个相同的文件时,它们会被硬链接在一起。现在,这两个或更多文件仍然存在于各自的目录中,但数据只存储在磁盘上的一个副本中;两个目录条目都指向相同的数据块。 6. fslint: 具有命令行界面和图形界面。 7. liten: 纯Python去重命令行工具和库,使用md5校验和一种新颖的字节比较算法。(Linux、Mac OS X、*nix、Windows) 8. liten2: 对原始Liten的重写,仍然是命令行工具,但使用SHA-1校验和更快的交互模式。(Linux、Mac OS X、*nix) 9. rdfind: 少数几个根据输入参数(要扫描的目录)的顺序对重复文件进行排名的工具之一,以避免删除“原始/已知”的源文件(如果给定多个目录)。使用MD5或SHA1。 10. rmlint: 快速查找器,具有命令行界面和许多选项,可用于查找其他lint(使用MD5),自18.04 LTS起还提供了一个带有GUI的rmlint-gui软件包(可以通过rmlint --gui或从名为Shredder Duplicate Finder的桌面启动器启动)。 11. ua: Unix/Linux命令行工具,设计用于与find(等)配合使用。 12. findrepe: 免费的基于Java的命令行工具,旨在高效搜索重复文件,可以在zip和jar文件中搜索。(GNU/Linux、Mac OS X、*nix、Windows) 13. fdupe: 一个用Perl编写的小脚本,快速高效地完成工作。1 14. ssdeep: 使用上下文触发分段哈希算法识别几乎相同的文件。

5这些程序中有没有能够找到重复文件夹(而不仅仅是重复文件)的程序? - Anderson Green
5@AndersonGreen rmlint 可以找到重复的目录。rmlint -T dd - oligofren
对于Ubuntu来说,另一种方法是打开文件夹,使用搜索功能(Ctrl + F)查找特定的扩展名(例如.mp3),然后按文件名进行排序;这样可以手动删除重复文件,并同时显示重复文件的位置。 - axd
@axd 这只针对Ubuntu 桌面版... - Matthieu
1https://github.com/qarmin/czkawka/releases/ 可能值得添加到列表中。 - nutty about natty
_Czkawka_确实缺失,在这里添加了一个答案 - undefined

FSlint 有一个图形用户界面和其他一些特性。他们在常见问题解答中解释了重复检查算法:

1. exclude files with unique lengths
2. handle files that are hardlinked to each other
3. exclude files with unique md5(first_4k(file))
4. exclude files with unique md5(whole file)
5. exclude files with unique sha1(whole file) (in case of md5 collisions).

Fslint安装说明


12谢谢。请注意,命令名称是"fslint-gui",而命令行工具默认不在$PATH中 - 它们位于/usr/share/fslint/fslint目录下。当我运行fslint(通过/usr/lib/command-not-found)时,并没有得到关于它所在的软件包的帮助,这让我感到困惑。 - nealmcb
1@nealmcb 如果使用 sudo apt-get install fslint,当前安装会将 fslint-gui 放入路径中,因此我可以通过输入 fslint-gui 在任何地方运行它。你可以通过输入 which fslint-gui 来找到 fslint-gui 的位置(它看起来像一个Python脚本)。 - user29020
3除了在20.04版本上没有安装候选项外,其他都可以。 :-( - John

如果您的去重任务与音乐相关,请先运行picard应用程序,以正确识别和标记您的音乐(即使它们的名称不正确,也能找到重复的.mp3/.ogg文件)。请注意,picard也可以作为Ubuntu软件包使用。
完成上述步骤后,根据musicip_puid标签,您可以轻松找到所有重复的歌曲。

我刚刚使用Picard更新了我的图书馆的元数据。然后我使用了fdupes -r -d -N命令来查找并删除重复文件。但是它仍然没有识别出很多重复文件。你是如何使用musicip_puid来完成这个任务的? - Daniel
从那时起已经过了好几年,我担心我没有继续关注皮卡德;我的音乐库已经安全归档,手机的媒体中包含了一些精选歌曲,而其他需求则由流媒体服务满足。我只能说我记得puid确实帮助我找到了类似的歌曲。很抱歉,目前我无法提供更多帮助。 - ΤΖΩΤΖΙΟΥ

另一个可以完成这个任务的脚本是rmdupe。根据作者的页面所述:
rmdupe使用标准的Linux命令在指定的文件夹中搜索重复文件,无论文件名或扩展名如何。在删除重复候选文件之前,它们会进行逐字节比较。rmdupe还可以将重复文件与一个或多个参考文件夹进行比较,可以将文件移到回收站而不是直接删除,允许自定义删除命令,并且可以限制搜索指定大小的文件。rmdupe还包括模拟模式,可以报告给定命令将执行哪些操作,而不实际删除任何文件。

我使用komparator - sudo apt-get install komparator (Ubuntu 10.04+ ) - 作为图形界面工具,在手动模式下查找重复项。

你试过了吗?
finddup

或者
finddup -l

我猜应该没问题。

对于音乐相关的重复识别和删除,http://musicbrainz.org/ 的Picard和Jaikoz是最佳解决方案。我相信Jaikoz可以根据歌曲文件的数据自动为您的音乐添加标签。您甚至不需要歌曲的名称,它就能识别出歌曲并为其分配所有元数据。虽然免费版本一次只能为有限数量的歌曲添加标签,但您可以随时运行它多次。

jdupes

我发现jdupes非常简单且极快。

jdupes是一个用于识别和处理重复文件的程序,例如删除、硬链接、符号链接和块级去重(也称为“dedupe”或“reflink”)。它比大多数其他重复扫描器更快。它将数据安全性置于性能之上,同时还为专业用户提供了访问高级(有时危险)功能的权限。

# Search a single directory:
jdupes path/to/directory

# Search multiple directories:
jdupes directory1 directory2

# Search all directories recursively:
jdupes --recurse path/to/directory

# Search directory recursively and let user choose files to preserve:
jdupes --delete --recurse path/to/directory

# Search multiple directories and follow subdirectores under directory2, not directory1:
jdupes directory1 --recurse: directory2

# Search multiple directories and keep the directory order in result:
jdupes -O directory1 directory2 directory3

# EXclude files over 1M, sumarize info, recursive
jdupes -X size+=:1000k --summarize --recurse ~

dupeGuru有一个专门用于音乐的模式。这是一个跨平台图形用户界面程序,截至今天(2021年2月),它正在积极开发中,尽管目前不清楚哪些版本适用于哪些系统。请查阅其文档