Документ создан: 11.02.2010

Поиск и удаление дубликатов файлов

Лирическое отступление. Бывает такое, что в дискографии исполнителя встречаются одни и те же композиции, но записанные в разное время и в разных аранжировках. При прослушивании на плеере без использования псевдослучайного выбора всех композиций исполнителя, схожие композиции идут одна за другой и приходится слушать одну вещь несколько раз. Мне лично такое положение дел не нравится и поэтому я решил поискать пути решения, исходя из моего личного (!) желания слушать композицию в оригинале, а не в перепевках.

Внимание! Эта заметка не есть решение проблем, а лишь информация, как можно использовать командную строку. Более того, этот набор команд не стоит оформалять в виде скрипта, т.к. он расчитан на выполнение конкретного действия. Ещё поправка, все файлы одного исполнителя расположены и поименованы однообразно.

Путь решения таков:

  1. Копируем всю дискографию в отдельный каталог, дабы не удалить то, что может потом понадобиться. Например, в "~/tmp".
  2. Переходим в каталог с первым альбомом, расположенным в отдельном временном каталоге.
  3. Выполняем такую хитрую конструкцию:
    for i in *; do if [ "x${i}" == "x*" ]; then break; fi;\
    cret=$(echo ${i} | sed -e "s/[^\_]*\_\([^\.]*\)\..*/\\1/");\
    find ../ -iname "*${cret}*" -not -path "*$(basename "$PWD")*" -exec rm {} \; ; done
  4. При необходимости, переходим в каталог со следующим альбомом и выполняем пункт 3.

Если появится необходимость и желание, в дальнейшем модифицирую и сделаю проход по каталогам с альбомами в цикле.

Теперь давайте попробуем понять, что же я "наваял". Для начала приведём эту строку в вид, который был бы в скрипте:

1 for i in *;
2 do
3   if [ "x${i}" == "x*" ]; then
4      break;
5   fi;
6   cret=$(echo ${i} | sed -e "s/[^\_]*\_\([^\.]*\)\..*/\\1/");
7   find ../ -iname "*${cret}*" -not -path "*$(basename "$PWD")*" -exec rm {} \; ;
8 done
  • В цикле перебираем все файлы, расположенные в текущем каталоге, и применяем к каждому из них действия, описанные ниже.
  • Строки 3-5 содержат обрабоку, которая исключает проход по содержимому каталога, при отсутствии в нём файлов. Иначе критерий поиска выглядел бы как ""***"", а под него подпадают все файлы.
  • Строка 6 выделяет имя композиции из имении файла. В моём случае имена файлов выглядели так:
    04_Tunnel_O_Love.mp3
    06_Twisting_By_The_Pool.mp3
    16_Local_Hero.mp3

    после они превращались в такой вид:

    Tunnel_O_Love
    Twisting_By_The_Pool
    Local_Hero
  • Строка 7 содержит самую главную команду в этом наборе - find. От каталога выше уровнем (../) начинаем поиск всех файлов, соответствующих критерию без учёта регистра (-iname "*${cret}*") и расположенных не в текущем каталоге (-not -path "*$(basename "$PWD")*"), после нахождения совпадения, удаляем эти файлы (-exec rm {} \;).
 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate