Я ищу простой способ (команда или серия команд, возможно, с участием find
), чтобы найти дубликаты файлов в двух каталогах и заменить файлы в одном каталоге с жесткими ссылками файлов в другом каталоге.
Вот ситуация: это файловый сервер, на котором несколько человек хранят аудиофайлы, каждый из которых имеет свою собственную папку. Иногда несколько человек имеют копии одинаковых аудиофайлов. Прямо сейчас это дубликаты. Я хотел бы сделать так, чтобы они были жесткими ссылками, чтобы сэкономить место на жестком диске.
files
hard-link
deduplication
duplicate-files
мистифицировать
источник
источник
Ответы:
На http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl есть скрипт на Perl, который делает именно то, что вы хотите:
источник
rdfind
доступен через менеджеры пакетов для ВСЕХ основных платформ (os x, linux, (cyg) win, solaris) и работает с невероятной скоростью. Так что проверьте ответ ниже.[Errno 31] Too many links
. Эти скрипы, кажется, единственная вещь, которая справляется с этим.rdfind
делает именно то, что вы просите (и в порядке johny, почему списки). Позволяет удалять дубликаты, заменять их мягкими или жесткими ссылками. В сочетании сsymlinks
вами также можно сделать символическую ссылку либо абсолютной, либо относительной. Вы даже можете выбрать алгоритм контрольной суммы (md5 или sha1).Поскольку он скомпилирован, он работает быстрее, чем большинство решений
time
на основе сценариев: для папки с 15 ГБ с 2600 файлами на моем Mac Mini с 2009 года возвращается(используя md5).
Доступно в большинстве обработчиков пакетов (например, MacPorts для Mac OS X).
источник
rdfind
и любил это. У этого есть-dryrun true
опция, которая сообщит вам, что он сделал бы. Замена дубликатов жесткими ссылками так же проста, как и-makehardlinks true
. Это произвело хороший журнал, и это дало мне знать, сколько места было освобождено. Кроме того , в соответствии с авторским эталоном , rdfind быстрее , чем подстилки и FSlint.Используйте
fdupes
инструмент:fdupes -r /path/to/folder
выдает список дубликатов в каталоге (-r делает его рекурсивным). Вывод выглядит так:имя
файла1 имя файла2
имя
файла3
имя файла4 имя файла5
с именами filename1 и filename2 идентичны, а filename3, filename4 и filename5 также идентичны.
источник
rdfind
- какfdupes
, но быстрее и доступно на OS X и Cygwin.fdupes
Кажется, только найти дубликаты, а не заменить их жесткими ссылками, поэтому не ответ на вопрос IMO.jdupes
который основан на этомfdupes
, но он также может заменить дубликаты файлов на symlinks (-l
), hardlinks (-L
) или дать команду btrfs дедуплицировать блоки на уровне файловой системы (-B
если вы используете btrfs).Я использую
hardlink
от http://jak-linux.org/projects/hardlink/источник
hardlink
на Fedora / RHEL / и т. Д.hardlink
теперь является родным двоичным файлом во многих системах пакетов Linux (с ~ 2014 года) и чрезвычайно быстр. Для 1,2M файлов (320 ГБ) это заняло 200 секунд (связывание примерно 10% файлов).hardlink
было создано Джулианом Андресом Клодом, а Fedorahardlink
- Якубом Елинеком (источник: pagure.io/hardlink - Имя пакета Fedora: hardlink)Это одна из функций, предоставляемых "fslint" - http://en.flossmanuals.net/FSlint/Introduction
Нажмите кнопку «Объединить»:
источник
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
(каталог / usr / share / fslint / fslint / по умолчанию не находится в $ PATH)Поскольку ваша основная цель - сэкономить дисковое пространство, существует другое решение: дедупликация (и, возможно, сжатие) на уровне файловой системы. По сравнению с решением с жесткой связью, оно не имеет проблемы непреднамеренного воздействия на другие связанные файлы.
ZFS имеет дедупликацию (на уровне блоков, а не на уровне файлов) с версии пула 23 и сжатие с давних времен. Если вы используете Linux, вы можете попробовать zfs-fuse , или, если вы используете BSD, он изначально поддерживается.
источник
btrfs
использует пакетную или автономную дедупликацию (запускайте ее всякий раз, когда вы считаете это полезным / необходимым) btrfs.wiki.kernel.org/index.php/Deduplicationrsync --inplace
только сохраненные блоки)В настоящее время в современном Linux есть https://github.com/g2p/bedup, который дедуплицирует в файловой системе btrfs, но 1) без лишних затрат на сканирование, 2) после этого файлы могут легко снова расходиться.
источник
cp --reflink
, см. Также ниже)Для поиска дубликатов файлов вы можете использовать duff .
Просто запустите:
Чтобы автоматически создавать жесткие ссылки на эти файлы, вам нужно проанализировать вывод duff с помощью bash или другого языка сценариев.
источник
Описание: Жесткие ссылки на несколько копий одного и того же файла Жесткая ссылка - это инструмент, который обнаруживает несколько копий одного и того же файла и заменяет их жесткими ссылками.
Идея была взята с http://code.google.com/p/hardlinkpy/ , но код был написан с нуля и лицензирован по лицензии MIT. Домашняя страница: http://jak-linux.org/projects/hardlink/
источник
Я использовал многие из инструментов жестких ссылок для Linux, упомянутых здесь. Я тоже застрял с ext4 fs в Ubuntu и использую его cp -l и -s для жесткого / softlinking. Но в последнее время заметил облегченную копию на странице man cp , которая подразумевала бы резервирование избыточного дискового пространства, пока одна сторона не будет изменена:
источник
cp
псевдоним, чтобы всегда включать--reflink=auto
параметр сейчас--reflink
?Мне кажется, что проверка имени файла может ускорить процесс. Если в двух файлах отсутствует одинаковое имя файла, то во многих случаях я не считаю их дубликатами. Похоже, что самый быстрый способ будет сравнить, по порядку:
Есть ли какие-либо методы сделать это? Посмотрите
duff
,fdupes
,rmlint
,fslint
и т.д.На сайте commandlinefu.com проголосовали следующие методы : Найти дубликаты файлов (сначала по размеру, а затем по хешу MD5)
Можно ли добавить сравнение имени файла в качестве первого шага, а размер - в качестве второго шага?
источник
duff
,fdupes
иrmlint
, и настоятельно рекомендую читателям взглянуть на третий из них . У него отличный набор опций (и документация). Благодаря этому я смог избежать большого количества постобработки, которую мне нужно было использовать с другими инструментами.install.sh
файлов можно найти в активной системе? Я не могу сосчитать, сколько раз я сохранял файл и имел конфликт имен, с некоторым переименованием на лету, чтобы сохранить его. Обратная сторона: не знаю, сколько раз я загружал что-то из разных источников, в разные дни, только чтобы обнаружить, что это один и тот же файл с разными именами. (Это также убивает надежность отметки времени.) 1: Размер, 2: Дайджест, 3: Содержимое байта.Так как я не фанат Perl, вот версия bash:
Он находит все файлы с одинаковой контрольной суммой (большие, маленькие или уже жесткие) и жестко связывает их вместе.
Это может быть значительно оптимизировано для повторных запусков с дополнительными флагами поиска (например, размером) и файловым кешем (поэтому вам не нужно каждый раз повторять контрольные суммы). Если кто-то заинтересован в более умной и длинной версии, я могу опубликовать ее.
ПРИМЕЧАНИЕ. Как упоминалось ранее, жесткие ссылки работают до тех пор, пока файлы никогда не нуждаются в модификации или перемещаются по файловым системам.
источник
rdfind
, которые работают на родных скоростях и просто требуютbrew install rdfind
илиapt-get install rdfind
должны быть установлены.Я сделал Perl-скрипт, который делает нечто похожее на то, о чем вы говорите:
http://pastebin.com/U7mFHZU7
По сути, он просто пересекает каталог, вычисляя сумму SHA1 файлов в нем, хешируя его и связывая совпадения. Это пригодится во многих, многих случаях.
источник
Если вы хотите заменить дубликаты на Hard Links на Mac или в любой системе на основе UNIX, вы можете попробовать SmartDupe http://sourceforge.net/projects/smartdupe/, разрабатываю его
источник
Приложение FSLint ( http://www.pixelbeat.org/fslint/ ) может найти все одинаковые файлы в любой папке (по содержанию) и создать жесткие ссылки. Попробуйте!
Хорхе Сампайо
источник
jdupes
упоминается в комментарии, но заслуживает отдельного ответа, так как он, вероятно, доступен в большинстве дистрибутивов и работает довольно быстро (он только за одну минуту освободил 2,7 ГБ из 98% заполненных 158 ГБ разделов (накопителей SSD)):источник
Если вы будете делать жесткие ссылки, обратите внимание на права на этот файл. Обратите внимание, что владелец, группа, режим, расширенные атрибуты, время и ACL (если вы используете это) хранятся в INODE. Отличаются только имена файлов, поскольку они хранятся в структуре каталогов, а другие указывают на свойства INODE. По этой причине все имена файлов, связанные с одним и тем же узлом, имеют одинаковые права доступа. Вы должны предотвратить изменение этого файла, потому что любой пользователь может повредить файл другим. Это просто. Достаточно, любой пользователь ставит другой файл с тем же именем. Номер инода затем сохраняется, а исходное содержимое файла уничтожается (заменяется) для всех жестко связанных имен.
Лучший способ - дедупликация на уровне файловой системы. Вы можете использовать BTRFS (очень популярный в последнее время), OCFS или подобное. Посмотрите на страницу: https://en.wikipedia.org/wiki/Comparison_of_file_systems , особенно в таблице Характеристики и дедупликация данных столбца. Вы можете нажать на нее и отсортировать :)
Специально посмотрите на файловую систему ZFS. Это доступно как FUSE, но таким образом это очень медленно. Если вам нужна нативная поддержка, посмотрите на страницу http://zfsonlinux.org/ . Затем вы должны исправить ядро, а затем установить zfs tools для управления. Я не понимаю, почему Linux не поддерживает в качестве драйверов, это путь для многих других операционных систем / ядер.
Файловые системы поддерживают дедупликацию двумя способами: дедупликацию файлов или блоков. ZFS поддерживает блокировку. Это означает, что одно и то же содержимое, которое повторяется в одном и том же файле, может быть дедуплицировано. Другой способ - это время, когда данные дедуплицируются, это может быть онлайн (zfs) или автономно (btrfs).
Обратите внимание, дедупликация потребляет оперативную память. Вот почему запись файлов на том ZFS, смонтированный с помощью FUSE, приводит к резкому снижению производительности. Это описано в документации. Но вы можете онлайн включить / выключить дедупликацию на томе. Если вы видите, что какие-либо данные должны быть дедуплицированы, вы просто включаете дедупликацию, переписываете какой-либо файл в любой временный и, наконец, заменяете. после этого вы можете отключить дедупликацию и восстановить полную производительность. Конечно, вы можете добавить в хранилище любые кеш-диски. Это может быть очень быстрый поворот дисков или SSD дисков. Конечно, это могут быть очень маленькие диски. В реальной работе это замена оперативки :)
В Linux вы должны позаботиться о ZFS, потому что не все работают должным образом, особенно когда вы управляете файловой системой, делаете снимок и т. Д., Но если вы конфигурируете и не меняете его, все работает правильно. Другим способом, вы должны изменить linux на opensolaris, он изначально поддерживает ZFS :) Что очень хорошо в ZFS, так это то, что он работает как файловая система, так и менеджер уровней, похожий на LVM. Вам не нужно это, когда вы используете ZFS. Смотрите документацию, если вы хотите узнать больше.
Обратите внимание на разницу между ZFS и BTRFS. ZFS старше и более зрелая, к сожалению, только под Solaris и OpenSolaris (к сожалению, задушена оракулом). BTRFS моложе, но в последнее время очень хорошо поддерживается. Я рекомендую свежее ядро. ZFS имеет дедупликацию онлайн, что приводит к замедлению записи, потому что все рассчитывается онлайн. BTRFS поддерживает автономную дедупликацию. Тогда это экономит производительность, но когда хосту нечего делать, вы периодически запускаете инструмент для дедупликации. И BTRFS изначально создан под Linux. Может быть, это лучше ПС для вас :)
источник
btrfs
. Отличное обсуждение вариантов (включаяcp --reflink
опцию) здесь: btrfs.wiki.kernel.org/index.php/DeduplicationЖесткие ссылки могут быть не лучшей идеей; если один пользователь изменяет файл, это влияет на оба. Однако удаление жесткой ссылки не удаляет оба файла. Кроме того, я не совсем уверен, занимают ли жесткие ссылки такое же количество места (на жестком диске, а не в ОС), как несколько копий одного и того же файла; согласно Windows (с расширением Link Shell), они делают. Конечно, это Windows, а не Unix ...
Мое решение состояло бы в том, чтобы создать «общий» файл в скрытой папке и заменить фактические дубликаты символическими ссылками ... тогда символические ссылки будут внедрены с метаданными или альтернативными потоками файлов, которые записывают только два «файла» отличаются друг от друга, например, если один человек хочет изменить имя файла или добавить обложку альбома или что-то подобное; это может быть даже полезно вне приложений баз данных, таких как установка нескольких версий одной и той же игры или программного обеспечения и их независимое тестирование даже с небольшими различиями.
источник
Самый простой способ - использовать специальную программу dupeGuru
как говорится в документации
источник