LINUX.ORG.RU

Заменить дубликаты файлов хардлинками


1

0

Ищу инструмент для сабжа.

Нашёл прогу fdupes, он быстро и хорошо ищет дубликаты, но не умеет делать хардлинки, только удалять. Патч для хардлинков кто-то предложил уже давно (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=284274), но разработчик не чешется. Я бы сам наложил да собрал, но там патч на дебиановский пакет, добавляющий патч, мне эту матрёшку лень расковыривать.

Ещё есть скрипт на перле: http://www.perlmonks.org/?node_id=703460 но он требует перловый модуль, который я не знаю как правильно ставить. Ни в дебиановской ни в федоровской репах он не обнаружился, а из cpan'а ставить не хочу (да и не умею), помойку из системы делать не годится.

Может завалялось у кого готовое решение?

★★★★★

Ответ на: комментарий от annulen

Для симлинков такой проги тоже не существует.

legolegs ★★★★★
() автор топика

Слава мне. Проблема решилась 20ю строчками на баше. Итак:

сначала используем fdupes - он очень клёвый и не делает лишней работы, а потому быстро отрабатывает.

fdupes -nr <директории_где_надо_найти_дубли> > файлик.txt

Опция n заставит его игнорировать пустые файлы.

Далее файлик можно прогнать через греп и вообще подредактировать, главное не убирать пустые строки. Например, я оставил только рпмки:

egrep '\.rpm|^$' файлик.txt > файлик2.txt

Теперь есть список одинаковых файлов, можно заменять их на хардлинки. Для этого создаём простенький скриптик replacebylinks.sh:

#!/bin/sh

if [ -n "$1" ] ; then
        ACTION="$@"
else
        echo "Usage: $0 <command>"
        ACTION="echo <command>"
fi

while read line ; do
        if [ -n "$line" ]; then
                original="$line"
                while read line ; do
                        if [ -n "$line" ]; then
                                $ACTION "$original" "$line"
                        else
                                break
                        fi
                done
        fi
done
вызовите его без параметров и поймёте как он работает.

запускаем его:

chmod +x replacebylinks.sh
./replacebylinks.sh ln -f < файлик2.txt
И всё - дубли заменены хардлинками. Вместо ln -f можно использовать ln -sf - тогда будут симлинки, но нет способа указать какой файл главный.

Помните, что хардлинки работают только в пределах одной ФС.

legolegs ★★★★★
() автор топика

Я только что переговорил с сопровождающим, он откладывал долго потому, что ждал ответ от автора и нового релиза, но их всё нет. Есть возможность, что в скором времени появится в unstable.

З.Ы. Всегда плохо, когда авторы софта тянут с релизами месяцами...

JackYF ★★★★
()
Ответ на: комментарий от anonymous

Если ты говоришь о http://www.koders.com/perl/fidB03C621C7852D50437796B7062B89CD181D13AFF.aspx?s... - то, насколько я понял, оно считает md5 для всех файлов вообще. Да ещё средствами тормозного перла. fdupes гораздо умнее.

Ну и зависимости у моего варианта легче.

legolegs ★★★★★
() автор топика
Ответ на: комментарий от iZEN

Вот ты и предложи. Я не знаю где они, кто они и почему это им так сильно надо. Мне это надо чтоб репозитории сжимать.

legolegs ★★★★★
() автор топика

Попробуйте для разнообразия мой скрипт, работает довольно быстро. Более свежая версия либо только отображает дубликаты, либо удаляет их, либо заменяет хардлинками.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Для работы этого скрипта необходим настроенный mysql-сервер

пришлось при загрузке данных добавить костыль в виде iconv'а

Мне теперь страшно спать при выключенном свете.

Серьёзно, я бы посравнивал, но мускул ставить (и удалять потом) мне лень. И если вам интересно почему fdupes быстрее - я думаю (в исходники не глядел), что fdupes не считает md5 полностью, если находит различающиеся байты.

legolegs ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Программы из PBI ставятся каждая в отдельный каталог. Естественно, каждая программа тащит свои библиотеки, которые могут быть и в другом каталоге. Вот тут-то и пригодится дедупликация на уровне хардлинков, которая позволит избавиться от дублирующих библиотек, даже у тех, у которых CRC не совпадает, но версия та же.

iZEN ★★★★★
()
Ответ на: комментарий от legolegs

fdupes не считает md5 полностью, если находит различающиеся байты.

Как вы себе это представляете? Если бы он открывал одновременно набор файлов с одинаковым размером и сравнивал их побайтно, думаю, скорость его работы была бы как у imgSeek'а.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от iZEN

>Программы из PBI ставятся каждая в отдельный каталог.

Что-то мне это напоминает...

Вот тут-то и пригодится дедупликация на уровне хардлинков, которая позволит избавиться от дублирующих библиотек

fdupes -nr /где_у_вас_там_program_files | egrep -v '\.so$|^$' | ./replacebylinks.sh ln -f

даже у тех, у которых CRC не совпадает, но версия та же.

Плохая идея. CRC не совпадает не спроста - разные опции компилятора иногда могут давать несовместимы бинарно функции (хотябы даже stdcall и cdecl).

legolegs ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Ну ладно, вы fdupes осилили, а мне было проще написать скриптик ;)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Если бы он открывал одновременно набор файлов с одинаковым размером и сравнивал их побайтно, думаю, скорость его работы была бы как у imgSeek'а.

Ему всё равно приходится сравнивать файлы побайтно, он не полагается на md5 слепо. Но открывать одновременно не обязательно, можно читать частями по мегабайту например. Или сначала проверить первый мег, если не совпало - пропустить, запомнив недосчитанную md5, иначе дочитывать до конца как обычно.

legolegs ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.