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

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

我有 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 和屏幕运行所有内容

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -delete& find 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再次将所有磁盘安装为组合驱动器,而不会再次浪费磁盘空间

相关内容