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

8

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

Музыка / Prefuse 73 / Огнетушитель одним словом / 07. Detchibe.mp3

&

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

Обратите внимание, что это дубликаты песен, но 07 * . * & 07 - обманывает дубликаты поиска файлов, которые ищут по именам файлов.

Джон Маккин Пруитт
источник
2
Вы пробовали какие-либо из предложений здесь ?
JPD
Может ли fdupes выделить один из двух дубликатов и удалить его? В противном случае команда fdupes -r генерирует только список, который никуда меня не приведет.
Джон Маккин Пруитт
Отвечает ли это на ваш вопрос? Как я могу найти дубликаты песен?
Карел

Ответы:

2

Вы можете использовать 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другими функциями оболочки.

QBi
источник
Можно ли передать команду out из команды fdupes -r в команду mv?
Джон Маккин Пруитт
fdupes -rd близок к тому, что я хочу, но мне придется нажать около 2000 раз, чтобы все дураки исчезли.
Джон Маккин Пруитт
1
Я добавил параграф к моему ответу выше.
qbi
Проблема здесь в том, что fdupes, похоже, не погружаться в подпапки. Например, в нем ~/Desktop/Dupes2/есть папка под названием «Blood Sugar Sex Magik с Dupes», но простая fdupes -rкоманда не возвращает никакого списка.
Джон Маккин Пруитт
2

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

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

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

Джон Маккин Пруитт
источник
@ Оли, это не помогает. Файлы не перемещаются из одной папки в другую
Джон Маккин Пруитт
@ Оли смотрите мой последний комментарий к "qbi" ниже.
Джон Маккин Пруитт
1

В ответах на Вручную установить количество прослушиваний треков в 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(до первой существующей «заменить» и после последней «)» в этой строке, добавить , '[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удалите файл с именем в списке.

Дэвид Онеилл
источник
Вопрос спрашивает о дубликатах файлов, без упоминания о Банши.
JPD
2
@jpd Это помеченное банши ...
Дэвид Онеилл
Извините, полностью пропустил теги.
JPD
Я не могу добраться до базы данных Banshee, потому что 11.10 не имеет возможности открыться с помощью пользовательской команды, и обходной путь подсказывает, что это не сработало - меня бросили в кроличью нору там на секунду, но я вернулся без решения.
Джон Маккин Пруитт
1
@JohnMcKeanPruitt 1) ​​Запустите браузер базы данных sqlite (команда, sqlitebrowserесли он не был добавлен в ваше меню при установке). 2) Файл -> Открыть. 3) Введите /home/[user]/.config/banshee-1/в адресную строку «Look in» (замените [user] на ваше имя пользователя). 4) Дважды щелкните по banshee.db.
Дэвид Онеилл