Как узнать путь к файлу-дубликату?

Как мне вывести пути дубликатов файлов с расширением pdf, находящихся в двух идентичных папках на разных внешних дисках, если в одной из папок содержится на 2 файла больше, а их имена мне неизвестны? Учтите, что вложенные подкаталоги содержат десятки тысяч pdf файлов, и я хотел бы избежать трудоемкого поиска при удалении дубликатов, чтобы сделать родительские директории на обоих дисках полностью идентичными.
  • 10 марта 2025 г. 15:14
Ответы на вопрос 2
Для поиска дубликатов файлов с расширением .pdf в двух папках, находящихся на разных дисках, вы можете использовать язык программирования Python и библиотеку `os` для работы с файловой системой. Ниже представлен пример скрипта, который поможет вам найти и вывести пути к дубликатам.

Этот код сканирует обе папки, создает хэш-суммы для файлов и находит дубликаты.

```python
import os
import hashlib

def file_hash(file_path):
    """Возвращает хэш-сумму файла."""
    hash_md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

def find_duplicates(dir1, dir2):
    """Находит дубликаты файлов в двух директориях."""
    files = {}
    
    # Обрабатываем первую директорию
    for root, _, filenames in os.walk(dir1):
        for filename in filenames:
            if filename.lower().endswith('.pdf'):
                file_path = os.path.join(root, filename)
                file_hash_value = file_hash(file_path)
                if file_hash_value not in files:
                    files[file_hash_value] = []
                files[file_hash_value].append(file_path)

    # Проверяем вторую директорию
    duplicates = []
    for root, _, filenames in os.walk(dir2):
        for filename in filenames:
            if filename.lower().endswith('.pdf'):
                file_path = os.path.join(root, filename)
                file_hash_value = file_hash(file_path)
                if file_hash_value in files:
                    duplicates.extend(files[file_hash_value])
                    duplicates.append(file_path)

    return duplicates

# Замените пути на ваши директории
dir1 = '/path/to/first/directory'
dir2 = '/path/to/second/directory'

duplicates = find_duplicates(dir1, dir2)

# Выводим пути к дубликатам
for duplicate in duplicates:
    print(duplicate)
```

### Пояснения:
1. **file_hash** — функция, которая вычисляет MD5-хэш файла. Хэш-сумма позволяет быстро определить, являются ли два файла идентичными, независимо от их путей и имен.
2. **find_duplicates** — функция, которая проходит по файлам в двух директориях и ищет дубликаты по хэш-сумме.
3. В **duplicates** собираются пути к дубликатам, найденным в обеих директориях.
4. После выполнения скрипта выведутся все найденные дубликаты.

### Предостережение:
- Работа с большими файлами может занять много времени, так как хэш-суммы рассчитываются для каждого файла.
- Обязательно протестируйте код на небольшой выборке данных, чтобы убедиться, что он работает корректно, прежде чем запускать его на больших директориях.
Если вам надо их найти - это одна задача, если синхронизировать - другая 
в целом можно и без powershell обойтись, если синхонизация в одну сторону - robocopy

Если же просто найти и powershell, то для каждой из папок
$list = get-childItem $Path -recurse | select-object -expandproperty fullname

и потом сравнить как тут
Как найти и вывести повторяющиеся строки в текстовом файле?
Похожие вопросы