Найти все дубликаты файлов по хешу MD5
Я пытаюсь найти все дубликаты файлов (на основе хеша MD5) и упорядочены по размеру файла. Пока у меня есть это:
find . -type f -print0 | xargs -0 -I "{}" sh -c 'md5sum "{}" | cut -f1 -d " " | tr "\n" " "; du -h "{}"' | sort -h -k2 -r | uniq -w32 --all-repeated=separate
Выход этого:
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K ./picture.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K ./picture2.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K ./picture2.s
d41d8cd98f00b204e9800998ecf8427e 0 ./test(1).log
Это самый эффективный способ?
3 ответа
От "man xargs": -Я подразумеваю -L 1 Так что это не самый эффективный. Было бы более эффективно, если вы просто дадите md5sum столько имен файлов, сколько будет:
find . -type f -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
Тогда у вас не будет размера файла, конечно. Если вам действительно нужен размер файла, создайте сценарий оболочки, который выполняет md5sum
а также du -h
и объединить строки с join
,
Иногда мы работаем над сокращением наборов команд linux, таких как busybox или другие вещи, которые поставляются с NAS и другими встроенными аппаратными средствами linux (IoT). В этих случаях мы не можем использовать такие параметры, как -print0
Проблемы с пространствами имен. Таким образом, мы можем вместо этого предпочесть:
find | while read file; do md5sum "$file"; done > /destination/file
Тогда наш /destination/file
готов к любому процессу, как sort
а также uniq
по-прежнему.
Используйте либо btrfs + duperemove, либо zfs с онлайн-дедупликацией. Он работает на уровне файловой системы и будет сопоставлять даже равные части файла, а затем использовать CoW файловой системы, чтобы сохранить только одну из них, оставляя файлы на месте. Когда вы изменяете одну из общих частей в одном из файлов, она запишет изменение отдельно. Таким образом, вы можете иметь такие вещи, как /media и /backup/media-2017-01-01, потребляющие только размер каждого уникального фрагмента информации в обоих деревьях.