一次查找并删除多个硬盘上的重复文件
我有4个硬盘,想知道这四个硬盘(包括子目录)上的哪些文件是重复的。 不仅要在硬盘中检查,还要检查所有其他硬盘。
硬盘很大(3TB)因此必须高效(第一个文件名比校验和检查左右)
下面的脚本一次查找最多10个目录中的重复文件,在组合目录中查找重复项。
它应该比fdupes
(运行fdupes -r
)和fslint
; 在40GB的相对较小的目录中,本地存储,脚本花了5秒钟来创建一个欺骗列表,而fdupes
和fslint
了更长的时间(~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和屏幕运行所有内容,以便将所有这些内容整理到多个磁盘上
-
sudo apt-get install fslint
-
find path1/2/3 -type f -empty -delete
&find path1/2/3 -type d -empty -delete
(去除空的或不完全复制的东西) -
/usr/share/fslint/fslint/findsn path1 path2 path3
(删除存储在不同磁盘上相同大小的同一目录下的所有内容) -
/usr/share/fslint/fslint/findup path1 path2 path3
(删除所有重复文件) -
find path1/2/3 -type d -empty -delete
(去除findup后的空目录)
之后,我能够将所有磁盘作为组合驱动器再次安装到mhddfs
而不会重复浪费磁盘空间