Как найти и удалить дубликаты музыкальных треков?
Моя проблема в том, что у меня почему-то есть дубликаты некоторых музыкальных треков. Однако они не названы одинаково. Например:
Музыка /Prefuse 73/ Огнетушитель одним словом / 07. Detchibe.mp3
&
Музыка /Prefuse 73/ Огнетушитель одним словом /07 - Detchibe.mp3
Обратите внимание, что они являются дублирующими песнями, но 07 *.* & 07 - обманывает дубликаты поиска файлов, которые ищут по именам файлов.
3 ответа
Я нашел несколько простых цепочек команд. Большое спасибо @Oli.
fdupes -rf --quiet ~/Desktop/Dupes2/ | while read i; do mv "$i" ~/Desktop/Dupes/ ; done
Это б fdupes
рекурсивно (-r
) найти дупов, пропустив первый (-f
). Баш читает эту строку построчно read
драм передает каждую строку mv
переместить все дубликаты в другой каталог. Обратите внимание на использование цитат в while
цикл для обработки пробелов и других хитрых знаков препинания, которые fdupes
не справится (даже с -1
/--sameline
).
Ты можешь использовать 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
и другие функции оболочки.
В ответах на Вручную установить количество прослушиваний треков в Банши? он описывает, как получить доступ к базе данных, которую использует банши для сохранения всей информации о треке.
Когда вы подключитесь к базе данных, в таблицу запросов на выполнение вставьте
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(
перед первым существующим "заменить" и после последнего ")" в этой строке, добавить , '[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
В любом случае откройте окно терминала и перейдите в папку, содержащую файл со списком. cd /home/doneill/music/
например.
Введите:
for a in `cat filelist.txt`; do echo $a; done
(Замена filelist.txt на имя файла со списком). Это должно выложить список всех файлов, которые вы хотите удалить. Найдите минутку, чтобы дважды проверить список. Если это правильно, введите:
for a in `cat filelist.txt`; do rm $a; done
Это в основном говорит ваш компьютер: для каждой строки в файле filelist.txt
, удалите файл с указанным именем.