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

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

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

  • Разрешение отклонено для записи в журнал mysql
  • потерянный в переводе: "изменено на
  • write () игнорирует права доступа к файлам
  • Ограничительные «групповые» разрешения, но открывают «мировые» разрешения?
  • Размер файла после вырезания
  • В чем разница между> и >> (особенно это касается использования с программой cat)?
  • Проверка файлов для условных обозначений
  • Как установить групповую политику для доступа ко всем папкам, кроме одного?
  • 18 Solutions collect form web for “Есть ли простой способ заменить дубликаты файлов на hardlinks?”

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

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

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

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


    filename1
    filename2

    имя_файла3
    filename4
    filename5


    с filename1 и filename2, являющимися идентичными, и filename3, filename4 и filename5 также являются идентичными.

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

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

     9.99s user 3.61s system 66% cpu 20.543 total 

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

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

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

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

    Нажмите кнопку «Слияние»:

    Скриншот

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

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

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

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

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

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

     duff -r target-folder 

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

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

      --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. 
     aptitude show hardlink 

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

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

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

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

    Используют ли какие-либо методы? Посмотрите на fdupes , rmlint , fslint , 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 

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

    http://pastebin.com/U7mFHZU7

    В принципе, он просто перемещается по каталогу, вычисляет SHA1sum файлов в нем, хэширует его и связывает совпадения. Это пригодится во многих случаях.

    Поскольку я не поклонник 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 

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

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

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

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

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

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

    Если вы будете делать жесткие ссылки, обратите внимание на права на этот файл. Обратите внимание: владелец, группа, режим, расширенные атрибуты, время и ACL (если вы используете это) сохраняются в INODE. Только имена файлов различаются, поскольку они хранятся в структуре каталогов, а другие указывают на свойства 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. Конечно, это могут быть очень маленькие диски. В реальной работе это замена для ОЗУ ๐Ÿ™‚

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

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

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

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

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

    Настройки экрана dupeGuru

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

    Параметры удаления

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

    Связывание удаленных файлов:

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

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

    Interesting Posts
    Linux ะธ Unix - ะปัƒั‡ัˆะฐั ะžะก ะฒ ะผะธั€ะต.