如何用硬链接替换所有重复的文件?


20

我有两个包含各种文件的文件夹。第一个文件夹中的某些文件在第二个文件夹中具有完全相同的副本。我想用一个硬链接代替那些。我怎样才能做到这一点?


2
请提供操作系统和文件系统。
史蒂文

好吧,我在ubuntu 15.04上使用了ext4,但是如果有人为另一个操作系统提供了答案,我相信它对于阅读此问题的人会有所帮助。
2015年

Answers:


20

我知道Linux的4种命令行解决方案。rdfind由于所有可用的选项,我首选的是这里列出的最后一个。

杜拜

  • 这似乎是最推荐/最知名的。
  • 这是最简单的使用方法,但唯一的作用是删除重复项。
  • 为了确保重复实际上是重复(无需花费很多时间运行),文件之间的比较首先按文件大小进行,然后按md5哈希进行,然后按字节进行比较。

样本输出(带有“显示大小”,“递归”选项):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

硬链接

  • 顾名思义,旨在将找到的文件替换为硬链接。
  • 有一个--dry-run选择。
  • 不指示如何比较内容,但与所有其他选项不同,它确实考虑了文件模式,所有者和修改时间。

示例输出(请注意我的两个文件的修改时间略有不同,因此在第二次运行中,我告诉它忽略它):

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

达芙

  • 查找用户随后要操作的文件;没有可用的动作。
  • 比较是按文件大小进行的,然后按sha1哈希进行。
    • 哈希可以更改为sha256,sha384或sha512。
    • 可以禁用哈希来进行逐字节比较

样本输出(带有“递归”选项):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • 选项具有不同寻常的语法(想模仿find吗?)。
  • 对重复文件采取的操作的几种选择(删除,建立符号链接,建立硬链接)。
  • 具有空运行模式。
  • 比较是按文件大小,然后是第一个字节,然后是最后一个字节,然后是md5(默认)或sha1。
  • 找到的文件排名使可以预测哪个文件被视为原始文件。

样本输出:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file

1
“然后是md5(默认)或sha1。” 这并不意味着文件是相同的。 由于计算哈希值要求程序始终读取整个文件,因此它应按字节比较整个文件。也节省了CPU时间。
endolith '16

@endolith这就是为什么您总是从空转开始,看看会发生什么……
Izkata

1
但是该软件的重点是为您识别重复文件。如果您必须手动仔细检查文件是否实际上是重复的,那就不好了。
endlith 2013年


2
如果您有n个文件,具有相同的大小,首字节结尾字节,但在其他方面都不同,则通过直接比较确定需要n个文件!配对比较。将它们全部散列然后比较散列可能会更快,尤其是对于大文件和/或大量文件。任何通过该过滤器的人都可以继续进行直接比较以进行验证。(或者只是使用更好的哈希值开始。)
Alan De Smet

6

在Windows上, Duplicate Commander是一种可能的解决方案:

Duplicate Commander是一个免费的应用程序,可让您在PC上查找和管理重复文件。Duplicate Commander具有许多功能和工具,可让您从这些重复项中恢复磁盘空间。

特征:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1个

对于Linux,您可以在这里找到Bash脚本。


2

Windows中的“ 重复和相同文件搜索器”是另一种解决方案:

重复和相同文件搜索器(Duplicate Searcher)是用于搜索重复文件(克隆)和指向同一文件的NTFS硬链接的应用程序。它搜索重复的文件内容,而不管文件名如何(使用真正的字节对字节比较)。此应用程序不仅允许删除重复的文件或将其移动到其他位置,还可以用NTFS硬链接替换重复的文件(唯一!)。

在此处输入图片说明


1

我的计算机上有一个漂亮的免费工具,名为Link Shell Extension。不仅对于创建“硬链接”和“符号链接”非常有用,而且对结点也是如此!此外,它还添加了自定义图标,使您可以轻松识别不同类型的链接,甚至包括安装之前已经存在的链接。例如,红色箭头表示“硬链接”,而绿色箭头表示“符号链接...”,而链则表示“结”。

不幸的是,我不久前卸载了该软件(大量安装了各种程序),因此我无法再手动创建链接,但是只要Windows检测到Hard,Symbol或Junction链接,图标仍会自动显示。


1

我强烈推荐jdupes。它是fdupes的增强型分支,还包括:

  • 一堆新的命令行选项,包括--linkhard-L简称
  • 对所有主要OS平台的本地支持
  • 速度据说比fdupes平均快7倍以上

对于您的问题,您可以执行$ jdupes -L /path/to/your/files

由于该项目仍在积极开发中,因此您可能想从其GitHub存储库中克隆并构建最新资源。 Windows二进制文件也在此处提供。打包的二进制文件在某些​​Linux / BSD发行版中可用-实际上我是通过第一次发现它的$ apt search

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.