Как найти и удалить дубликаты файлов в Linux

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

Предупреждение:

Будьте осторожны при удалении дубликатов. Если вы не будете осторожны, это приведет к случайной потере данных. Я советую вам быть очень внимательными при использовании этих инструментов.

Для целей этого руководства я собираюсь уделить внимание трем утилитам, а именно:

  1. Rdfind,
  2. Fdupes,
  3. FSlint.

Эти три утилиты бесплатны, с открытым исходным кодом и работают в большинстве Unix-подобных операционных систем.

Rdfind, означает redundant data find, что переводится как - поиск избыточных данных, и представляет собой бесплатную утилиту с открытым исходным кодом для сквозного поиска дубликатов файлов в корне и/или внутри каталогов и подкаталогов. Он сравнивает файлы на основе их содержимого, а не по именам файлов. Rdfind использует алгоритм ранжирования для классификации оригинальных и повторяющихся файлов. Если у вас есть два или более одинаковых файла, Rdfind достаточно умен, чтобы найти исходный файл, и рассматривает остальные файлы как дубликаты. Как только он найдет дубликаты, он сообщит об этом вам. Вы можете либо удалить их, либо заменить их жесткими ссылками или символьными (мягкими) ссылками.

Rdfind доступен в AUR. Таким образом, вы можете установить его в системах на базе Arch, используя любую вспомогательную программу AUR, такую как Yay, как показано ниже:

$ yay -S rdfind

В Debian, Ubuntu, Linux Mint:

$ sudo apt-get install rdfind

В Fedora:

$ sudo dnf install rdfind

В RHEL, CentOS:

$ sudo yum install epel-release 
$ sudo yum install rdfind

После установки просто запустите команду Rdfind вместе с указанием пути к каталогу в котором будет производиться поиск дубликатов файлов.

$ rdfind ~/Downloads

Как видно из приведенного выше снимка экрана, команда Rdfind сканирует каталог ~/Downloads и сохраняет результаты в файле с именем results.txt в текущем рабочем каталоге. Вы можете просмотреть имя возможных дубликатов файлов в файле results.txt.

$ cat results.txt
 
# Automatically generated 
# duptype id depth size device inode priority name 
DUPTYPE_FIRST_OCCURRENCE 1469 8 9 2050 15864884 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test5.regex 
DUPTYPE_WITHIN_SAME_TREE -1469 8 9 2050 15864886 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test6.regex 
[...] 
DUPTYPE_FIRST_OCCURRENCE 13 0 403635 2050 15740257 1 /home/sk/Downloads/Hyperledger(1).pdf 
DUPTYPE_WITHIN_SAME_TREE -13 0 403635 2050 15741071 1 /home/sk/Downloads/Hyperledger.pdf 
# end of file

Просмотрев файл results.txt, вы можете легко найти дубликаты. Вы можете удалить дубликаты вручную.
Кроме того, вы можете использовать опцию -dryrun для поиска всех дубликатов в заданном каталоге без изменения чего-либо и вывода сводки в вашем терминале:

$ rdfind -dryrun true ~/Downloads

Когда вы найдете дубликаты, вы можете заменить их либо жесткимим ссылками, либо символьными ссылками.

Чтобы заменить все дубликаты на жесткие ссылки, запустите:

$ rdfind -makehardlinks true ~/Downloads

Чтобы заменить все дубликаты символьными (мягкими) ссылками, запустите:

$ rdfind -makesymlinks true ~/Downloads

У вас могут быть пустые файлы в каталоге, вы можете их проигнорировать. Для этого используйте параметр -ignoreempty, как показано ниже:

$ rdfind -ignoreempty true ~/Downloads

Если вам больше не нужны дубликаты файлов, просто удалите их вместо замены жесткими или символьными ссылками. Чтобы удалить все дубликаты, просто запустите:

$ rdfind -deleteduplicates true ~/Downloads

