Удалить идентичные файлы в UNIX - PullRequest
3 голосов
/ 08 марта 2010

Я имею дело с большим количеством (30 000) файлов размером около 10 МБ. Некоторые из них (я оцениваю 2%) на самом деле дублируются, и мне нужно хранить только копию для каждой дублированной пары (или триплета). Не могли бы вы предложить мне эффективный способ сделать это? Я работаю над Unix.

Ответы [ 6 ]

2 голосов
/ 08 марта 2010

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

find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in  seen)){seen[$1]=$2}' 
2 голосов
/ 08 марта 2010

Поиск возможных дубликатов файлов:

find DIR -type f -exec sha1sum "{}" \; | sort | uniq -d -w40

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

2 голосов
/ 08 марта 2010

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

Для 30 000 файлов при 64 байтах на запись в хэш-таблице вы смотрите только около 200 мегабайт.

1 голос
/ 12 января 2019

Для этого существует инструмент: fdupes

Восстановление решения из старого удаленного ответа.

1 голос
/ 08 марта 2010

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

0 голосов
/ 08 марта 2010

Сохранить все имена файлов в массиве. Затем пройдитесь по массиву. На каждой итерации сравнивайте содержимое файла с содержимым другого файла с помощью команды md5sum. Если MD5 совпадает, удалите файл.

Например, если файл b является дубликатом файла a, md5sum будет одинаковым для обоих файлов.

...