Найти и удалить дубликаты файлов на нескольких жестких дисках одновременно

У меня есть 4 жестких диска, и я хочу выяснить, какие файлы на этих четырех жестких дисках (включая подкаталоги) являются дубликатами. Это следует проверять не только внутри жесткого диска, но и в отношении всех остальных.

Жесткие диски большие (3 ТБ), поэтому они должны быть эффективными (первое имя файла, а не проверка контрольной суммы или около того)

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 (чтобы избавиться от каталогов, которые пусты после поиска)

после этого я смог смонтировать все диски как объединенный диск с mhddfs снова без дубликатов тратить дисковое пространство снова

Сценарий ниже ищет дубликаты файлов в 10 каталогах одновременно, ищет дубликаты в комбинированных каталогах.

Это должно быть значительно быстрее, чем оба fdupes (Бег fdupes -r) а также fslint; в относительно небольшом каталоге (40 ГБ), хранящемся локально, сценарию потребовалось 5 секунд для создания двойного списка, в то время как fdupes а также fslint намного дольше (~ 90 / 100 секунд). В более крупном каталоге (700 ГБ, ~350000 файлов) на относительно медленном внешнем USB-накопителе это заняло 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

Если вы хотите использовать очень функциональный графический интерфейс, попробуйте FSlint из Центра программного обеспечения.

(Я вижу, что @lemonsqueeze предложил это в комментариях выше).

Вот ответ, который описывает использование FSlint: /questions/284836/kak-mozhno-rekursivno-sravnit-dva-kataloga-i-proverit-soderzhit-li-odin-iz-nih-d/284851#284851

Другие вопросы по тегам