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

The*_*One 48 command-line find centos files

我发现这个命令用于查找重复的文件,但它很长,让我感到困惑。例如,如果我删除 -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
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 66

你可以缩短它:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
Run Code Online (Sandbox Code Playgroud)

Do md5sumof found files on the -execaction of findthen sortand douniq得到相同的文件,md5sum用换行符分隔。

  • 这不是最快的。对于几个 GB 的大文件,无需对其进行整体散列。如果找到相同的散列,您可以先散列 N kB,然后再进行完整的散列。 (7认同)
  • 这种方法对我来说太慢了。处理嵌套目录中超过 380 GB 的 JPG 和 MOV 文件需要超过 90 分钟。使用 `ls -lTR` 加上以下 POSIX awk 脚本在 72 秒内处理相同的数据:https://github.com/taltman/scripts/blob/master/unix_utils/find-dupes.awk (4认同)
  • 为什么是 `-exec sh -c 'md5sum "$1"' _ {} \;` 而不是简单的 `-exec md5sum {} +`? (2认同)
  • “-dD”对“uniq”意味着什么? (2认同)

Rah*_*hul 54

您可以使用fdupes。来自man fdupes

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

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

更新

您也可以尝试使用fslint。设置fslint后,去cd /usr/share/fslint/fslint && ./fslint /path/to/directory


MvG*_*MvG 25

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

find -not -empty -type f
Run Code Online (Sandbox Code Playgroud)

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

   -printf "%s\n"
Run Code Online (Sandbox Code Playgroud)

打印其大小。如果删除这些参数,它将改为打印路径,从而中断后续步骤。

 | sort -rn
Run Code Online (Sandbox Code Playgroud)

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

 | uniq -d
Run Code Online (Sandbox Code Playgroud)

寻找重复的连续行并只保留那些。

 | xargs -I{} -n1
Run Code Online (Sandbox Code Playgroud)

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

   find -type f -size {}c -print0
Run Code Online (Sandbox Code Playgroud)

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

 | xargs -0 md5sum
Run Code Online (Sandbox Code Playgroud)

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

 | sort
Run Code Online (Sandbox Code Playgroud)

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

 | uniq -w32 --all-repeated=separate
Run Code Online (Sandbox Code Playgroud)

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

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