1

Нам нужна программа Windows 7 для удаления / проверки дубликатов, но наша ситуация несколько отличается от стандартной, для которой достаточно программ.

У нас есть довольно большой статический архив (коллекция) фотографий, размещенных на нескольких дисках. Давайте назовем их Диск А ..M. Мы также некоторые диски (давайте назовем их Disk 1..9) , которые содержат некоторые дубликаты , которые можно найти на дисках A ..М.

Мы хотим добавить в нашу коллекцию новые диски (N, O, P ... aso.), Которые будут содержать фотографии с дисков 1..9, но, конечно же, мы не хотим иметь две фотографии (или более).) раз.

Конечно, теоретически задачу можно решить с помощью обычного удаления дубликатов файлов, но необходимое время будет очень большим.

В идеале, сейчас AFAIS, реальным решением будет программа, которая будет сканировать диски A ..M, сохраните размеры файлов / хэши фотографий в индексированной базе данных / файлах и проверит новые диски (1..9) по этой базе данных.

Однако мне трудно найти такую программу (если она существует).

Другие вещи, чтобы отметить:

  • Мы считаем, что Диски A ..М (коллекция) не имеет дубликатов на них
  • имена файлов могут быть изменены
  • нас не интересует приблизительное (нечеткое) сравнение, которое можно найти в некоторых программах сравнения фотографий. Мы ищем точные дубликаты файлов.
  • мы не боимся командной строки. :-)
  • нам нужно работать на Win7/XP
  • мы предпочитаем (конечно) быть бесплатными

2 ответа2

3

Основываясь на решении Dennis, мы решили использовать пакет hashdeep, который также доступен в Windows.

Основное использование:

Шаг 1. Генерация хэшей (это нужно сделать только один раз)

hashdeep64 -c tiger -r "D:\*" > Disk_D.hash

Мы используем тигра в качестве хэш-функции - быстрее и лучше, чем SHA-1 (без коллизий).

Шаг 2: Поиск дубликатов (это необходимо выполнить для каждого диска / каталога для проверки)

hashdeep64 -k Disk_D.hash -m -r "E:\My-Dir-To-Check\*" > Dupes.txt

Теперь все дубликаты хранятся в Dupes.txt

Вы можете использовать MsWord, LibreOffice или Notepad++ (или любой другой способ, которым вы знаете), чтобы вставить del (и / или любые другие параметры) в этот текстовый файл для удаления файлов. У вас здесь достаточно вариантов, в том числе простой .bat-файл, который сканирует список файлов, чтобы удалить все записи.

Кроме того, у вас есть возможность просмотреть список файлов и выполнить обработку вручную.

2

Подход

  1. Выберите хеш-функцию без столкновений.

    В моем примере используется SHA1, поскольку узким местом все равно будет жесткий диск.

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

  2. Прочитайте интересующие файлы на дисках A ..M, вычислите их хэши и сохраните их в файле, специфичном для этого диска (чтобы вы могли добавлять / удалять диски позже).

  3. Прочитайте интересующие файлы на дисках 1..9 и вычислите их хэши.

    Если хеш файла уже известен, выполните действие (перечислите или удалите).

Настроить

  1. Загрузите и установите Cygwin, набор инструментов, которые обеспечивают Linux-среду для Windows.

  2. В проводнике Windows откройте папку %ProgramFiles(x86)%\Cygwin\home\%USERNAME% .

  3. Отредактируйте файл .bashrc и добавьте следующую строку:

    export PATH=~:$PATH
    
  4. Создайте файл с именем hashdrive и сохраните в нем следующий код:

    #!/bin/bash
    
    DRIVELETTER=$(echo $1 | tr '[:upper:]' '[:lower:]')
    EXTENSIONS=$(echo $2 | sed 's/,/\\|/g')
    DRIVENAME=$(echo $3 | tr '[:upper:]' '[:lower:]')
    
    set -e
    [ -d /cygdrive/$DRIVELETTER ] || (echo "Drive $DRIVELETTER: does not exist." ; exit 1)
    [ -f ~/drives/$DRIVENAME ] && (echo "Hashfile for drive $DRIVENAME already exists." ; exit 1)
    set +e
    
    mkdir ~/drives 2>/dev/null
    find /cygdrive/$DRIVELETTER -type f -iregex ".*\.\($EXTENSIONS\)" -exec sha1sum {} \; | cut -b -40 > ~/drives/$DRIVENAME
    
  5. Создайте файл с именем checkdrive и сохраните в нем следующий код:

    #!/bin/bash
    
    DRIVELETTER=$(echo $1 | tr '[:upper:]' '[:lower:]')
    EXTENSIONS=$(echo $2 | sed 's/,/\\|/g')
    ACTION=$(echo $3 | tr '[:upper:]' '[:lower:]')
    
    set -e
    [ -d /cygdrive/$DRIVELETTER ] || (echo "Drive $DRIVELETTER: does not exist." ; exit 1)
    set +e
    
    IFS=":" ; for FILE in `find /cygdrive/$DRIVELETTER -type f -iregex ".*\.\($EXTENSIONS\)" -printf %p:`; do
        [ "$(grep -m 1 $(sha1sum "$FILE" | cut -b -40) ~/drives/*)" ] && $ACTION "$FILE"
    done
    

использование

  • Чтобы сохранить хэши всех образов определенного диска в файл, запустите Cygwin и выполните следующую команду:

    hashdrive DRIVELETTER EXTENSIONS DRIVENAME
    

    Например, если DiskA смонтирован как диск D: и вы хотите хэшировать все образы с расширениями jpg и png , используйте следующую команду:

    hashdrive d jpg,png diska
    

    Там не должно быть места в jpg,png

  • Чтобы проверить диск на наличие дубликатов изображений, запустите Cygwin и выполните следующую команду:

    hashdrive DRIVELETTER EXTENSIONS ACTION
    

    Например, если Disk1 подключен как диск E: и вы хотите отобразить все дубликаты образов с расширениями jpg и png , используйте следующую команду:

    checkdrive e jpg,png echo
    

    Если вы хотите удалить файлы напрямую, используйте rm вместо echo .

  • Чтобы удалить диск из базы данных, просто удалите файл DRIVENAME в папке %ProgramFiles(x86)%\Cygwin\home\%USERNAME%\drive .

предосторожность

Команда rm не перемещает файлы в корзину; он удаляет их напрямую.

Хотя в любом случае должно быть возможно восстановить файлы, будьте осторожны при использовании действия rm и попробуйте echo перед использованием rm .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .