一次查找并删除多个硬盘上的重复文件

我有4个硬盘,想知道这四个硬盘(包括子目录)上的哪些文件是重复的。 不仅要在硬盘中检查,还要检查所有其他硬盘。

硬盘很大(3TB)因此必须高效(第一个文件名比校验和检查左右)

下面的脚本一次查找最多10个目录中的重复文件,在组合目录中查找重复项。

它应该比fdupes (运行fdupes -r )和fslint ; 在40GB的相对较小的目录中,本地存储,脚本花了5秒钟来创建一个欺骗列表,而fdupesfslint了更长的时间(~90 / 100秒)。 在相对较慢的外部USB驱动器上的较大目录(700GB,~350000文件)上,花了90分钟。 使用fdupes,它会超过200-250分钟,查看进度指示(这很好,下面的脚本没有显示进度),但我没有等到它一直。
我应该提一下,例如fslint提供了附加function,脚本没有(因为它),所以比较严格来说是创建dupes列表。

此外,速度取决于磁盘读取速度的一部分:我测试了几个介质(网络驱动器上的ao)有很大差异,特别是在较小的目录上,创建文件列表占据了相对较大的工作量(’时间)。

最重要的是,它不会是一个快速的工作,你可能会问自己目录是否不是太大。

这个怎么运作

当脚本找到重复项时,重复项列出如下:

 Creating file list... /home/jacob/Bureaublad/test2 Creating file list... /home/jacob/Bureaublad/foto Creating file list... /home/jacob/Bureaublad/Askubuntu Checking for duplicates (10790 files)... ------------------------------------------------------------ > found duplicate: test1.txt 2 /home/jacob/Bureaublad/test2/test1.txt /home/jacob/Bureaublad/test2/another directory/test1.txt ------------------------------------------------------------ 

等等

剧本

 #!/usr/bin/env python3 import os import sys total_filelist = [] total_names = [] def find_files(directory): l = []; l2 = [] for root, dirs, files in os.walk(directory): for file in files: l.append(file) l2.append(root+"/"+file) return (l, l2) i = 1 while i <= 10: try: dr = (sys.argv[i]) print("Creating file list...", dr) total_filelist = total_filelist+find_files(dr)[1] total_names = total_names+find_files(dr)[0] i = i+1 except IndexError: break print("Checking for duplicates ("+str(len(total_names)),"files)...") for name in set(total_names): n = total_names.count(name) if n > 1: print("-"*60,"\n> found duplicate:", name, n, "\n") for item in total_filelist: if item.endswith("/"+name): print(item) print("-"*60, "\n") 

将其复制到一个空文件中,将其另存为find_dupes.py并通过以下命令运行它:

 python3  

最多10个目录

脚本的更多选项

添加附加function相对简单; 将重复项移动到另一个目录,例如重命名等,这样您就可以手动或自动决定保留哪个文件。

如何使工作变得可行

你的目录似乎很大。 为了使作业合理可行,还有另一种更复杂的方法可以防止系统“窒息”:您可以将作业切换为每种文件类型的部分 ,而不是一次性对所有文件类型(扩展)执行作业。 对30.000文件目录的小测试减少了从appr的时间。 一个分机的20秒(所有文件)为0.3秒。

要使脚本只查找一种文件类型的副本,请替换脚本部分:

 def find_files(directory): l = []; l2 = [] for root, dirs, files in os.walk(directory): for file in files: l.append(file) l2.append(root+"/"+file) return (l, l2) 

通过:

 def find_files(directory): l = []; l2 = [] for root, dirs, files in os.walk(directory): for file in files: if file.endswith(".py"): # example .py extension l.append(file) l2.append(root+"/"+file) return (l, l2) 

查找发生的文件扩展名

要列出目录中所有正在发生的文件扩展名,可以使用以下脚本:

 #!/usr/bin/env python3 import sys import os l = [] for root, dirs, files in os.walk(sys.argv[1]): for f in files: if ( f.startswith("."), f.count(".") == 0, f.endswith("~"), ) == (False, False, False): l.append(f[f.rfind("."):]) for item in set(l): print(item) 

将其复制到一个空文件中,将其另存为find_extensions.py并通过以下命令运行它:

 python3  

示例输出:

 .txt .mp3 .odt .py .desktop .sh .ods 

如果您想使用function非常强大的GUI,请从软件中心尝试FSlint。

(我看到@lemonsqueeze在上面的评论中提到了这一点)。

以下是概述FSlint用法的答案: https ://askubuntu.com/a/472244/100356

我使用FSlint项目并找到完成的事情。

我需要通过CLI和屏幕运行所有内容,以便将所有这些内容整理到多个磁盘上

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -deletefind path1/2/3 -type d -empty -delete (去除空的或不完全复制的东西)
  3. /usr/share/fslint/fslint/findsn path1 path2 path3 (删除存储在不同磁盘上相同大小的同一目录下的所有内容)
  4. /usr/share/fslint/fslint/findup path1 path2 path3 (删除所有重复文件)
  5. find path1/2/3 -type d -empty -delete (去除findup后的空目录)

之后,我能够将所有磁盘作为组合驱动器再次安装到mhddfs而不会重复浪费磁盘空间