Возможно ли найти дубликаты файлов на моем диске, которые по битам идентичны, но имеют разные имена файлов?
st_size
s, исключив те из них, которые имеют только одно и то же, а затем вычислив только md5sums для сопоставления st_size
s.
Возможно ли найти дубликаты файлов на моем диске, которые по битам идентичны, но имеют разные имена файлов?
st_size
s, исключив те из них, которые имеют только одно и то же, а затем вычислив только md5sums для сопоставления st_size
s.
Ответы:
fdupes
могу сделать это. От man fdupes
:
Ищет по заданному пути дубликаты файлов. Такие файлы находят путем сравнения размеров файлов и подписей MD5 с последующим побайтовым сравнением.
В Debian или Ubuntu вы можете установить его с помощью apt-get install fdupes
. В Fedora / Red Hat / CentOS вы можете установить его с yum install fdupes
. На Arch Linux вы можете использовать pacman -S fdupes
, а на Gentoo emerge fdupes
.
Чтобы запустить проверку, исходящую из корня вашей файловой системы, которая, вероятно, займет много времени и памяти, используйте что-то вроде fdupes -r /
.
Как указано в комментариях, вы можете получить самые большие дубликаты, выполнив следующие действия:
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
Это сломается, если ваши имена файлов содержат переводы строк.
fdupes ....... | xargs ls -alhd | egrep 'M |G '
чтобы сохранить файлы в удобочитаемом формате и только файлы с размером в мегабайтах или гигабайтах. Измените команду в соответствии с реальными результатами.
du
конвейер sort
вам скажут.
Еще один хороший инструмент fslint
:
fslint - это набор инструментов для поиска различных проблем с файловыми системами, включая дубликаты файлов и проблемные имена файлов и т. д.
Отдельные инструменты командной строки доступны в дополнение к графическому интерфейсу, и для доступа к ним можно изменить или добавить в каталог $ PATH каталог / usr / share / fslint / fslint при стандартной установке. Каждая из этих команд в этом каталоге имеет параметр --help, который более подробно описывает ее параметры.
findup - find DUPlicate files
В системах на основе Debian вы можете установить его с:
sudo apt-get install fslint
Вы также можете сделать это вручную, если вы не хотите или не можете установить сторонние инструменты. Большинство таких программ работают путем вычисления контрольных сумм файлов . Файлы с одинаковой суммой md5 почти наверняка содержат одинаковые данные. Итак, вы можете сделать что-то вроде этого:
find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
Пример вывода (имена файлов в этом примере одинаковые, но они также будут работать, когда они разные):
$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
/usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
/usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---
Это будет намного медленнее, чем уже упомянутые специальные инструменты, но это будет работать.
st_size
, исключая любые, у которых есть только один файл такого размера, и затем вычисляя md5sums только между файлами с одинаковым st_size
.
md5sum {}
на md5 -q {}
и gawk '{print $1}'
сcat
Краткий ответ: да.
Более длинная версия: взгляните на запись в wikipedia fdupes , она содержит довольно хороший список готовых решений. Конечно , вы можете написать свой собственный, это не что сложно - хэширования программы , такие как diff
, sha*sum
, find
, sort
и uniq
должен делать эту работу. Вы можете даже поместить это в одну строку, и это все еще будет понятно.
Если вы считаете, что хеш-функция (в данном случае MD5) не содержит конфликтов в вашем домене:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
Хотите идентичные имена файлов сгруппированы? Напишите простой скрипт not_uniq.sh
для форматирования вывода:
#!/bin/bash
last_checksum=0
while read line; do
checksum=${line:0:32}
filename=${line:34}
if [ $checksum == $last_checksum ]; then
if [ ${last_filename:-0} != '0' ]; then
echo $last_filename
unset last_filename
fi
echo $filename
else
if [ ${last_filename:-0} == '0' ]; then
echo "======="
fi
last_filename=$filename
fi
last_checksum=$checksum
done
Затем измените find
команду, чтобы использовать ваш скрипт:
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
Это основная идея. Вероятно, вам следует изменить, find
если имена ваших файлов содержат несколько символов. (например, пространство)
Я подумал добавить недавний улучшенный форк fdupes, jdupes , который обещает быть более быстрым и более функциональным, чем fdupes (например, фильтр размера):
jdupes . -rS -X size-:50m > myjdups.txt
Это рекурсивно найдет дублированные файлы размером более 50 МБ в текущем каталоге и выведет полученный список в myjdups.txt.
Обратите внимание, что выходные данные не отсортированы по размеру, и, поскольку они не встроены, я адаптировал ответ @Chris_Down выше, чтобы добиться этого:
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
В Википедии была статья ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ) со списком доступного программного обеспечения с открытым исходным кодом для этой задачи, но теперь она удалена .
Добавлю, что версия fslint с графическим интерфейсом очень интересна, позволяя использовать маску для выбора файлов для удаления. Очень полезно убирать дублированные фотографии.
В Linux вы можете использовать:
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
Последние 2 работы на многих системах (Windows, Mac и Linux) Я не проверен на FSLint
Вот мой взгляд на это:
find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
echo -n '.'
if grep -q "$i" md5-partial.txt; then echo -e "\n$i ---- Already counted, skipping."; continue; fi
MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
MD5=`echo $MD5 | cut -d' ' -f1`
if grep "$MD5" md5-partial.txt; then echo "\n$i ---- Possible duplicate"; fi
echo $MD5 $i >> md5-partial.txt
done
Он отличается тем, что хэширует только первые 1 МБ файла.
Это имеет несколько проблем / особенностей:
Я использую его для сравнения видеоклипов, так что мне этого достаточно.