it-swarm-ru.tech

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

Я ищу простой способ (команда или серия команд, возможно, с find), чтобы найти дубликаты файлов в двух каталогах и заменить файлы в одном каталоге жесткими ссылками на файлы в другом каталоге.

Вот ситуация: это файловый сервер, на котором несколько человек хранят аудиофайлы, каждый из которых имеет свою собственную папку. Иногда несколько людей имеют копии одинаковых аудиофайлов. Прямо сейчас это дубликаты. Я хотел бы сделать так, чтобы они были жесткими ссылками, чтобы сэкономить место на жестком диске.

146
Josh

Существует скрипт Perl в http://cpansearch.Perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl , который делает именно то, что вы хотите:

Пройдите по всем каталогам, указанным в командной строке, вычислите контрольные суммы MD5 и найдите файлы с идентичным MD5. Если они равны, проведите реальное сравнение, если они действительно равны, замените второй из двух файлов жесткой ссылкой на первый.

42
fschmitt

rdfind делает именно то, что вы просите (и в порядке списков johny Why ). Позволяет удалять дубликаты, заменять их мягкими или жесткими ссылками. В сочетании с symlinks вы также можете сделать символическую ссылку либо абсолютной, либо относительной. Вы даже можете выбрать алгоритм контрольной суммы (md5 или sha1).

Поскольку он скомпилирован, он работает быстрее, чем большинство сценариев: time в папке 15 GiB) с 2600 файлами на моем Mac Mini 2009 года возвращает это

9.99s user 3.61s system 66% cpu 20.543 total

(используя md5).

Доступно в большинстве обработчиков пакетов (например, MacPorts для Mac OS X).

98
d-b

Используйте инструмент fdupes:

fdupes -r /path/to/folder выдает список дубликатов в каталоге (-r делает его рекурсивным). Вывод выглядит так:


filename1
Имя_файла2

имя_файла3
Filename4
Filename5


с именами filename1 и filename2 идентичны, а filename3, filename4 и filename5 также идентичны.

51
tante

Я использую hardlink from http://jak-linux.org/projects/hardlink/

24
waltinator

Это одна из функций, предоставляемых "fslint" - http://en.flossmanuals.net/FSlint/Introduction

Нажмите кнопку "Объединить":

Screenshot

18
LJ Wobker

Поскольку ваша основная цель - сэкономить дисковое пространство, существует другое решение: дедупликация (и, возможно, сжатие) на уровне файловой системы. По сравнению с решением с жесткой связью, оно не имеет проблемы непреднамеренного воздействия на другие связанные файлы.

ZFS имеет дедупликацию (на уровне блоков, а не на уровне файлов) с версии пула 23 и сжатие с давних времен. Если вы используете Linux, вы можете попробовать zfs-Fuse , или, если вы используете BSD, он изначально поддерживается.

14
Wei-Yin

В настоящее время в современном Linux есть https://github.com/g2p/bedup , который дедуплицирует в файловой системе btrfs, но 1) без больших затрат на сканирование, 2) файлы могут легко расходиться снова потом.

7
Matthew Bloch
aptitude show hardlink

Описание: Жесткие ссылки на несколько копий одного и того же файла Жесткая ссылка - это инструмент, который обнаруживает несколько копий одного и того же файла и заменяет их жесткими ссылками.

Идея взята из http://code.google.com/p/hardlinkpy/ , но код был написан с нуля и лицензирован в соответствии с MIT лицензия. Домашняя страница: http://jak-linux.org/projects/hardlink/

6
Julien Palard

Чтобы найти дубликаты файлов, вы можете использовать duff.

Duff - это утилита командной строки Unix для быстрого поиска дубликатов в заданном наборе файлов.

Просто запустите:

duff -r target-folder

Чтобы автоматически создавать жесткие ссылки на эти файлы, вам необходимо проанализировать вывод duff с bash или каким-либо другим сценарием язык.

6
Stefan

Я использовал многие из инструментов жестких ссылок для Linux, упомянутых здесь. Я тоже застрял с ext4 fs в Ubuntu и использую его cp -l и - s для жестких/мягких ссылок. Но недавно обратил внимание на облегченную копию на странице справки cp, которая подразумевает резервирование избыточного дискового пространства до одна сторона модифицируется:

   --reflink[=WHEN]
          control clone/CoW copies. See below

       When  --reflink[=always]  is specified, perform a lightweight copy, where the 
