[О блоге] [наверх] [пред] [2023-05-10 16:56:45+03:00] [cfd13c8d194c01a2383dbb04cc6b4279bf7499b4]
Темы: [perl][tip]

Удаление файлов с похожими именами

https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D1%88%D1%82%D0%B5%D0%B9%D0%BD%D0%B0
Среди скачанных lossless альбомов на замену MP3
(96cac6d683e023383670bf6cbccf91c7eff90063) есть много альбомов с
не совпадающими именами: опечатки, наличие восклицательных знаков,
многоточия, разные регистры букв, пропущенные года в имени, и т.д..

Надо бы как-то автоматизировать поиск похожих имён. Когда-то я просто
слышал про расстояние Левенштейна, но никогда на практике не использовал
ничего связанного с подобным. Судя по всему, как минимум, он то что мне
нужно. Для Perl есть лёгкая библиотека по его расчёту. Беру
отсортированный список директорий и вывожу пары между которыми
расстояние меньше заданного:

    use Text::Levenshtein qw(distance);
    my @lines = map { chop; $_ } <STDIN>;
    for (my $i = 0 ; $i < ($#lines - 1); $i++) {
        my ($l1, $l2) = ($lines[$i], $lines[$i+1]);
        print "$l1\n$l2\n\n" if (distance($l1, $l2) <= $ARGV[0]);
    }

Расстояние подбирал эмпирически: указывал одно, сохранял результат в
файл, затем другое, затем сравнивал файлы comm -3 командой и смотрел
имеются ли отличия значимые. Несколько сотен директорий подчистил таким
образом.

    [оставить комментарий]