![有没有一种简单的方法可以用硬链接替换重复的文件?](https://linux22.com/image/41961/%E6%9C%89%E6%B2%A1%E6%9C%89%E4%B8%80%E7%A7%8D%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E7%94%A8%E7%A1%AC%E9%93%BE%E6%8E%A5%E6%9B%BF%E6%8D%A2%E9%87%8D%E5%A4%8D%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在寻找一种简单的方法(一个命令或一系列命令,可能涉及find
)来查找两个目录中的重复文件,并将一个目录中的文件替换为另一个目录中文件的硬链接。
情况是这样的:这是一个文件服务器,多人在其上存储音频文件,每个用户都有自己的文件夹。有时,多个人拥有完全相同的音频文件的副本。现在,这些都是重复的。我想让它们成为硬链接,以节省硬盘空间。
答案1
rdfind
完全符合您的要求(并且按顺序约翰尼为什么列表)。可以删除重复项,用软链接或硬链接替换它们。结合symlinks
您还可以使符号链接成为绝对或相对。您甚至可以选择校验和算法(sha256、md5 或 sha1)。
由于它是经过编译的,因此比大多数脚本解决方案更快:time
在 2009 年的 Mac Mini 上包含 2600 个文件的 15 GiB 文件夹中返回此
9.99s user 3.61s system 66% cpu 20.543 total
(使用 md5)。
在大多数包处理程序中可用(例如 Mac OS X 的 MacPorts)。
编辑:我可以补充一点,rdfind 真的很容易使用/非常有教学意义。只需使用该-dryrun true
标志,它就会非常直观,并不可怕(在我看来,删除文件的工具通常都是这样)。
答案2
使用fdupes
工具:
fdupes -r /path/to/folder
为您提供目录中重复项的列表(-r 使其递归)。输出如下所示:
文件名1
文件名2
文件名3
文件名4
文件名5
文件名 1 和文件名 2 相同,文件名 3、文件名 4 和文件名 5 也相同。
答案3
有一个 perl 脚本位于http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl这正是你想要的:
遍历命令行中指定的所有目录,计算 MD5 校验和并查找具有相同 MD5 的文件。如果它们相等,则进行真正的比较,如果它们确实相等,则用指向第一个文件的硬链接替换两个文件中的第二个文件。