Найдите дубликаты файлов

Ваш терминал окрашивается новой темой, как Вы видите нового происхождения и основных цветов. Однако сделать ls использование больше цветов, чем набор по умолчанию цветов, необходимо создать a dir_colors файл конфигурации и позволил ему быть полученным от ~/.bashrc. Этот файл содержит пар цвета и типа файла, которые используются для дифференциации между различными типами файлов и их соответствующим цветом для отображения. Переменная среды LS_COLORS должен содержать эти данные после определения источника и ls будет использовать это для отображения имен файлов соответственно.

Последовательности цветовых кодов, используемые в dir_colors эквивалентны bash управляющие коды для отображения текста в цветах- 1;31 будет полужирный красный; 0;31 будет нормальный красный. Кроме того, помните, что эти цвета всегда относительно тех определенных в ~/.Xresources так красный цвет, например, будет соответствовать XTerm*color1 и так далее.

91
28.02.2019, 03:48
9 ответов

fdupes может сделать это. От man fdupes:

Ищет данный путь дубликаты файлов. Такие файлы найдены путем сравнения размеров файла и подписей MD5, сопровождаемых сравнением байта байтом.

В Debian или Ubuntu, можно установить его с apt-get install fdupes. В Fedora Hat/CentOS / Красном Hat/CentOS, можно установить его с yum install fdupes. На Дуге Linux можно использовать pacman -S fdupes, и на хинду, emerge fdupes.

Для выполнения проверки, убывающей от корня файловой системы, который, вероятно, займет существенное количество времени и память, используйте что-то как fdupes -r /.

Как спросили в комментариях, можно получить самые большие дубликаты путем выполнения следующего:

fdupes -r . | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n

Это повредится, если Ваши имена файлов будут содержать новые строки.

104
27.01.2020, 19:30
  • 1
    Спасибо. Как я могу отфильтровать крупнейшую простофилю? Как я могу сделать размеры человекочитаемыми? –  student 05.04.2013, 12:31
  • 2
    @student: используйте что-то вдоль строки (удостоверьтесь, что fdupes просто производит имена файлов без дополнительного informatinos, или сокращение или sed, чтобы просто сохранить это): fdupes ....... | xargs ls -alhd | egrep 'M |G ' сохранять файлы в Человекочитаемом формате и только тех, которые имеют размер в Мегабайтах или Гигабайтах. Измените команду для удовлетворения реальным выводам. –  Olivier Dulac 05.04.2013, 15:27
  • 3
    @OlivierDulac Вы никогда не должны анализировать ls. Обычно это хуже, чем Ваш вариант использования, но даже в Вашем варианте использования, Вы рискуете ложными положительными сторонами. –  Chris Down 05.04.2013, 16:13
  • 4
    @student - После того как у Вас есть имена файлов, du переданный по каналу к sort скажет Вам. –  Chris Down 05.04.2013, 16:14
  • 5
    @ChrisDown: это верно, что это - дурная привычка и может дать ложные положительные стороны. Но в этом случае (интерактивное использование, и для дисплея только, никакой "комнаты" или чего-либо вида, непосредственно полагающегося на него), он прекрасен и быстрый ^^. Я люблю те страницы, которые Вы связываете с, btw (чтение их с нескольких месяцев, и полный многих полезных infos), –  Olivier Dulac 05.04.2013, 17:05

Другой хороший инструмент fslint:

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

Отдельные инструменты командной строки доступны в дополнение к GUI и получить доступ к ним, можно измениться на или добавить к $PATH/usr/share/fslint/fslint каталог на стандартной установке. Каждая из этих команд в том каталоге имеет - опция справки который более подробная информация ее параметры.

   findup - find DUPlicate files

В находящихся в debian системах youcan устанавливают его с:

sudo apt-get install fslint

Можно также сделать это вручную, если Вы не хотите или не можете установить сторонние инструменты. Путем большая часть такой работы программ путем вычисления контрольных сумм файла. Файлы с тем же md5sum почти наверняка содержат точно те же данные. Так, Вы могли сделать что-то вроде этого:

find / -type f -exec md5sum {} \; > md5sums
awk '{print $1}' md5sums | sort | uniq -d > dupes
while read -r d; do echo "---"; grep -- "$d" md5sums | cut -d ' ' -f 2-; done < dupes 

Демонстрационный вывод (имена файлов в этом примере являются тем же, но это будет также работать, когда они будут отличаться):

$ while read -r 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
---

Это будет намного медленнее, чем специальные инструменты, уже упомянутые, но это будет работать.

27
27.01.2020, 19:30
  • 1
    Это было бы очень, намного быстрее для нахождения любых файлов с тем же размером как другое использование файла st_size, устранение любого, которые только имеют один файл этого размера и затем вычисление md5sums только между файлами с тем же st_size. –  Chris Down 04.04.2013, 19:34
  • 2
    @ChrisDown да, просто требуемый для хранения этого простым. То, что Вы предлагаете, значительно ускорит вещи, конечно. Вот почему у меня есть правовая оговорка об этом являющийся медленным в конце моего ответа. –  terdon♦ 04.04.2013, 19:37

