Как заменить все дубликаты файлов жесткими ссылками?

Как заменить все дубликаты файлов жесткими ссылками?

У меня есть две папки, содержащие различные файлы. Некоторые файлы из первой папки имеют точную копию во второй папке. Я хотел бы заменить их жесткой ссылкой. Как это сделать?

решение1

Я знаю 4 решения командной строки для Linux. Я предпочитаю последнее из перечисленных здесь, rdfind, из-за всех доступных опций.

fdupes

  • Похоже, это самый рекомендуемый/самый известный вариант.
  • Он самый простой в использовании, но его единственное действие — удаление дубликатов.
  • Чтобы убедиться, что дубликаты действительно являются дубликатами (и при этом не требуется целая вечность), сравнение файлов выполняется сначала по размеру файла, затем по хэшу md5, а затем побайтовое сравнение.

Пример вывода (с опциями «показать размер», «рекурсивный»):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

жесткая ссылка

  • Предназначен, как следует из названия, для замены найденных файлов жесткими ссылками.
  • Есть --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 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

дафф

  • Создан для поиска файлов, с которыми затем работает пользователь; не имеет доступных действий.
  • Сравнения выполняются по размеру файла, затем по хэшу sha1.
    • Хэш можно изменить на sha256, sha384 или sha512.
    • Хэш можно отключить для побайтового сравнения.

Пример вывода (с опцией «рекурсивный»):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • Опции имеют необычный синтаксис (имитируют find?).
  • Несколько вариантов действий с дубликатами файлов (удаление, создание символических ссылок, создание жестких ссылок).
  • Имеет режим холостого хода.
  • Сравнения выполняются по размеру файла, затем по первым байтам, затем по последним байтам, затем либо по md5 (по умолчанию), либо по sha1.
  • Ранжирование найденных файлов позволяет предсказать, какой файл считать оригиналом.

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

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# 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
# end of file

решение2

я очень рекомендуюjdupes. Это улучшенная версияfdupes, но также включает в себя:

  • множество новых параметров командной строки — включая--linkhard, или-Lдля краткости
  • встроенная поддержка всех основных платформ ОС
  • говорят, что скорость в среднем в 7 раз выше, чем у fdupes

Для вашего вопроса вы можете просто выполнить$ jdupes -L /path/to/your/files.

Вы можете захотеть клонировать и собрать последнюю версию исходного кода из нееРепозиторий GitHubпоскольку проект все еще находится в стадии активной разработки. Двоичные файлы Windowsтакже представлены здесь. Упакованные двоичные файлы доступны в некоторых дистрибутивах Linux / BSD — на самом деле я впервые нашел их через $ apt search.

решение3

Дубликат командиравозможное решение для Windows:

Duplicate Commander — это бесплатное приложение, позволяющее находить и управлять дубликатами файлов на вашем ПК. Duplicate Commander поставляется со многими функциями и инструментами, которые позволяют вам восстанавливать дисковое пространство от этих дубликатов.

Функции:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

Для Linux вы можете найти скрипт Bashздесь.

решение4

У меня на компьютере был отличный бесплатный инструмент под названием Link Shell Extension; он не только отлично подходил для создания жестких и символических ссылок, но и соединений! Кроме того, он добавлял пользовательские значки, которые позволяют легко определять различные типы ссылок, даже те, которые уже существовали до установки; например, красные стрелки представляют жесткие ссылки, в то время как зеленые представляют символические ссылки... а цепочки представляют соединения.

К сожалению, некоторое время назад я удалил программное обеспечение (при массовом удалении различных программ), поэтому больше не могу создавать ссылки вручную, но значки по-прежнему автоматически появляются всякий раз, когда Windows обнаруживает жесткую, символическую или соединительную ссылку.

Связанный контент