Если вы не хотите игнорировать пустые файлы и удалять их вместе со всеми дубликатами, запустите:

$ rdfind -deleteduplicates true -ignoreempty false ~/Downloads

Для получения дополнительной информации можно посмотреть раздел справки:

$ rdfind --help

Или man:

$ man rdfind

Fdupes - еще одна утилита командной строки для идентификации и удаления дубликатов файлов в указанных каталогах и подкаталогах. Это бесплатная утилита с открытым исходным кодом, написанная на языке программирования C. Fdupes идентифицирует дубликаты, сравнивая размеры файлов, частичные подписи MD5, полные подписи MD5 и, наконец, выполняет побайтового сравнение.

Подобно утилите Rdfind, Fdupes обладает большим функционалом для выполнения операций:

  • Рекурсивно искать дубликаты файлов в каталогах и подкаталогах
  • Исключить из рассмотрения пустые файлы и скрытые файлы
  • Показывать размер дубликатов
  • Немедленно удалять дубликаты
  • Исключать файлы с разными битами владельца/группы или разрешения как дубликаты
  • И многое другое.

Fdupes по умолчанию доступен в репозиториях большинства дистрибутивов Linux.

На Arch Linux и его вариантах, таких как Antergos, Manjaro Linux, установите его с помощью Pacman, как показано ниже:

$ sudo pacman -S fdupes

В Debian, Ubuntu, Linux Mint:

$ sudo apt-get install fdupes

В Fedora:

$ sudo dnf install fdupes

В RHEL, CentOS:

$ sudo yum install epel-release 
$ sudo yum install fdupes

Использование Fdupes довольно просто. Просто запустите следующую команду, чтобы найти дубликаты файлов в каталоге, например, ~/Downloads:

$ fdupes ~/Downloads

Пример вывода:

/home/sk/Downloads/Hyperledger.pdf 
/home/sk/Downloads/Hyperledger(1).pdf

Как вы можете видеть, имеется дубликат файла в каталоге /home/test/Downloads/. Он показывает только дубликаты из родительского каталога. Как просмотреть дубликаты из подкаталогов? Просто используйте параметр -r, как показано ниже:

$ fdupes -r ~/Downloads

Теперь вы увидите дубликаты из каталога /home/test/Downloads/ и его подкаталогов.
Fdupes также может найти дубликаты сразу в нескольких каталогах:

$ fdupes ~/Downloads ~/Documents/test

Вы можете искать в нескольких каталогах, при этом в одном и в подкаталогах:

$ fdupes ~/Downloads -r ~/Documents/test

Вышеупомянутая команда выполняет поиск дубликатов в каталоге ~/Downloads и в каталоге ~/Documents/test с его подкаталогами.

Иногда вам может понадобиться узнать размер дубликатов в каталоге. Если это так, используйте параметр -S, как показано ниже:

$ fdupes -S ~/Downloads 
403635 bytes each:  
/home/sk/Downloads/Hyperledger.pdf 
/home/sk/Downloads/Hyperledger(1).pdf 

Аналогично, чтобы просмотреть размер дубликатов в каталогах и подкаталогах, используйте параметр -Sr. Мы можем исключить пустые и скрытые файлы из поиска, используя -n и -A соответственно:

$ fdupes -n ~/Downloads 
$ fdupes -A ~/Downloads

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

Чтобы просмотреть общую информацию о дублированных файлах, используйте параметр -m:

$ fdupes -m ~/Downloads 
1 duplicate files (in 1 sets), occupying 403.6 kilobytes

Чтобы удалить все дубликаты, используйте опцию -d.

$ fdupes -d ~/Downloads

Пример вывода:

[1] /home/sk/Downloads/Hyperledger Fabric Installation.pdf 
[2] /home/sk/Downloads/Hyperledger Fabric Installation(1).pdf 

Set 1 of 1, preserve files [1 - 2, all]:

Эта команда предложит вам сохранить файлы и удалить все остальные дубликаты. Просто введите любое число, чтобы сохранить соответствующий файл и удалить оставшиеся файлы. Будьте внимательны при использовании этой опции. Вы можете удалить исходные файлы, если не будете внимательны.

Если вы хотите сохранить первый файл в каждом наборе дубликатов и удалить остальные, не запрашивая каждый раз, используйте параметр -dN (не рекомендуется).

$ fdupes -dN ~/Downloads

Чтобы удалить дубликаты, по мере их встречи, используйте флаг -I.

$ fdupes -I ~/Downloads

Более подробную информацию о Fdupes см. в разделе справки и в справочных страницах.

$ fdupes --help 
$ man fdupes

FSlint - это еще одна утилита для поиска дубликатов файлов, которую я время от времени использую, чтобы избавиться от ненужных дубликатов файлов и освободить место на диске в моей системе Linux. В отличие от двух других утилит, FSlint имеет режимы GUI и CLI. Таким образом, это более удобный инструмент для новичков. FSlint не только находит дубликаты, но и плохие символьные ссылки, плохие имена, временные файлы, плохие IDS, пустые каталоги и не защищенные двоичные файлы и т.д.

FSlint доступен в AUR, поэтому вы можете установить его с помощью любых инструментов AUR.

$ yay -S fslint

В Debian, Ubuntu, Linux Mint:

$ sudo apt-get install fslint

В Fedora:

$ sudo dnf install fslint

В RHEL, CentOS:

$ sudo yum install epel-release 
$ sudo yum install fslint

Как только он будет установлен, запустите его из меню или панели запуска приложений.
Вот как выглядит FSlint GUI.

Как вы видете, интерфейс FSlint удобен и понятен. На вкладке Путь поиска добавьте путь к каталогу, который вы хотите отсканировать, и нажмите кнопку «Найти» в левом нижнем углу, чтобы найти дубликаты. Проверьте параметр рекурсивно для рекурсивного поиска дубликатов в каталогах и подкаталогах. FSlint быстро сканирует данный каталог и выведет их.

В списке выберите дубликаты, которые вы хотите очистить, и выберите действие, например, удалить,объединить, сохранить.

На вкладке Расширенные параметры поиска вы можете указать пути для исключения во время поиска дубликатов.

FSlint предоставляет набор служебных программ CLI для поиска дубликатов в вашей системе:

  • findup - список файлов с одинаковыми именами
  • findnl - найти все файлы с некорректными именами
  • findu8 - найти файлы с неверной кодировкой utf8
  • findbl - найти битые символьные ссылки
  • findsn - найти файлы с одинаковыми именами (проблемы с конфликтующими именами)
  • finded - найти все пустые каталоги
  • findid - найти все файлы с неверными идентификаторами
  • findns - найти бинарные файлы, содержащие отладочную информацию (non-stripped)
  • findsn - найти символьные ссылки
  • findrs - найти избыточные пробелы в файлах
  • findtf - найти все временные файлы
  • findul - найти, возможно, неиспользуемые библиотеки

Все эти утилиты доступны в каталоге /usr/share/fslint/fslint/.

Например, чтобы найти дубликаты в заданном каталоге, выполните следующие действия:

$ /usr/share/fslint/fslint/findup ~/Downloads/

Аналогично, чтобы найти пустые каталоги:

$ /usr/share/fslint/fslint/finded ~/Downloads/

Чтобы получить более подробную информацию о каждой утилите, например findup, выполните:

$ /usr/share/fslint/fslint/findup --help

Для получения дополнительной информации о FSlint см. раздел справки и справочные страницы.

$ /usr/share/fslint/fslint/fslint --help 
$ man fslint

Теперь вы знаете три инструмента для поиска и удаления ненужных дубликатов файлов в Linux. Среди этих трех инструментов я часто использую Rdfind. Это не означает, что две другие утилиты неэффективны, но до сих пор я доволен Rdfind. Выбор за вами