Я создал сценарий Python, который использует библиотеку checksumdir (https://github.com/cakepietoast/checksumdir) для вычисления хешей MD5 на основе содержимого каталога. Вычисление этого хеша для каталога 350 МБ, расположенного на механическом жестком диске, занимает несколько секунд.Сколько времени нужно вычислить, полученное из содержимого каталога?
Вычисление хеша для каталога 30gb однако требует возраста. Я еще не закончил, я обнаружил, что 12 часов слишком долго. Я понятия не имею, что может вызвать это, я могу подумать, что каталог в 350 Мбайт подходит для моей памяти RAM, а 30 ГБ - нет. Размер блока в контрольной сумме кажется 64 * 1024 (65536), и из того, что я нашел с Google, это кажется разумным числом.
Я также нашел, что 350mbdir содержит 466 файлов, в то время как каталог 30gb содержит 22696 файлов. Если я экстраполирую то, что я все еще не могу объяснить лишнее время.
FWIW: Я хочу использовать скрипт для поиска каталогов с дублирующимся содержимым. Я не нашел приложения, которое это делает. Поэтому я хочу рассчитать хэши и показать конечный результат в файле HTML.
Соответствующий код:
#!/usr/bin/env python3
import os
import re
from checksumdir import dirhash # https://pypi.python.org/pypi/checksumdir/1.0.5
import json
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M")
results = {}
sorted_results = {}
single_entries = []
compare_files = False
compare_directories = True
space_to_save = 0
html_overview = []
html_overview.extend(['<!DOCTYPE html>','<html>','<head>','<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">','</head>','<body>',' <table style="width:90%" class="table table-hover table-striped">', ' <tr>',' <td colspan=4></td>',' </tr>'])
# Configuration
root = "/home/jeffrey/Documenten" # Root directory to start search
create_hash = True
calculate_file_folder_size = True
compare_file_folder_names = False
sort_by = "hash" # Options: hash, size, name
json_result_file = 'result_' + now + '.json'
html_result_file = "DuplicatesHtml-" + now + ".html"
only_show_duplicate_dirs = True
remove_containing_directories = True
verbose_execution = True
# Calculate size of directory recursively - http://stackoverflow.com/questions/1392413/calculating-a-directory-size-using-python
def get_size(start_path = '.'):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
total_size += os.path.getsize(fp)/1048576 # size from bytes to megabytes
return total_size
# Calculate comparison properties, sort and save based on os.walk for recursive search
for dirName, subdirList, fileList in os.walk(root):
for dir in subdirList:
dir_name = dir
dir = os.path.join(dirName, dir)
if dir[0] != ".":
if verbose_execution = True:
print(dir)
if calculate_file_folder_size == True:
size = get_size(dir)
if verbose_execution = True:
print(size)
if create_hash == True:
hash = dirhash(dir, 'md5')
if verbose_execution = True:
print(hash)
results[dir] = [dir_name, size, hash]