]> Sergey Matveev's repositories - stargrave-blog.git/commit
Удаление файлов с похожими именами
authorSergey Matveev <stargrave@stargrave.org>
Wed, 10 May 2023 13:56:45 +0000 (16:56 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 10 May 2023 13:56:45 +0000 (16:56 +0300)
commitcfd13c8d194c01a2383dbb04cc6b4279bf7499b4
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904
parentf1e94e29c698bd514d4f08fea7775508fe22c8c7
Удаление файлов с похожими именами

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 командой и смотрел
имеются ли отличия значимые. Несколько сотен директорий подчистил таким
образом.