Короткий ответ: да.

Более длительная версия: взгляните на Википедию fdupes запись, она щеголяет довольно хорошим списком готовых решений. Конечно, можно записать собственное, дело не в этом трудный - хеширование программ как diff, sha*sum, find, sort и uniq должен сделать задание. Можно даже поместить его на одну строку, и это все еще будет понятно.

8
27.01.2020, 19:30

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

6
27.01.2020, 19:30

Википедия имела статью (http://en.wikipedia.org/wiki/List_of_duplicate_file_finders) со списком доступного программного обеспечения с открытым исходным кодом для этой задачи, но это было теперь удалено.

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

На Linux можно использовать:

- FSLint: http://www.pixelbeat.org/fslint/

- FDupes: https://en.wikipedia.org/wiki/Fdupes

- DupeGuru: https://www.hardcoded.net/dupeguru/

2 последних работы над многими системами (окна, Mac и Linux) я 've не проверенный на FSLint

2
27.01.2020, 19:30
  • 1
    Лучше предоставить фактическую информацию здесь и не только ссылку, ссылка могла бы измениться, и затем ответ не имеет значения в запасе –  Anthon 29.01.2014, 13:22
  • 2
    Wikipedia пуста. –  ihor_dvoretskyi 10.09.2015, 12:01
  • 3
    да, это было убрано, как жаль встряхивают... –  MordicusEtCubitus 21.12.2015, 18:23
  • 4
    , я отредактировал его с этими 3 инструментами –  MordicusEtCubitus 21.12.2015, 18:30

Вот мое мнение по этому поводу:

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 МБ файла.
У этого есть несколько проблем/особенностей:

  • Может быть разница после первого 1 МБ, поэтому результат скорее кандидат на проверку. Я мог бы исправить это позже.
  • Проверка сначала по размеру файла может ускорить это.
  • Принимает только файлы размером более 3 МБ.

Я использую его для сравнения видеоклипов, так что мне этого достаточно.

0
27.01.2020, 19:30

Я понимаю, что это некро, но это очень актуально. Я задавал аналогичный вопрос в Поиск дубликатов файлов на основе первых нескольких символов имени файла , и то, что было представлено, было решением для использования некоторого сценария awk.

Я использую его для очистки конфликтов модов, что полезно в пакетах Forge 1.14.4+, потому что Forge теперь отключает более старые моды вместо фатального сбоя и сообщения о дубликатах.

#!/bin/bash

declare -a names

xIFS="${IFS}"
IFS="^M"

while true; do
awk -F'[-_ ]' '
    NR==FNR {seen[tolower($1)]++; next}
    seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) > tmp.dat

        IDX=0
        names=()


        readarray names < tmp.dat

        size=${#names[@]}

        clear
        printf '\nPossible Dupes\n'

        for (( i=0; i<${size}; i++)); do
                printf '%s\t%s' ${i} ${names[i]}
        done

        printf '\nWhich dupe would you like to delete?\nEnter # to delete or q to quit\n'
        read n

        if [ $n == 'q' ]; then
                exit
        fi

        if [ $n -lt 0 ] || [ $n -gt $size ]; then
                read -p "Invalid Option: present [ENTER] to try again" dummyvar
                continue
        fi

        #clean the carriage return \n from the name
        IFS='^M'
        read -ra TARGET <<< "${names[$n]}"
        unset IFS

        #now remove the first element from the filesystem
        rm "${TARGET[0]}" 
        echo "removed ${TARGET[0]}" >> rm.log
done

IFS="${xIFS}"

Я рекомендую сохранить его как «dupes.sh» в вашу личную корзину или /usr/var/bin

0
05.11.2020, 14:42

У меня была ситуация, когда я работал в среде, где я не мог установить новое программное обеспечение, и мне приходилось сканировать >380 ГБ файлов JPG и MOV на наличие дубликатов. Я разработал следующий POSIX-скрипт awk для обработки всех данных за 72 секунды (, в отличие от подхода find -exec md5sum, выполнение которого занимало более 90 минут):

https://github.com/taltman/scripts/blob/master/unix_utils/find-dupes.awk

Вы называете это следующим образом:

ls -lTR | awk -f find-dupes.awk

Он был разработан в среде оболочки FreeBSD, поэтому для оптимальной работы в среде оболочки GNU/Linux могут потребоваться некоторые настройки.

3
10.01.2021, 02:04

В Linux для поиска дубликатов файлов можно использовать следующие инструменты.

https://github.com/adrianlopezroche/fdupes
https://github.com/arsenetar/dupeguru
https://github.com/jbruchon/jdupes
https://github.com/pauldreik/rdfind
https://github.com/pixelb/fslint
https://github.com/sahib/rmlint
0
19.11.2021, 04:55

Теги

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