data blocks are copied only when modified.  If this is not possible the
       copy fails, or if --reflink=auto is specified, fall back to a standard copy.
4
Marcos

jdupes было упомянуто в комментарии, но заслуживает своего собственного ответа, так как он, вероятно, доступен в большинстве дистрибутивов и работает довольно быстро (он только что освободил 2,7 ГБ из 98% полного 158 ГБ раздела (SSD-накопителя) примерно в одна минута) :

jdupes -rL /foo/bar
4
Skippy le Grand Gourou

Мне кажется, что проверка имени файла может ускорить процесс. Если в двух файлах отсутствует одинаковое имя файла, то во многих случаях я не считаю их дубликатами. Похоже, что самым быстрым способом будет сравнение по порядку:

  • имя файла
  • размер
  • контрольная сумма md5
  • содержимое байта

Есть ли какие-либо методы сделать это? Посмотрите на duff, fdupes, rmlint, fslint и ​​т.д.

Следующий метод получил наибольшее число голосов commandlinefu.com : Найти дублирующиеся файлы (сначала по размеру, а затем по хешу MD5)

Можно ли добавить сравнение имени файла в качестве первого шага, а размер - в качестве второго шага?

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | \
  xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | \
  sort | uniq -w32 --all-repeated=separate
4
johny why

Так как я не фанат Perl, вот версия bash:

#!/bin/bash

DIR="/path/to/big/files"

find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo ln -f "$OLDFILE" "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done

Он находит все файлы с одинаковой контрольной суммой (большие, маленькие или уже жесткие) и жестко связывает их вместе.

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

ПРИМЕЧАНИЕ: Как уже упоминалось ранее, жесткие ссылки работают до тех пор, пока файлы никогда не нуждаются в модификации или перемещаются по файловым системам.

3
seren

Если вы хотите заменить дубликаты на Hard Links на Mac или любой системе на основе UNIX, вы можете попробовать SmartDupe http://sourceforge.net/projects/smartdupe/ я разрабатываю его

1
islam

Я сделал Perl-скрипт, который делает нечто похожее на то, о чем вы говорите:

http://Pastebin.com/U7mFHZU7

По сути, он просто пересекает каталог, вычисляя сумму SHA1 файлов в нем, хешируя его и связывая совпадения. Это пригодится во многих, многих случаях.

1
amphetamachine

