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

20

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

QDII
источник
2
Пожалуйста, укажите ОС и файловую систему.
Стивен
Ну, я использую ext4 в Ubuntu 15.04, но если кто-то предоставит ответ для другой ОС, я уверен, что он может быть полезен для тех, кто читает этот вопрос.
QDII

Ответы:

20

Я знаю о 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
Izkata
источник
1
msgstr "тогда либо md5 (по умолчанию), либо sha1." Это не значит, что файлы идентичны. Поскольку вычисление хэша требует, чтобы программа все равно прочитала весь файл, она должна просто сравнивать байты за байтом. Экономит процессорное время тоже.
эндолит
@endolith Вот почему вы всегда начинаете с пробного пуска, чтобы посмотреть, что произойдет ...
Изката
1
Но смысл программного обеспечения заключается в том, чтобы идентифицировать дубликаты файлов для вас. Если вам нужно вручную перепроверить, что файлы на самом деле являются дубликатами, то это бесполезно.
эндолит
2
Если у вас есть n файлов с одинаковым размером, первыми байтами и конечными байтами, но все они отличаются друг от друга, для определения этого путем прямого сравнения требуется n ! парные сравнения. Хэширование их всех, тогда сравнение хешей, вероятно, будет намного быстрее, особенно для больших файлов и / или большого количества файлов. Любой, кто проходит этот фильтр, может выполнять прямые сравнения для проверки. (Или просто используйте лучший хеш для начала.)
Алан Де Смет
6

Duplicate Commander - это возможное решение для Windows:

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

Функции:

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

1

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

Каран
источник
2

Duplicate & Same File Searcher - это еще одно решение для Windows:

Duplicate & Same Files Searcher (Duplicate Searcher) - это приложение для поиска дубликатов файлов (клонов) и жестких ссылок NTFS к одному и тому же файлу. Он ищет дубликаты содержимого файла независимо от имени файла (используется истинное межбайтовое сравнение). Это приложение позволяет не только удалять дубликаты файлов или перемещать их в другое место, но также заменять дубликаты жесткими ссылками NTFS (уникально!)

введите описание изображения здесь

Greck
источник
1

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

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

Amaroq Starwind
источник
1

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

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

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

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

Arnie97
источник