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

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

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

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

  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