查找重复文件的最快方法是什么?

查找重复文件的最快方法是什么?

我发现这个命令用于查找重复的文件,但它很长,让我很困惑。

例如,如果我删除-printf "%s\n",则什么也没有出现。为什么会这样?此外,他们为什么使用xargs -I{} -n1

有没有更简单的方法来查找重复的文件?

[4a-o07-d1:root/798]#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
0bee89b07a248e27c83fc3d5951213c1  ./test1.txt
0bee89b07a248e27c83fc3d5951213c1  ./test2.txt

答案1

您可以将其缩短:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

md5sum对找到的文件进行-exec操作,find然后sort执行操作以获取具有相同内容并以换行符分隔的uniq文件。md5sum

答案2

您可以使用复制品。从man fdupes

在给定路径中搜索重复文件。通过比较文件大小和 MD5 签名,然后逐字节比较来找到此类文件。

你可以这样称呼它fdupes -r /path/to/dup/directory,它会打印出一个受骗者列表。

更新

你可以尝试一下弗斯林特还。设置完 fslint 后,转到cd /usr/share/fslint/fslint && ./fslint /path/to/directory

答案3

如果您想了解原始命令,让我们一步一步地进行。

find -not -empty -type f

查找当前目录或其任何子目录中的所有非空文件。

   -printf "%s\n"

打印其尺寸。如果您删除这些参数,它将改为打印路径,从而破坏后续步骤。

 | sort -rn

按数字排序 ( -n),按相反顺序排序 ( -r)。不过,按升序排序并作为字符串而不是数字进行比较应该同样有效,因此您可以删除标志-rn

 | uniq -d

查找重复的连续行并仅保留这些行。

 | xargs -I{} -n1

对于输入的每一行(即出现多次的每个尺寸),执行以下命令,但替换{}为尺寸。对每行输入执行一次命令,而不是将多个输入传递给单个调用。

   find -type f -size {}c -print0

这是针对每个大小运行的命令:在当前目录中查找与该大小匹配的文件,以字符 ( c) 或更精确的字节给出。打印所有匹配的文件名,用空字节而不是换行符分隔,以便正确处理包含换行符的文件名。

 | xargs -0 md5sum

对于每个以 null 分隔的名称,计算所述文件的 MD5 校验和。这次我们允许将多个文件传递给md5sum.

 | sort

按校验和排序,因为uniq只考虑连续行。

 | uniq -w32 --all-repeated=separate

查找前 32 个字节(校验和;之后是文件名)一致的行。打印此类重复项的所有成员,并用换行符分隔不同的运行。

相比heemayl 建议的更简单的命令,这样做的好处是它只会校验具有相同大小的另一个文件的文件。它通过重复调用来弥补这一点find,从而多次遍历目录树。由于这些原因,此命令特别适合文件很少但很大的目录,因为在这些情况下,避免校验和调用可能比避免重复的树遍历更重要。

相关内容