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

qdi*_*dii 29 deduplication filesystems hardlink

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

Izk*_*ata 24

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

fdupes

  • 这似乎是最受推荐/最知名的一种。
  • 它使用起来最简单,但它唯一的作用是删除重复项。
  • 为确保重复项实际上是重复项(同时不会永远运行),文件之间的比较首先按文件大小进行,然后是 md5 哈希,然后是逐字节比较。

示例输出(带有“显示大小”、“递归”选项):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile
Run Code Online (Sandbox Code Playgroud)

硬链接

  • 顾名思义,旨在用硬链接替换找到的文件。
  • 有一个--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
Run Code Online (Sandbox Code Playgroud)

达夫

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

示例输出(带有“递归”选项):

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

查找

  • 选项有一个不寻常的语法(意在模仿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
Run Code Online (Sandbox Code Playgroud)

  • 如果您有 _n_ 个文件具有相同的大小、首字节、_和_结束字节,但它们在其他方面都不同,则通过直接比较确定需要 _n_!配对比较。将它们全部散列然后比较散列可能要快得多,特别是对于大文件和/或大量文件。任何通过该过滤器的人都可以继续进行直接比较以进行验证。(或者只是使用更好的哈希开始。) (3认同)
  • “然后是 md5(默认)或 sha1。” [这并不意味着文件是相同的。](http://th.informatik.uni-mannheim.de/people/lucks/HashCollisions/) 由于计算哈希需要程序读取整个文件,所以它应该只需逐字节比较整个文件即可。也节省了 CPU 时间。 (2认同)

Kar*_*ran 7

Duplicate Commander是 Windows 上可能的解决方案:

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

特征:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...
Run Code Online (Sandbox Code Playgroud)

1

对于 Linux,您可以在此处找到 Bash 脚本。


Arn*_*e97 6

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

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

对于您的问题,您只需执行$ jdupes -L /path/to/your/files.

您可能希望从其GitHub 存储库克隆和构建最新源代码,因为该项目仍在积极开发中。 此处还提供了Windows 二进制文件。一些 Linux / BSD 发行版中提供了打包的二进制文件——实际上我是通过$ apt search.