Приложение FSLint ( http://www.pixelbeat.org/fslint/ ) может найти все одинаковые файлы в любой папке (по содержимому) и создать жесткие ссылки. Попробуйте!

Хорхе Сампайо

1
Jorge H B Sampaio Jr

Жесткие ссылки могут быть не лучшей идеей; если один пользователь изменяет файл, это влияет на оба. Однако удаление жесткой ссылки не удаляет оба файла. Кроме того, я не совсем уверен, занимают ли жесткие ссылки такое же количество места (на жестком диске, а не в ОС), как несколько копий одного и того же файла; согласно Windows (с расширением Link Shell), они делают. Конечно, это Windows, а не Unix ...

Мое решение состояло бы в том, чтобы создать "общий" файл в скрытой папке и заменить фактические дубликаты символическими ссылками ... тогда символические ссылки будут встроены в метаданные или альтернативные потоки файлов, которые записывают только два "файла" отличаются друг от друга, например, если один человек хочет изменить имя файла или добавить обложку альбома или что-то подобное; это может быть даже полезно вне приложений баз данных, таких как установка нескольких версий одной и той же игры или программного обеспечения и их независимое тестирование даже с небольшими различиями.

0
Amaroq Starwind

Если вы будете делать жесткие ссылки, обратите внимание на права на этот файл. Обратите внимание, что владелец, группа, режим, расширенные атрибуты, время и ACL (если вы используете это) хранятся в INODE. Отличаются только имена файлов, поскольку они хранятся в структуре каталогов, а другие указывают на свойства INODE. По этой причине все имена файлов, связанные с одним и тем же узлом, имеют одинаковые права доступа. Вы должны предотвратить изменение этого файла, потому что любой пользователь может повредить файл другим. Это просто. Достаточно, любой пользователь ставит другой файл с тем же именем. Номер инода затем сохраняется, а исходное содержимое файла уничтожается (заменяется) для всех жестко связанных имен.

Лучший способ - дедупликация на уровне файловой системы. Вы можете использовать BTRFS (очень популярный в последнее время), OCFS или подобное. Посмотрите на страницу: https://en.wikipedia.org/wiki/Comparison_of_file_systems , специально для таблицы Характеристики и дедупликации данных столбца. Вы можете нажать на нее и отсортировать :)

Специально посмотрите на файловую систему ZFS. Это доступно как Fuse, но таким образом это очень медленно. Если вам нужна встроенная поддержка, посмотрите на страницу http://zfsonlinux.org/ . Затем вы должны исправить ядро, а затем установить zfs инструменты для управления. Я не понимаю, почему Linux не поддерживает в качестве драйверов, это путь для многих других операционных систем/ядер.

Файловые системы поддерживают дедупликацию двумя способами: дедупликацию файлов или блоков. ZFS поддерживает блок. Это означает, что одно и то же содержимое, которое повторяется в одном и том же файле, может быть дедуплицировано. Другой способ - это время, когда данные дедуплицируются, это может быть онлайн (zfs) или автономно (btrfs).

Обратите внимание, дедупликация потребляет оперативную память. Вот почему запись файлов на том ZFS, смонтированный с помощью Fuse, резко снижает производительность. Это описано в документации. Но вы можете онлайн включить/выключить дедупликацию на томе. Если вы видите, что какие-либо данные должны быть дедуплицированы, вы просто включаете дедупликацию, переписываете какой-либо файл в любой временный и, наконец, заменяете. После этого вы можете отключить дедупликацию и восстановить полную производительность. Конечно, вы можете добавить в хранилище любые кеш-диски. Это может быть очень быстрый поворот дисков или SSD дисков. Конечно, это могут быть очень маленькие диски. В реальной работе это замена RAM :)

В Linux вы должны позаботиться о ZFS, потому что не все работают должным образом, особенно когда вы управляете файловой системой, делаете снимок и т.д., Но если вы конфигурируете и не меняете его, все работает правильно. Другим способом, вы должны изменить linux на opensolaris, он изначально поддерживает ZFS :) Что очень хорошо в ZFS, так это то, что он работает как файловая система, так и менеджер уровней, похожий на LVM. Вам не нужно это, когда вы используете ZFS. Смотрите документацию, если вы хотите узнать больше.

Обратите внимание на разницу между ZFS и BTRFS. ZFS более старая и более зрелая, к сожалению, только в Solaris и OpenSolaris (к сожалению, задушена Oracle). BTRFS моложе, но в последнее время очень хорошо поддерживается. Я рекомендую свежее ядро. ZFS имеет дедупликацию онлайн, что приводит к замедлению записи, потому что все рассчитывается онлайн. BTRFS поддерживает автономную дедупликацию. Тогда это экономит производительность, но когда хосту нечего делать, вы периодически запускаете инструмент для дедупликации. И BTRFS изначально создан под Linux. Может быть, это лучше FS для вас :)

0
Znik

Самый простой способ - использовать специальную программу dupeGuru

dupeGuru Preferences Screenshot

как документация говорит

Варианты удаления

Эти параметры влияют на способ удаления дубликатов. В большинстве случаев вам не нужно включать какие-либо из них.

Ссылка удаленных файлов:

Удаленные файлы заменяются ссылкой на справочный файл. Вы можете заменить его символической или жесткой ссылкой. ... символическая ссылка - это быстрый путь к файлу. Если исходный файл удален или перемещен, ссылка не работает. Жесткая ссылка - это ссылка на сам файл. Эта ссылка так же хороша, как и "настоящий" файл. Только когда все жесткие ссылки на файл удаляются, сам файл удаляется.

В OSX и Linux эта функция поддерживается полностью, но в Windows это немного сложно. Windows XP не поддерживает его, но Vista и выше поддерживают его. Однако, чтобы эта функция работала, dupeGuru должен работать с правами администратора.

0