Вопрос или проблема
У меня есть две папки, содержащие различные файлы. Некоторые файлы из первой папки имеют точную копию во второй папке. Я хотел бы заменить их жесткой ссылкой. Как я могу это сделать?
Я знаю о 4 решениях командной строки для Linux. Мой предпочтительный – это последний из перечисленных здесь, rdfind
, из-за всех доступных опций.
fdupes
- Это, кажется, наиболее рекомендованное/наиболее известное решение.
- Это самое простое в использовании, но его единственное действие – это удаление дубликатов.
- Чтобы убедиться, что дубликаты действительно дубликаты (при этом не тратя слишком много времени на выполнение), сравнения между файлами проводятся сначала по размеру файла, затем хешу md5, затем побайтово.
Пример вывода (с опциями “показать размер”, “рекурсивный”):
$ fdupes -Sr .
17 байт каждый:
./Dir1/Some File
./Dir2/SomeFile
hardlink
- Предназначен для замены найденных файлов жесткими ссылками, как видно из названия.
- Имеет опцию
--dry-run
. - Не указывает, как сравниваются содержимое, но в отличие от всех других опций, принимает во внимание режим файла, владельца и время изменения.
Пример вывода (обратите внимание, что у моих двух файлов немного разные времена изменения, поэтому во втором запуске я говорю ему игнорировать это):
$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500
$ hardlink --dry-run -v .
Mode: dry-run
Files: 5
Linked: 0 файлов
Compared: 0 файлов
Saved: 0 байт
Duration: 0.00 секунд
$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 байт)
Mode: dry-run
Files: 5
Linked: 1 файлов
Compared: 1 файлов
Saved: 17 байт
Duration: 0.00 секунд
duff
- Создан для поиска файлов, с которыми пользователь затем будет работать; не имеет доступных действий.
- Сравнения производятся по размеру файла, затем по хешу sha1.
- Хеш можно изменить на sha256, sha384 или sha512.
- Хеш можно отключить для побайтового сравнения.
Пример вывода (с опцией “рекурсивный”):
$ duff -r .
2 файла в кластере 1 (17 байт, хеш 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File
rdfind
- Опции имеют необычный синтаксис (подразумевается имитация
find
?). - Несколько опций для действий над дубликатами файлов (удаление, создание симлинков, создание жестких ссылок).
- Имеет режим сухого запуска.
- Сравнения проводятся по размеру файла, затем по первым байтам, затем по последним байтам, затем либо по md5 (по умолчанию), либо по sha1.
- Ранжирование найденных файлов делает предсказуемым, какой файл считается оригинальным.
Пример вывода:
$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Сейчас сканируется ".", найдено 5 файлов.
(DRYRUN MODE) Сейчас имеется 5 файлов всего.
(DRYRUN MODE) Удалено 0 файлов из-за неуникального устройства и inode.
(DRYRUN MODE) Сейчас удаляются файлы с нулевым размером из списка...удалено 0 файлов
(DRYRUN MODE) Общий размер 13341 байт или 13 киб
(DRYRUN MODE) Сейчас сортируется по размеру: удалено 3 файла из-за уникальных размеров из списка. Осталось 2 файла.
(DRYRUN MODE) Сейчас устраняются кандидаты на основе первых байтов: удалено 0 файлов из списка. Осталось 2 файла.
(DRYRUN MODE) Сейчас устраняются кандидаты на основе последних байтов: удалено 0 файлов из списка. Осталось 2 файла.
(DRYRUN MODE) Сейчас устраняются кандидаты на основе контрольной суммы md5: удалено 0 файлов из списка. Осталось 2 файла.
(DRYRUN MODE) Похоже, у вас есть 2 файла, которые не уникальны
(DRYRUN MODE) Всего, можно сократить 17 байт.
(DRYRUN MODE) Сейчас создается файл результатов results.txt
(DRYRUN MODE) Сейчас создаются жесткие ссылки.
Жесткая ссылка ./Dir1/Some File на ./Dir2/SomeFile
Создано 1 ссылки.
$ cat results.txt
# Автоматически сгенерировано
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# конец файла
Я очень рекомендую jdupes. Это улучшенная форк-версия fdupes, но также включает:
- множество новых опций командной строки — включая
--linkhard
или-L
для краткости - нативную поддержку для всех основных платформ ОС
- скорость, которая в среднем в 7 раз выше, чем у fdupes
Для вашего вопроса, вы можете просто выполнить $ jdupes -L /path/to/your/files
.
Вы можете захотеть клонировать и строить последнюю версию из ее репозитория GitHub, так как проект все еще активно развивается.
Бинарники для Windows также предоставлены здесь. Упакованные бинарные файлы доступны в некоторых дистрибутивах Linux / BSD — на самом деле я впервые нашел его через $ apt search
.
Duplicate Commander — возможное решение на Windows:
Duplicate Commander — это бесплатное приложение, которое позволяет находить
и управлять дубликатами файлов на вашем ПК. Duplicate Commander поставляется с
многими функциями и инструментами, которые позволяют восстановить ваше дисковое пространство от этих дубликатов.Функции:
Замена файлов жесткими ссылками Замена файлов мягкими ссылками ... (и многое другое) ...
Для Linux вы можете найти скрипт Bash здесь.
Duplicate & Same File Searcher — это еще одно решение на Windows:
Duplicate & Same Files Searcher (Duplicate Searcher) — это приложение
для поиска дубликатов файлов (клонов) и жестких ссылок NTFS на одни и те же
файлы. Оно ищет дублирующие содержимое файлов независимо от имени файла
(используется истинное побайтовое сравнение). Это приложение позволяет не
только удалять дубликаты файлов или перемещать их в другое место,
но и заменять их жесткими ссылками NTFS (уникально!)
У меня на компьютере была интересная бесплатная утилита под названием Link Shell Extension; она не только была отличной для создания жестких и символических ссылок, но и соединений! Кроме того, она добавляла пользовательские иконки, которые позволяют легко различать разные типы ссылок, даже те, что уже существовали до установки; красные стрелки представляют жесткие ссылки, например, зеленые представляют символические ссылки… а цепочки представляют соединения.
К сожалению, я удалил программное обеспечение некоторое время назад (в процессе массового удаления различных программ), поэтому я больше не могу создавать ссылки вручную, но иконки все еще появляются автоматически, когда Windows обнаруживает жесткую, символическую или сочетанную ссылку.
Очень поздний ответ, но fclones
невероятно быстрый (написан на rust
) и предлагает это (и даже рефлинки на файловых системах COW, таких как btrfs). Мне также нравится тот факт, что он разделяет “группировку” от “что с ними делать”, и вы можете изучить промежуточный файл, чтобы убедиться, что он вам нравится. Мне также очень нравится, что он может сохранять контрольные суммы в файле кеша (если указано в командной строке), что ускоряет процесс дедупликации, если нужно повторить, изменить и т.д.
Ответ или решение
Замена дублирующихся файлов в двух папках на жесткие ссылки может значительно сэкономить дисковое пространство и упростить управление файлами. Для решения данной задачи на Linux существует несколько подходов с использованием различных командных утилит. В этом ответе мы подробно рассмотрим все основные варианты, уделяя особое внимание инструменту rdfind
, который является предпочтительным благодаря широким возможностям.
Теоретическая основа
Жесткие ссылки — это ссылки, которые указывают на одно и то же физическое расположение данных на диске. Если заменить дублирующиеся файлы на жесткие ссылки, это позволит избежать хранения одинаковых данных в разных файлах. Жесткие ссылки можно использовать в пределах одного файлового раздела.
Примеры инструментов
-
fdupes:
- Это наиболее распространенный и простой в использовании инструмент для поиска дубликатов. Он проводит сравнение по размеру файлов, затем по хеш-сумме md5, и наконец — побайтовое сравнение.
- Ограничение:
fdupes
может только удалять дубликаты, функциональность замены на ссылки отсутствует.
-
hardlink:
- Предназначен исключительно для замены файлов на жесткие ссылки.
- Имеет опции для проведения "сухого запуска" (без фактических изменений), что удобно для предварительного анализа.
- Задействует режим, владельца и время модификации файла, что может быть как преимуществом, так и недостатком.
-
duff:
- Определяет дубликаты, но не предлагает действия по их замене. Формирует кластер дубликатов для последующей обработки.
- Использует хеширование sha1 по умолчанию с возможностью переключения на более сильные алгоритмы или побайтовый анализ.
-
rdfind:
- Обладает наиболее гибким набором опций для работы с дубликатами, включая удаление, создание символических и жестких ссылок.
- Поддерживает "сухой запуск" для проверки без внесения изменений.
- Методика сравнения включает использование размеров файлов, анализ первых и последних байтов, и, по умолчанию, хеш-сумму md5.
Инструмент rdfind: Применение
rdfind
выделяется среди других утилит благодаря разнообразию опций и продуманности механизма работы. Вы можете указать команды для выполнения в файле, который создается после выполнения утилиты, что позволяет детально анализировать потенциальные изменения.
Пример использования rdfind
для создания жестких ссылок:
rdfind -makehardlinks true /путь/к/вашим/папкам
Это запустит процесс поиска дубликатов и их замены на жесткие ссылки. Использование ключа -dryrun true
позволит сначала увидеть потенциальные изменения без их фактического применения.
Дополнительные инструменты
Для платформы Windows также доступны инструменты, такие как Duplicate Commander
и Duplicate & Same File Searcher
, которые предоставляют функционал для поиска и замены дубликатов на жесткие ссылки. Также существует Link Shell Extension
, предоставляющий удобство в управлении ссылками через графический интерфейс.
Реализация и рекомендации
Практическая реализация может быть различной в зависимости от конкретных условий и требований. Для больших наборов данных или особенных файловых систем (например, с поддержкой CoW, таких как btrfs), стоит рассмотреть инструмент fclones
, реализованный на языке Rust, который предлагает высокую производительность и дополнительный функционал, такой как хранение контрольных сумм в кэше для ускорения повторных операций.
Подводя итог, выбор инструмента зависит от ваших предпочтений: хотите ли вы гибкости и контроля (rdfind
), либо максимальной скорости и простоты (jdupes
). Важно ознакомиться с документацией для каждого указанного инструмента, чтобы выбрать наиболее подходящее решение под ваши специфические задачи.