Как найти и удалить дубликаты музыкальных треков?

Моя проблема в том, что по какой-то причине у меня есть дубликаты некоторых музыкальных треков. Однако они не названы одинаково. Например:

Музыка / Prefuse 73 / One Word Extinguisher / 07. Detchibe.mp3

& amp;

Музыка / Префузия 73 / Огнетушитель одного слова / 07 - Detchibe.mp3

Заметьте, что они являются повторяющимися песнями, но 07 * . * & amp; 07 - обманывает дубликаты поиска файлов, которые ищут по именам файлов.

8
задан 4 April 2012 в 21:13

3 ответа

Можно использовать fdupes как ответ для вопроса», Как найти и удалить дубликаты файлов, «предложенные. Позвольте мне дать пример:

mkdir -p "Music/Prefuse 73/One Word Extinguisher/"
dd if=/dev/urandom of=Music/Prefuse\ 73/One\ Word\ Extinguisher/07.Detchibe.mp3 bs=1023 count=2048
  2048+0 records in
  2048+0 records out
  2095104 bytes (2.1 MB) copied, 0.379806 s, 5.5 MB/s
cp Music/Prefuse\ 73/One\ Word\ Extinguisher/07.Detchibe.mp3 Music/Prefuse\ 73/One\ Word\ Extinguisher/"07 - Detchibe.mp3"
fdupes -rd .
  [1] ./Music/Prefuse 73/One Word Extinguisher/07.Detchibe.mp3
  [2] ./Music/Prefuse 73/One Word Extinguisher/07 - Detchibe.mp3

  Set 1 of 1, preserve files [1 - 2, all]:

Сначала я создал каталог как в Вашем примере. Я сделал файл из случайных данных и скопировал его содержание в другого, регистрирует. Когда я работаю fdupes -rd программное обеспечение находит два точных файла и спрашивает который удалить.

Если у Вас есть много файлов, можно использовать опцию -1. fdupes распечатает все дубликаты на одной строке. Можно обработать их с xargs и другие функции оболочки.

2
ответ дан 4 April 2012 в 21:13

Я нашел несколько простых цепочек команд. Большое спасибо @Oli.

fdupes -rf --quiet ~/Desktop/Dupes2/ | while read i; do mv "$i" ~/Desktop/Dupes/ ; done

Это использовало fdupes, чтобы рекурсивно (-r) найти обманщиков, пропуская первое (-f). Bash читает эту строку построчно через read и передает каждую строку на mv, чтобы переместить все дубликаты в другой каталог. Обратите внимание на использование кавычек в цикле while для обработки пробелов и других хитрых знаков препинания, которые не обрабатывает fdupes (даже с -1 / --sameline).

0
ответ дан 4 April 2012 в 21:13

В ответах на Вручную установить количество прослушиваний треков в Banshee? , оно описывает, как получить доступ к базе данных, которую Banshee использует для сохранения всей информации о треках.

Как только вы подключитесь к базе данных, в таблицу запросов на выполнение вставьте

select tweaked_track, count(*) from 
  (select replace(replace(replace(title, ' ', ''), '-', ''), '.', '') as tweaked_track 
   from coretracks) 
group by tweaked_track 
order by 2, 1 desc;

в строку строки SQL, затем нажмите «выполнить запрос». Это покажет вам все треки с тем же названием, игнорируя пробелы, тире и точки. Если есть другие символы, которые вы хотите игнорировать, добавьте их в запрос в том же порядке. (IE добавьте replace( перед первым существующим «replace» и после последнего «)» в этой строке, добавьте , '[character you want removed]', '').

(Я не знаю, сколько вы знаете о SQL - если вам нужно больше подробностей, оставьте комментарий.)

Это даст вам список заголовков. Вы действительно должны будете сделать удаление самостоятельно.

Возможно, есть лучший способ сделать это, но если есть, я не знаю об этом.

Как только у вас будет большой список файлов, которые нужно удалить (из моего метода или из fdupes, как уже упоминали другие), поместите список файлов, которые вы хотите удалить, в текстовый каталог. Убедитесь, что выполнено одно из следующих действий:

Опция № 1: имена файлов содержат полный путь. Например, файл может содержать:

/home/doneill/music/weird_al/duped_file.mp3
/home/doneill/music/weird_al/another_dupe.mp3
/home/doneill/music/bach/baroque_dupe.mp3

Опция # 2: Имена файлов содержат относительный путь, а файл со списком имен файлов сохраняется в родительской папке. Например, если ваш список файлов был сохранен в /home/doneill/music/, он будет содержать:

weird_al/duped_file.mp3
weird_al/another_dupe.mp3
bach/baroque_dupe.mp3

В любом случае откройте окно терминала и перейдите в папку, содержащую файл со списком [ 119] например.

Введите:

for a in `cat filelist.txt`; do echo $a; done

(Замена filelist.txt на имя файла списком). Это должно выложить список всех файлов, которые вы хотите удалить. Найдите минутку, чтобы дважды проверить список. Если это правильно, введите:

for a in `cat filelist.txt`; do rm $a; done

Это в основном говорит вашему компьютеру: для каждой строки в файле filelist.txt удалите файл с именем в списке.

0
ответ дан 4 April 2012 в 21:13

Другие вопросы по тегам:

Похожие вопросы: