Як замінити всі повторювані файли жорсткими посиланнями?


20

У мене є дві папки, що містять різні файли. Деякі файли з першої папки мають точну копію у другій папці. Я хотів би замінити ці на жорстке посилання. Як я можу це зробити?


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

дафф

  • Створений для пошуку файлів, на які користувач потім діє; не доступні дії
  • Порівняння проводиться за розміром файлу, потім шаш х1.
    • Хеш може бути змінено на 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

1
"тоді або md5 (за замовчуванням), або sha1." Це не означає, що файли однакові. Оскільки для обчислення хеша програма вимагає все-таки прочитати весь файл, він повинен просто порівняти цілі файли байт-байт. Економить і час процесора.
ендоліт

@endolith Отож, ти завжди починаєш з бігу, щоб побачити, що буде ...
Ізката

1
Але сенс програмного забезпечення - визначити дублікати файлів для вас. Якщо вам доведеться вручну двічі перевірити, чи файли є насправді копіями, це не добре.
ендоліт


2
Якщо у вас n файлів однакового розміру, перших байтів і кінцевих байтів, але всі вони інакше різні, визначаючи, що при прямому порівнянні потрібно n ! парні порівняння. Хеширование їх усіх тоді порівняння хешей, швидше за все, буде набагато швидше, особливо для великих файлів та / або великої кількості файлів. Кожен, хто пройде цей фільтр, може продовжувати робити прямі порівняння для перевірки. (Або просто скористайтеся кращим хешем для початку.)
Алан Де Смет

6

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

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

Особливості:

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

1

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


2

Шукач дублікатів і тих же файлів - це ще одне рішення для Windows:

Duplicate & Same Files Searcher (Дублікат Searcher) - це програма для пошуку дублікатів файлів (клонів) та жорстких посилань NTFS до одного файлу. Він шукає дублікат вмісту файлу незалежно від імені файлу (використовується істинне порівняння байт-байт). Ця програма дозволяє не тільки видаляти повторювані файли або переміщувати їх в інше місце, але і замінювати дублікати жорсткими посиланнями NTFS (унікальні!)

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


1

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

Я, на жаль, деякий час повернув програмне забезпечення (у масовій видаленні різних програм), тому не можу створювати більше посилань вручну, але піктограми все ще з'являються автоматично, коли Windows виявляє посилання Hard, Symbolic або Junction.


1

Я настійно рекомендую jdupes . Це вдосконалена вилка fdupes , але також включає:

  • купа нових параметрів командного рядка - включаючи --linkhardабо -Lкоротко
  • вбудована підтримка всіх основних платформ ОС
  • За середньою швидкістю швидкість перевищує 7 разів

Що стосується вашого питання, ви можете просто виконати $ jdupes -L /path/to/your/files.

Можливо, ви захочете клонувати та створювати останнє джерело з його репортажу GitHub, оскільки проект все ще знаходиться в активній розробці. Тут також надано двійкові файли Windows . Упаковані бінарні файли доступні в деяких дистрибутивах Linux / BSD - насправді я вперше знайшов це $ apt search.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.