У нас ты найдешь 👇
- библиотеки и скрипты python
- инструменты linux
- полезный софт
- важнейшие новости из мира IT
Связь с админом: @ghostifix
РКН: https://clck.ru/3NywZG
Post #2864
540

🗂 100 ГБ файлов, тысячи копий. Найдём дубликаты с помощью Python
На диске могут годами лежать одинаковые архивы, фотографии, бэкапы и документы под разными именами. Сравнивать имена бессмысленно. А вот SHA-256 позволяет искать файлы с одинаковым содержимым, даже если они называются по-разному.
⚙️ Небольшой скрипт, который обходит папку, вычисляет хеши и выводит группы дубликатов.
Сохраняем как
📌 Что здесь интересного?
🔵 Сначала файлы группируются по размеру. Разный размер — значит, содержимое точно отличается.
🔵 SHA-256 вычисляется только для файлов с совпадающим размером.
🔵 Чтение идёт блоками по 1 МБ, поэтому не нужно загружать огромные файлы целиком в RAM.
🔵 Скрипт ничего не удаляет — только показывает совпадения.
💡 Нюанс: одинаковый SHA-256 практически гарантирует совпадение в обычных задачах поиска дубликатов, но для строгой побайтовой проверки перед удалением ценных данных стоит дополнительно сравнить содержимое файлов.
Также стоит учесть, что символические ссылки пропускаются, а несколько жёстких ссылок на один inode могут попасть в результаты как отдельные пути.
😎 PyLinux | #python #scripts
На диске могут годами лежать одинаковые архивы, фотографии, бэкапы и документы под разными именами. Сравнивать имена бессмысленно. А вот SHA-256 позволяет искать файлы с одинаковым содержимым, даже если они называются по-разному.
⚙️ Небольшой скрипт, который обходит папку, вычисляет хеши и выводит группы дубликатов.
from pathlib import Path
from collections import defaultdict
import hashlib
import sys
def sha256(path):
h = hashlib.sha256()
with path.open("rb") as f:
for chunk in iter(
lambda: f.read(1024 * 1024), b""
):
h.update(chunk)
return h.hexdigest()
def find_duplicates(folder):
sizes = defaultdict(list)
for path in Path(folder).rglob("*"):
if path.is_file() and not path.is_symlink():
try:
sizes[path.stat().st_size].append(path)
except OSError:
pass
for size, paths in sizes.items():
if len(paths) < 2:
continue
hashes = defaultdict(list)
for path in paths:
try:
hashes[sha256(path)].append(path)
except OSError:
continue
for group in hashes.values():
if len(group) > 1:
print(f"\nDuplicate group ({size} bytes):")
for path in group:
print(f" {path}")
find_duplicates(sys.argv[1])
Сохраняем как
duplicates.py и запускаем:python duplicates.py ~/Downloads
📌 Что здесь интересного?
🔵 Сначала файлы группируются по размеру. Разный размер — значит, содержимое точно отличается.
🔵 SHA-256 вычисляется только для файлов с совпадающим размером.
🔵 Чтение идёт блоками по 1 МБ, поэтому не нужно загружать огромные файлы целиком в RAM.
🔵 Скрипт ничего не удаляет — только показывает совпадения.
💡 Нюанс: одинаковый SHA-256 практически гарантирует совпадение в обычных задачах поиска дубликатов, но для строгой побайтовой проверки перед удалением ценных данных стоит дополнительно сравнить содержимое файлов.
Также стоит учесть, что символические ссылки пропускаются, а несколько жёстких ссылок на один inode могут попасть в результаты как отдельные пути.
Сохраняй и ставь — 👍
😎 PyLinux | #python #scripts
- 👍 8
- 🔥 7


















