Вот несколько вещей, которые я изменил, чтобы заставить его работать:
vmdk
диск от устройства (/dev/sdd
), не раздел (/dev/sdd1
)Это немного длинный, но это одна командная строка. В ней рассматривается содержимое файлов и сравнивается с помощью криптографического хэша (md5sum
).
find . -type f -exec md5sum {} + | sort | sed 's/ */!/1' | awk -F\| 'BEGIN{first=1}{if($1==lastid){if(first){first=0;print lastid, lastfile}print$1, $2} else first=1; lastid=$1;lastfile=$2}'
Как я уже сказал, это немного длинно...
findfind
выполняет md5sum
против всех файлов в текущем дереве каталогов. Затем вывод сортируется сортировка
d по хэшу md5. Так как в именах файлов могут быть пробелы, то sed
изменяет первый разделитель полей (два пробела) на вертикальный канал (очень маловероятно, что он будет в имени файла).
Последняя команда awk
отслеживает три переменные: lastid
= md5 хэш из предыдущей записи, lastfile
= имя файла из предыдущей записи, и first
= lastid был впервые замечен.
Вывод включает хэш, чтобы вы могли видеть, какие файлы дублируют друг друга.
Это не указывает на то, являются ли файлы жесткими ссылками (один и тот же инод, разное имя); это просто сравнивает содержимое.
Обновление: исправлено на основе простого базового имени файла.
find . -type f -print | sed 's!.*/\(.*\)\.[^.]*$!\1|&!' | awk -F\| '{i=indices[$1]++;found[$1,i]=$2}END{for(bname in indices){if(indices[bname]>1){for(i=0;i<indices[bname];i++){print found[bname,i]}}}}'
Здесь find
просто перечисляет имена файлов, sed
берет компонент базового имени файла и создает таблицу из двух полей с базовым именем и полным именем. Затем awk
создает таблицу ("найдено") видимых имен, проиндексированных базовым именем и номером элемента; массив "индексов" отслеживает, сколько из этих базовых имен было замечено. Пункт "END" затем распечатывает все найденные дубликаты базисных имён.
можно хотеть считать программы конкретно предназначенными к поиску дубликатов файлов вместо того, чтобы полагаться на имя, например, fdupes
или fslint
.
Создать структуру каталога
mkdir dir{A,B,C}
touch dirA/file{,-001,2,3}.jpg
touch dirB/file{A,A_ios,B,C}.jpg
touch dirC/file{X,X_ios,X-001,Y,Z}.jpg
Показать множественность дубликатов файлов
find . -name '*.jpg' -type f |sed 's/\(.*\/\(file.\).*\(.jpg\)\)/\2/' |sort |uniq -c|grep -v 1
Возвращает
2 fileA
3 fileX