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

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

У меня есть каталог с большим количеством изображений (более 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

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