English | Русский

Блог о Linux и велосипедах

rdfind — ищем дубликаты файлов

rdfind

rdfind — относительно простая, но очень полезная утилита, которая находит одинаковые файлы и выполняет различные действия над ними.

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

Действия могут быть следующими:

  • -makesymlinks, -makehardlinks — замена дубликата символической или жёсткой ссылкой.
  • -deleteduplicates — удаление дубликатов.
  • -makeresultsfile, -outputname — вывод имён дублирующих файлов в файл.

Несколько примеров использования

  1. Быстрый способ найти повторяющиеся файлы в большом каталоге. Например, выполнение rdfind . в каталоге с шестью тысячами фотографий с полусотней дубликатов, занимает секунды.

  2. Вам пришлось скопировать файлы, среди которых есть символические ссылки, на файловую систему, их не поддерживающую, например FAT:

    $ cp -RL /path/to/dir /path/to/fat
    

    Теперь после перемещения файлов на полноценную файловую систему хочется восстановить ссылки:

    $ cp /path/to/fat /path/to/dir2
    $ rdfind -makesymlinks true /path/to/dir2
    

    Следует заметить, что если файлы нужно скопировать на флешку с FAT, чтобы потом перенести на другую систему, то лучше упаковать файлы в tar, который поддерживает символичные ссылки. При этом ссылки, скорее всего должны быть относительными. Помочь преобразовать абсолютные символичные ссылки в относительные поможет symlinks.

  3. Вы скачали торрент с жуткими именами или иерархией файлов. Хочется переименовать или поменять структуру файлов и при этом не покинуть раздачу.

    $ # создаем копию данных
    $ cp ~/torrents ~/data
    $ # делаем необходимые изменения в ~/data
    $ # заменяем дубликаты в ~/torrents символичными ссылками на файлы в ~/data
    $ rfind -makesymlinks true -makeresultsfile false ~/data ~/torrents
    $ # преобразовываем абсолютные пути символических ссылок в относительные
    $ # (необязательно, но иногда полезно)
    $ symlinks -cr ~/torrents
    

Некоторые торрент-клиенты позволяют переименовывать файлы внутри торрентов. Но данный метод лучше тем, что он не зависит от клиента и не ограничивает пользователя в средствах переименовывания файлов. Более того, некоторые файлы в ~/data можно модифицировать, в таком случае в ~/torrents данные файлы останутся нетронутыми.

Почему так быстро

Высокая скорость работы rdfind обеспечивается алгоритмом, который состоит из следующих основных шагов:

  • определение размера каждого файла;
  • сортировка всех файлов по размеру;
  • файлы с уникальными размером отсеиваются (файлы разных размеров не могут быть одинаковыми);
  • для файлов с одинаковым размером производится проверка двух участков файлов: начала и конца;
  • и только в случае, если данные участки равны, производится расчёт и сравнение хеш-сумм (md5 или sha1).

Ставка делается на то, что последний пункт будет выполняться редко, что справедливо для большинства случаев. Ещё одна техника, которая ускоряет работу rdfind состоит в том, что перед считыванием данных с диска они сортируются по устройству и inode.

Альтернативы

Сам автор rdfind на своём сайте упоминает две альтернативы: duff и fslint, которые по его словам работают в разы медленнее. На вики имеется список из полтора десятка похожих программ.

Комментарии

RSS
  • no_name
    21 Янв 2014, 23:01

    Здравствуйте Вячеслав! Было бы здорово если бы Вы помогли мне найти такую утилиту как "dfind", это такой tcp-port scanner не очень популярный, хотя лучший на мой взгляд инструмент такого рода. К сожалению проект давно не поддерживается и с трудом можно найти даже версию по windows.. есть нечто похожее называется vnc_bypauth, но я ищу именно dfind_scanner для Linux.

    а про rdfind предположил что - remote_desktop_finder )) оказалось нет.

Здесь можно Markdown