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

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

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

2
задан 10 November 2014 в 05:00

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 (для избавлений от пустого alle или не completly скопированный материал)
  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 снова, не имея дубликатов, тратя впустую дисковое пространство снова

0
ответ дан 19 November 2019 в 22:31

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

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

Вот ответ, который обрисовывает в общих чертах использование FSlint: https://askubuntu.com/a/472244/100356

0
ответ дан 19 November 2019 в 22:31

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

Это должно быть существенно быстрее, чем оба fdupes (выполнение fdupes -r) и fslint; на относительно маленьком каталоге 40 ГБ, локально сохраненных, потребовались секунды сценария 5 для создания списка простофили, в то время как это взяло fdupes и fslint намного дольше (~ 90 / 100 секунд). На большем каталоге (700 ГБ, ~350000 файлах) на относительно медленной внешней Карте памяти, потребовалось 90 минут. С fdupes это были бы более чем 200-250 минут, смотря на признак прогресса (который хорош, сценарий ниже не показывает прогресс), но я не ожидал всего этого путь.
Я должен упомянуть это, например, fslint предлагает дополнительную функциональность, которую сценарий не делает (как это), таким образом, сравнение находится строго на создании списка простофиль.

Кроме того, скорость зависит для части от как быстро чтение с диска: Я протестировал несколько медиа (a.o на сетевом диске) с огромными различиями, особенно на меньших каталогах, где создание списка файлов принимает относительно большое участие задания (время).

Нижняя строка - то, что это не будет быстрое задание также, какой путь, Вы могли бы спросить сами, если каталоги не являются слишком большими.

Как это работает

Когда сценарий находит дубликаты, дубликаты перечислены следующим образом:

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 файлов уменьшил время от 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 <script> <diretory>

Пример ouput:

.txt
.mp3
.odt
.py
.desktop
.sh
.ods
3
ответ дан 2 December 2019 в 02:59

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

Похожие вопросы: