我正在寻找一种简单的方法(一个命令或一系列命令,可能涉及find
)来找到两个目录中的重复文件,并将一个目录中的文件替换为另一目录中的文件的硬链接。
情况如下:这是一个文件服务器,多个人在上面存储音频文件,每个用户都有自己的文件夹。有时,多个人拥有完全相同的音频文件的副本。现在,这些是重复的。我想使其成为硬链接,以节省硬盘空间。
我正在寻找一种简单的方法(一个命令或一系列命令,可能涉及find
)来找到两个目录中的重复文件,并将一个目录中的文件替换为另一目录中的文件的硬链接。
情况如下:这是一个文件服务器,多个人在上面存储音频文件,每个用户都有自己的文件夹。有时,多个人拥有完全相同的音频文件的副本。现在,这些是重复的。我想使其成为硬链接,以节省硬盘空间。
Answers:
http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl中有一个perl脚本,它可以完全满足您的要求:
遍历在命令行上命名的所有目录,计算MD5校验和并查找具有相同MD5的文件。如果它们相等,则进行比较,如果确实相等,则用指向第一个的硬链接替换两个文件中的第二个。
rdfind
可通过所有主要平台(os x,linux,(cyg)win,solaris)的软件包管理器使用,并且以惊人的本机速度工作。因此,请查看下面的答案。
[Errno 31] Too many links
。这似乎是唯一可以解决的问题。
rdfind
确实满足您的要求(并且按约翰尼为什么列出的顺序)。使删除重复项成为可能,并用软链接或硬链接替换它们。与symlinks
您结合使用还可以使符号链接成为绝对链接或相对链接。您甚至可以选择校验和算法(md5或sha1)。
由于它是经过编译的,因此它比大多数脚本解决方案要快:time
在15 GiB文件夹中,2009年我的Mac Mini上有2600个文件,返回
9.99s user 3.61s system 66% cpu 20.543 total
(使用md5)。
在大多数程序包处理程序中可用(例如,用于Mac OS X的MacPorts)。
rdfind
并且喜欢它。它具有一个-dryrun true
选项,可以让您知道它会做什么。使用硬链接替换重复项非常简单-makehardlinks true
。它产生了一个不错的日志,它让我知道释放了多少空间。另外,根据作者的基准,rdfind比duff和fslint快。
使用fdupes
工具:
fdupes -r /path/to/folder
为您提供目录中重复项的列表(-r使其递归)。输出看起来像这样:
文件
名1 文件名2
filename3
filename4
filename5
其中filename1和filename2相同,并且filename3,filename4和filename5也相同。
rdfind
式fdupes
,但速度更快,并且在OS X和Cygwin上也可用。
fdupes
似乎只能找到重复项,而不能用硬链接代替它们,因此不能解决IMO问题。
jdupes
的基于的工具fdupes
,但是它也可以用symlinks(-l
),hardlinks(-L
)替换重复的文件,或指示btrfs在文件系统级别(-B
如果使用btrfs的话)对数据块进行重复数据删除。
我hardlink
从http://jak-linux.org/projects/hardlink/使用
hardlink
现在是许多Linux软件包系统中的本机二进制文件(自2014年以来),而且速度非常快。对于1,2M个文件(320 GB),只用了200秒(链接了大约10%的文件)。
hardlink
由Julian Andres Klode创建,而Fedora hardlink
由Jakub Jelinek创建(来源:pagure.io/hardlink-Fedora软件包名称:hardlink)
由于您的主要目标是节省磁盘空间,因此还有另一种解决方案:在文件系统级别进行重复数据删除(可能还进行压缩)。与硬链接解决方案相比,它不存在无意影响其他链接文件的问题。
自从池版本23起,ZFS就已经降级(块级,而不是文件级),并且很久以前就进行了压缩。如果您使用的是Linux,则可以尝试zfs-fuse,或者如果您使用的是BSD,则本机支持。
btrfs
使用批处理或离线重复数据删除(在您认为有用/必要时运行它) btrfs.wiki.kernel.org/index.php/Deduplication
rsync --inplace
存储的第二个用户的音乐复制到克隆中,这样就只存储更改的块)
如今,在现代Linux上,存在https://github.com/g2p/bedup,该文件可在btrfs文件系统上进行重复数据删除,但是1)无需太多扫描开销,2)文件随后可以轻松地重新分散。
要查找重复文件,可以使用duff。
Duff是Unix命令行实用程序,用于快速查找给定文件集中的重复项。
只需运行:
duff -r target-folder
要自动创建到这些文件的硬链接,您将需要使用bash或其他某种脚本语言来解析duff的输出。
aptitude show hardlink
说明:硬链接相同文件的多个副本硬链接是一种检测同一文件的多个副本并将其替换为硬链接的工具。
这个想法来自http://code.google.com/p/hardlinkpy/,但是代码是从头开始编写的,并根据MIT许可获得了许可。主页:http : //jak-linux.org/projects/hardlink/
我已经使用了这里提到的许多用于Linux的硬链接工具。我在Ubuntu上也被ext4 fs所困扰,并且一直在使用它的cp -l和-s进行硬/软链接。但是最近在cp手册页中注意到了轻量级副本,这意味着在修改一侧之前要保留冗余磁盘空间:
--reflink[=WHEN]
control clone/CoW copies. See below
When --reflink[=always] is specified, perform a lightweight copy, where the
data blocks are copied only when modified. If this is not possible the
copy fails, or if --reflink=auto is specified, fall back to a standard copy.
cp
别名以--reflink=auto
现在始终包含参数
在我看来,首先检查文件名可以加快处理速度。如果两个文件缺少相同的文件名,那么在很多情况下,我不会认为它们是重复的。似乎最快的方法是按顺序进行比较:
请问有什么方法吗?看看duff
,fdupes
,rmlint
,fslint
,等。
以下方法是在commandlinefu.com上投票最多的:查找重复文件(首先基于大小,然后基于MD5哈希)。
第一步可以添加文件名比较,第二步可以添加文件大小比较吗?
find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | \
xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | \
sort | uniq -w32 --all-repeated=separate
install.sh
在活动的系统上可以找到多少个文件?我无法计算保存文件并发生名称冲突的次数,并且需要进行一些动态重命名来保存它。反面:不知道我在不同的日子从不同的来源下载了多少次,却发现它们是同一个文件,但名称不同。(这也破坏了时间戳的可靠性。)1:大小,2:摘要,3:字节内容。
由于我不喜欢Perl,因此这里是bash版本:
#!/bin/bash
DIR="/path/to/big/files"
find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt
OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
NEWSUM=`echo "$i" | sed 's/ .*//'`
NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
if [ "$OLDSUM" == "$NEWSUM" ]; then
echo ln -f "$OLDFILE" "$NEWFILE"
else
OLDSUM="$NEWSUM"
OLDFILE="$NEWFILE"
fi
done
这将查找具有相同校验和的所有文件(无论它们是大,小还是已经进行了硬链接),并将它们硬链接在一起。
对于重复运行,可以使用其他查找标志(例如大小)和文件缓存(因此您不必每次都重做校验和)进行极大地优化。如果有人对更智能,更长的版本感兴趣,可以将其发布。
注:如前所述,只要文件不需要修改或在文件系统之间移动,硬链接就可以工作。
rdfind
,即工作在本地的速度,只是要求brew install rdfind
或apt-get install rdfind
得到安装。
我制作了一个Perl脚本,它执行的操作与您所谈论的相似:
基本上,它只是遍历目录,计算其中的文件的SHA1sum,将其哈希化并将匹配链接在一起。它在许多场合都派上用场。
如果要在Mac或任何基于UNIX的系统上通过“硬链接”替换重复项,可以尝试SmartDupe http://sourceforge.net/projects/smartdupe/ 正在开发它
应用程序FSLint(http://www.pixelbeat.org/fslint/)可以在任何文件夹中找到所有相等的文件(按内容)并创建硬链接。试试看!
豪尔赫·桑帕约
jdupes
已在评论中提及,但应有自己的答案,因为它可能在大多数发行版中都可用并且运行非常快(它仅在大约一分钟的时间内释放了2.7 GB的158 GB完整分区(SSD驱动器)中的2.7 GB):
jdupes -rL /foo/bar
如果要进行硬链接,请注意该文件的权限。注意,所有者,组,模式,扩展属性,时间和ACL(如果使用的话)存储在INODE中。只有文件名不同,因为文件名存储在目录结构中,其他指向INODE属性。因此,链接到同一索引节点的所有文件名都具有相同的访问权限。您应该防止修改该文件,因为任何用户都可能将文件损坏。很简单。足够了,任何用户都可以使用相同的名称放置其他文件。然后保存索引节点号,并为所有硬链接名称破坏(替换)原始文件内容。
更好的方法是在文件系统层上进行重复数据删除。您可以使用BTRFS(上次非常流行),OCFS或类似方法。查看页面:https ://zh.wikipedia.org/wiki/Comparison_of_file_systems,特别是在表功能和列重复数据删除中。您可以单击它并进行排序:)
特别看看ZFS文件系统。这可以作为FUSE使用,但这种方式非常慢。如果需要本机支持,请查看页面http://zfsonlinux.org/。然后,您必须修补内核,然后安装用于管理的zfs工具。我不明白,为什么Linux不支持作为驱动程序,这是许多其他操作系统/内核的方法。
文件系统通过两种方式支持重复数据删除,即重复数据删除或块删除。ZFS支持块。这意味着,可以删除在同一文件中重复的相同内容。其他方法是对数据进行重复数据删除的时间,该时间可以是联机(zfs)或脱机(btrfs)。
注意,重复数据删除会消耗RAM。这就是为什么将文件写入通过FUSE挂载的ZFS卷会导致性能显着降低的原因。文档中对此进行了描述。但是您可以在线设置卷上的开/关重复数据删除功能。如果看到任何数据应进行重复数据删除,则只需将重复数据删除设置为开,将某些文件重写为任何临时文件,最后替换。之后,您可以关闭重复数据删除并恢复完整性能。当然,您可以将任何缓存磁盘添加到存储中。这可以是非常快速的旋转磁盘或SSD磁盘。当然这可以是很小的磁盘。在实际工作中,这是替换RAM的方法:)
在Linux下,您应该注意ZFS,因为并非所有功能都能正常工作,特别是在管理文件系统,制作快照等时,但是如果您进行配置而不更改它,则所有功能都可以正常工作。换句话说,您应该将linux更改为opensolaris,它本机支持ZFS :) ZFS的优点是,它既可以用作文件系统,又可以用作类似于LVM的volumen Manager。使用ZFS时不需要它。如果您想了解更多信息,请参阅文档。
注意ZFS和BTRFS之间的区别。ZFS更老,更成熟,不幸的是仅在Solaris和OpenSolaris下(不幸的是被oracle扼杀)。BTRFS较年轻,但上次获得了很好的支持。我建议使用新内核。ZFS具有在线重复数据删除功能,这会导致写入速度变慢,因为所有内容都是在线计算的。BTRFS支持离线重复数据删除。这样可以节省性能,但是当主机无关时,您可以定期运行用于重复数据删除的工具。BTRFS是在linux下本地创建的。也许这对您来说是更好的FS :)
btrfs
。有关选项(包括cp --reflink
选项)的出色讨论,位于:btrfs.wiki.kernel.org/index.php/Deduplication
硬链接可能不是最好的主意。如果一个用户更改了文件,则会同时影响两个文件。但是,删除硬链接不会同时删除两个文件。另外,我不能完全确定硬链接是否占用与同一文件的多个副本相同的空间(在硬盘上,而不是操作系统上)。根据Windows(带有Link Shell扩展),它们确实可以。当然,那是Windows,而不是Unix ...
我的解决方案是在一个隐藏的文件夹中创建一个“公用”文件,并用符号链接替换实际的重复项...然后,符号链接将嵌入元数据或备用文件流,该文件流仅记录两个“文件”彼此不同,例如,如果一个人想要更改文件名或添加自定义专辑封面或类似内容;它甚至可能在数据库应用程序之外很有用,例如安装同一游戏或软件的多个版本,并以最小的差异独立测试它们。
最简单的方法是使用特殊程序dupeGuru
作为文档说
删除选项
这些选项影响重复删除的发生方式。大多数时候,您不需要启用任何一个。
链接已删除的文件:
删除的文件将替换为指向参考文件的链接。您可以选择用符号链接或硬链接替换它。...符号链接是文件路径的快捷方式。如果原始文件被删除或移动,则链接断开。硬链接是指向文件本身的链接。该链接与“真实”文件一样好。仅当删除到文件的所有硬链接时,文件本身才会被删除。
在OSX和Linux上,完全支持此功能,但是在Windows下,它有点复杂。Windows XP不支持它,但是Vista和更高版本支持它。但是,要使该功能正常运行,dupeGuru必须以管理特权运行。