Проверить, существует ли файл

Проверить, существует ли файл

У меня есть папка с тысячами (70 ГБ folder/to/check/) изображений, и я для каждого файла хочу проверить, существует ли он уже в другом каталоге с тысячами тысяч изображений (414 ГБ folder/to/search/).

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

find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt

Есть ли у кого-нибудь идея, как оптимизировать скрипт или кто-нибудь может указать мне правильное направление? Мои навыки очень базовые.

решение1

Сделай это.

  • Вычислите md5-сумму каждого изображения в папке «to-check», запишите ее в текстовый файл.

  • Вычислить md5-сумму каждого изображения в папке «to-search», добавить в первый файл.

  • Сортировать этот гигантский файл в новый файл.

  • Используйте что-то вроде , uniq -cчтобы подсчитать, сколько раз дублируется каждая строка.

Если я правильно понял вашу команду (а это может быть и не так), то, по-моему, сейчас вы выполняете ее md5sumв общей сложности X * Y раз, но с учетом вышесказанного это сокращается до X + Y раз.

решение2

mtree— удобная утилита, когда вам нужно сравнить две файловые иерархии на предмет одинаковых/разных временных меток или одинаковых/разных хэшей MD5/SHA256.

Давайте создадим простую иерархию тестов:

$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done

folder/to/checkимеет файлы image-001через -010, в то время как folder/to/searchимеет image-002через -011. Все файлы идентичны (длиной ноль байтов), но имеют разные временные метки.

Если вытолькохотите проверить MD5-хеш (и наличие/отсутствие каждого файла), тогда:

$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search 
extra: image-011.jpg
./image-001.jpg missing

В extraстроке говорится, что image-011.jpgон присутствовал в , folder/to/searchно не был обязан присутствовать (так как его нет в folder/to/check), а в missingстроке говорится, что он image-001.jpgбыл найден в исходной папке ( folder/to/check), но не в целевой папке ( folder/to/search).

Если вы хотите проверить не только MD5-хеш, но и временную метку, то:

$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search 
.:      modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing

Этот вывод все еще показывает те же строки extraи missingплюс несколько файлов, которые идентичны в хэше MD5, но имеют разные временные метки. Наконец, если какой-либо из файлов имеет другой хэш MD5, чем его аналог, mtreeсообщит вам, какие именно:

$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.:      modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg: 
        size (0, 29)
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
        md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg: 
        modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing

решение3

Для этого существуют специальные утилиты, но если вы хотите сделать это самостоятельно:

  • Получите размер всех файлов в байтах и ​​составьте списки всех файлов с одинаковым размером.
  • Для списков, содержащих более одного элемента (их не так много, особенно среди больших файлов):
    • вычислить MD5 всех элементов списка
    • проверить на наличие дубликатов

По сути, это заставляет вас вычислять хэш MD5.один рази только для файлов, которые невозможно различить по размеру.

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

Связанный контент