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

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

我有两个文件夹,里面有各种文件。第一个文件夹中的一些文件在第二个文件夹中有完全相同的副本。我想用硬链接替换这些文件。我该怎么做?

答案1

我知道有 4 个 Linux 命令行解决方案。我首选的是这里列出的最后一个,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

查找

  • 选项具有不寻常的语法(旨在模仿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

答案2

我强烈推荐杰杜佩斯. 它是一个增强的分支重复项,还包括:

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

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

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

答案3

重复指挥官在 Windows 上可能有一个解决方案:

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

特征:

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

1

对于 Linux,你可以找到 Bash 脚本这里

答案4

我的电脑上有一个名为 Link Shell Extension 的免费工具,它不仅能很好地创建硬链接和符号链接,还能创建连接点!此外,它还添加了自定义图标,让您可以轻松识别不同类型的链接,甚至是安装前已经存在的链接;例如,红色箭头代表硬链接,绿色代表符号链接……而链条代表连接点。

不幸的是,我之前卸载了该软件(在批量卸载各种程序时),所以我无法手动创建任何链接,但是每当 Windows 检测到硬链接、符号链接或连接链接时,图标仍然会自动显示。

相关内容