Дисковое хранилище компьютера имеет одну неприятную особенность — это ограниченный размер диска, который может вместить только определённый объём информации. В какой-то не самый подходящий момент вы можете столкнуться с тем, что ваш диск, или даже диски, забиты под самую завязку. И не всегда сразу понятно, чем заполнено дисковое пространство. По собственному опыту могу сказать, что чем больше объём диска, тем меньше контроля за сохраняемыми на диск файлами. Кажется, что места много, а с содержимым можно будет разобраться позже.
Ещё одно наблюдение, — со временем забывается, что файлы уже имеются на диске, и по несколько раз могут сохраняться в разных директориях. Особенно это касается фотографий, а если дублируются ещё и видеофайлы, которые могут запросто занимать по несколько гигабайт, то время заполнения диска сокращается в разы. Но не стоит отчаиваться, так как в Linux имеются инструменты, которые могут помочь вам обнаружить дублирующиеся файлы.
GUI или CLI?
К графическим утилитам для очистки файловой системы от «мусорных» файлов относятся FSlint и кроссплатформенная программа dupeGuru. Оба приложения очень сильно облегчают задачу очистки диска от одинаковых файлов (дубликатов файлов), битых символических ссылок, пустых директорий, файлов с некорректными именами, временных файлов и прочего. Но я сторонник использования всей мощи консоли Linux, и поэтому в этой статье мы рассмотрим инструмент командной строки fdupes.
FDUPES увидела свет в далёком 2000 году. Исходный код в архиве весит чуть менее 150 KB. Последняя версия на момент написания статьи 2.2.1 была выпущена в сентябре 2022 года, и к сожалению не попала во все репозитории. Но ничто и никто не мешает скомпилировать программу из исходного кода. После того как вы скачаете и распакуете архив вам останется исполнить последовательно знакомые всем линуксоидам три команды:
- ./configure
- make
- make install
Начиная с версии 2.0 у программы есть две зависимости, которые вам, возможно, придётся устранить самостоятельно. Для этого следуйте инструкциям в файле INSTALL.enduser из распакованного архива.
Установка и работа с fdupes
Установка fdupes происходит стандартно, и в зависимости от дистрибутива надо выполнить команду. Для Debian и его производных:
sudo apt install fdupes
Для Fedora:
sudo dnf install fdupes
В Arch Linux и его производных дистрибутивах:
sudo pacman -S fdupes
После установки вы можете сразу же использовать инструмент без какой-либо настройки. Он ищет и выявляет дубликаты файлов в указанных каталогах в несколько этапов. Имя файла не имеет значения для определения дубликата. Достаточно, чтобы два файла имели одинаковый размер. Программа сравнивает их контрольные суммы MD5. Затем fdupes выполняет сравнение файлов байт за байтом, чтобы убедиться, что это точно один и тот же файл.
Fdupes имеет множество опций, которые позволяют управлять поиском и последующим выявлением дубликатов файлов. Перед началом работы не будет лишним ознакомиться с инструментом, выполнив команду:
fdupes --help
Это поможет вам определиться с выбором опции, которые подходят для вашего случая.
Немного практики
Для теста создадим вложенные каталоги «temp» и «testdir» в домашней директории пользователя, а затем создадим внутри папки «testdir» десять текстовых файлов с одинаковым содержанием, но разными названиями. Чтобы быстро сделать это, выполните в командной строке следующее:
mkdir -p /home/"$USER"/temp/testdir && cd /home/"$USER"/temp/testdir && for i in {1..10}; do echo "FDUPES - программа для выявления или удаления дубликатов файлов, которые находятся в указанных каталогах." > test_text_${i}.txt ; done
Для того чтобы убедиться, что файлы были созданы, не выходя из консоли запустите команду:
ls -l /home/"$USER"/temp/testdir
Самый простой способ поиска дубликатов в каталоге — использовать команду:
fdupes ~/temp/testdir
Можно выполнить поиск дубликатов сразу в нескольких каталогах, указав их пути через пробел. А ещё можно совершить рекурсивный поиск файлов в указанном каталоге, а также найти файлы во всех его подкаталогах. Для этого нужно использовать опцию -r, как показано ниже:
fdupes -r ~/temp
Если перед запуском последней команды вы создадите несколько одинаковых файлов в директории «temp», то инструмент найдёт все десять текстовых файлов в каталоге «testdir» вместе с вновь созданными файлами в родительской директории.
Опция -S (—size) покажет размер дублирующихся файлов. Вы можете использовать опцию -t или —time, чтобы узнать, когда файл был изменен в последний раз. Опция -G или —minsize=SIZE укажет программе искать файлы размером больше или равным SIZE. То же относится и к -L или —maxsize=SIZE — эта опция позволяет искать файлы размером меньше или равным SIZE.
Осторожность превыше всего
Поиск и выявление дубликатов файлов — это только половина работы. Перед нами стоит задача по освобождению места на жёстком диске. Опция -d или —delete покажет пользователю файлы, которые необходимо сохранить, а все остальные программа удалит. Так команда
fdupes -d ~/temp/testdir
сначала перечислит файлы в нумерованном списке. Если теперь вы введёте номера, разделив их запятыми, то такие файлы отметятся знаком «плюс» и в дальнейшем останутся на диске, а все дубликаты, отмеченные знаком «минус» программа удалит.
Допустим что вы допустили ошибку в выборе файлов, в таком случае команда rg сбросит изменения.
В случае, когда вы на сто процентов уверены и хотите удалить все дубликаты, кроме первого отображаемого в списке, используйте команду:
fdupes -r -d -N /path
имейте в виду, что опция -N (—noprompt) работает без подтверждения.
Жесткие и символьные ссылки
Файл на жёстком диске существует до тех пор, пока существует хотя бы одна жёсткая ссылка на этот файл в пределах этого диска. В отличие от символьной ссылки, где указатель меняется при переименовании файла, жёсткая ссылка продолжает указывать на оригинальный файл и после переименования. Поэтому важно определять такие файлы с помощью опции -H.
Важно помнить, если вы используете опцию удаления (-d) вместе с опцией, указывающей на символьные ссылки (-s или —symlinks), то данные могут быть безвозвратно потеряны. К примеру, вы можете по ошибке сохранить символьную ссылку, при этом удалив оригинальный файл, на который она указывает. Аналогичная проблема возникает при указании какого-либо каталога более одного раза. В таком случае все файлы в этом каталоге будут перечислены как их собственные дубликаты. Файлы, удаленные с помощью fdupes, не могут быть восстановлены.
Почему именно командная строка?
У вас может возникнуть вполне резонный вопрос, — почему я выбрал именно fdupes, инструмент командной строки, когда есть альтернативы с графическим интерфейсом? Ответ до банального прост. Приложения с графическим интерфейсом не могут быть развернуты на большинстве серверов, — это раз. И не менее важно учитывать скорость обработки файлов в консоли, которая намного быстрее, чем у любого приложения с GUI, особенно при поиске в больших каталогах, со множеством подкаталогов, — это два.
К тому же, приложение FSlint, которое написано на языке Python, и его гораздо шустрый преемник Czkawka, написанный на языке Rust, отсутствуют в репозиториях Debian-подобных дистрибутивов. Вместо этого нам предлагают установить их как snap-пакеты. Как альтернатива с графическим интерфейсом остаётся — DupeGuru. И раз уж заговорили об альтернативах fdupes, то есть ещё одна консольная прогармма — Jdupes, которая также доступна в большинстве репозиториев. Но имейте в виду, что команды у этих двух инструментов отличаются, хотя предназначение одно и то же.
Выводы
Fdupes позволяет находить, удалять или преобразовывать дубликаты. Однако в типичных случаях использования утилиты имеются подводные камни, которые могут привести к невосполнимой потере данных. Помимо потенциальных проблем с символьными и жёсткими ссылками, как упоминалось ранее, существуют системные файлы, для которых должны существовать дубликаты. Если не исключить эти файлы из поиска, то можно столкнуться с крахом всей системы. Даже пустые каталоги или файлы, в некоторых случаях, нельзя просто взять и удалить.
Используя инструмент fdupes, или ему подобные приложения, всегда полагайтесь на поговорку: «Семь раз отмерь, один раз отрежь». Никогда нельзя принимать решения второпях. Нужно всё тщательно обдумывать, ведь последствия могут быть необратимы.
Что вы думаете?
Показать комментарии / Оставить комментарий