
У меня есть папка с тысячами (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.один рази только для файлов, которые невозможно различить по размеру.
Конечно, это предполагает, что среди существующих или новых файлов нет дубликатов (но это можно легко проверить).