У меня есть каталог с большим количеством изображений (более 100 000). Многие из них являются дубликатами/идентичными изображениями, но, очевидно, все они имеют разные имена файлов. Мне нужно найти изображения, которые имеют наибольшее количество дубликатов в этом каталоге. Например, file1.jpeg имеет 120 дубликатов, file2.jpeg имеет 90 дубликатов и т. д.
Я думал, что получу md5 каждого файла и сделаю какую-то сортировку, но я не совсем понимаю детали. Можно ли это сделать с помощью скрипта оболочки?
Если говорить точнее, мне не нужно удалять дубликаты (пока), мне нужно найти, у каких файлов больше всего копий.
Если это поможет, у меня OS X.
решение1
Если файлы являются точными дубликатами, постобработка вывода, shasum * | sort
вероятно, поможет. Сохраните его в файл, поскольку вычисление может занять некоторое время, и, скорее всего, он вам понадобится не один раз:
shasum * | sort >/tmp/shasums
Например, чтобы увидеть распределение идентичных файлов (только с контрольными суммами, а не с именами файлов):
</tmp/shasums cut -d ' ' -f 1 | uniq -c
Вот как можно увидеть имена файлов и количество дубликатов:
</tmp/shasums sed 's/ .*//' | uniq -c - | join -1 2 - /tmp/shasums | sort -k 2,1
Без GNU uniq я не могу предложить ничего лучшего для удобного отображения имен файлов, чем следующий скрипт Perl:
</tmp/shasums perl -lne '
s/^([^ ]*?) //; # set $1 to the checksum and $2 to the filename
push @{$names{$1}}, $_; # dispatch file names by checksum
END {
# iterate through the checksums, sorted by repeat count
foreach (sort {@$a <=> @$b} values %names) {
# print the repeat count and the file names
printf "%d %s\n", scalar(@$_), join(" ", @$_)
}
}'
решение2
Это быстрый и грязный конвейер, который выведет имена дубликатов между строками дефисов. Он ищет только в текущем каталоге, но вы можете использовать его find
для рекурсивного поиска.
md5sum *.jpeg | sort | awk '{if ($1 != prev) print "-----"; print $2; prev = $1}'
Пример вывода:
-----
unique1.jpeg
-----
dup1.jpeg
dup2.jpeg
dup3.jpeg
-----
same1.jpeg
same2.jpeg
-----
solo1.jpeg