我有 4 个硬盘,想找出这 4 个硬盘(包括子目录)上哪些文件是重复的。不仅要检查一个硬盘,还要检查所有其他硬盘。
硬盘很大(3TB),因此必须高效(先是文件名,然后是校验和检查等)
答案1
下面的脚本一次最多在 10 个目录中查找重复文件,查找合并目錄。
fdupes
它应该比(运行fdupes -r
) 和都要快得多fslint
;在本地存储的相对较小的 40GB 目录中,脚本花费 5 秒钟来创建重复列表,而花费的时间fdupes
更长fslint
(~ 90 / 100 秒)。在相对较慢的外部 USB 驱动器上的较大目录 (700GB,~350000 个文件) 中,花费 90 分钟。使用 fdupes 则需要 200-250 分钟以上,查看进度指示(这很好,下面的脚本没有显示进度),但我没有等到它全部完成。
我应该提到,例如fslint
提供了额外的功能,而脚本没有(因为它是),所以比较严格地集中在创建重复列表上。
此外,速度在一定程度上取决于磁盘读取的速度:我测试了几种媒体(在网络驱动器上),它们之间存在很大差异,特别是在较小的目录上,创建文件列表占用了相对较大的一部分工作(时间)。
底线是,无论哪种方式,这都不会是一项快速的工作,您可能会问自己目录是否太大。
怎么运行的
当脚本发现重复项时,重复项将列出如下:
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 <script> <directory1> <directory2> <directory3>
最多 10 个目录
脚本的更多选项
添加附加功能相对简单;例如将重复项移动到另一个目录、重命名等,这样您就可以手动或自动决定保留哪个文件。
如何让工作可行
您的目录似乎很大。为了使作业合理可行,还有另一种更复杂的方法来防止系统“阻塞”:您可以将作业分成几个部分,而不是一次对所有文件类型(扩展名)执行作业每种文件类型的部分。对 30,000 个文件的目录进行小测试,将时间从大约 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 <script> <diretory>
示例输出:
.txt
.mp3
.odt
.py
.desktop
.sh
.ods
答案2
如果您想使用功能强大的 GUI,请尝试软件中心的 FSlint。
(我看到@lemonsqueeze 在上面的评论中提出了这一点)。
以下是概述 FSlint 用法的答案: https://askubuntu.com/a/472244/100356
答案3
我使用了 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
再次将所有磁盘安装为组合驱动器,而不会再次浪费磁盘空间