37 if not os.path.isdir(directory):
38 print(
'Указанная директория не найдена')
41 print(f
"Сканирование директории: {directory}...")
45 for root, _, filenames
in os.walk(directory):
46 for filename
in filenames:
47 path = os.path.join(root, filename)
50 size = os.path.getsize(path)
51 files_by_size.setdefault(size, []).append(path)
57 for size, paths
in files_by_size.items():
66 'mtime': stat.st_mtime,
69 files_by_hash.setdefault(f_hash, []).append(file_info)
76 print(
"АНАЛИЗ ДУБЛИКАТОВ")
79 for f_hash, group
in files_by_hash.items():
81 group.sort(key =
lambda x: x[
'mtime'], reverse=
True)
84 delete_files = group[1:]
86 print(f
'Оставляем самые свежие файлы : {keep_file["path"]}')
87 print(f
" Дата: {format_date(keep_file['mtime'])} | Размер: {format_size(keep_file['size'])}")
89 print(f
" [БУДУТ УДАЛЕНЫ]:")
90 for duplicates
in delete_files:
91 print(f
" -- {duplicates['path']}")
92 print(f
" Дата: ({format_date(duplicates['mtime'])}) | Размер: ({format_size(duplicates['size'])})")
93 to_delete.append(duplicates[
'path'])
95 print(
"\n[+] Дубликаты не обнаружены. Все дампы уникальны.")
99 print(f
"ИТОГО: Найдено {len(to_delete)} дубликатов.")
100 confirm = input(
"Удалить выбранные файлы? (да/нет): ").strip().lower()
103 for path
in to_delete:
106 print(f
"[УДАЛЕНО]: {path}")
107 except Exception
as e:
108 print(f
"[ОШИБКА]: Не удалось удалить {path}: {e}")
109 print(
"\n[+] Очистка завершена успешно.")
111 print(
"\n[!] Операция отменена пользователем.")