Найдите файлы, которые имеют подтвержденный дубликат в том же каталоге рекурсивно

Вот несколько вещей, которые я изменил, чтобы заставить его работать:

  1. Не используйте установщик Android для форматирования диска.
  2. Создайте свой VirtualBox vmdk диск от устройства (/dev/sdd), не раздел (/dev/sdd1)
  3. Отключите USB-устройства на VM: Настройки-> USB-> Фильтры USB-устройства-> Снятие флажка все
3
29.11.2014, 01:39
3 ответа

Это немного длинный, но это одна командная строка. В ней рассматривается содержимое файлов и сравнивается с помощью криптографического хэша (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" затем распечатывает все найденные дубликаты базисных имён.

2
27.01.2020, 21:27

можно хотеть считать программы конкретно предназначенными к поиску дубликатов файлов вместо того, чтобы полагаться на имя, например, fdupes или fslint.

0
27.01.2020, 21:27

Создать структуру каталога

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

0
27.01.2020, 21:27

Теги

Похожие вопросы