1

Я обнаружил старый плейлист, который мне очень хотелось бы послушать. К сожалению, он был создан для USB-накопителя, на котором музыка скопирована из моей коллекции в плоскую папку.

То, что я хочу сейчас сделать, это воссоздать этот плейлист, сопоставив эти имена с путями в моей основной музыкальной коллекции.

В качестве примера предположим, что мой существующий плейлист выглядит так:

F:\music\Artist 1 - Song 1.mp3
F:\music\Artist 2 - Song 2.mp3
F:\music\Artist 3 - Song 3.mp3

И после обработки у меня может получиться что-то вроде этого:

W:\Music Collection\Compilations\Compilations Forever 6\Artist 1 - Song 1.mp3
W:\Music Collection\Artist 2\This is the Album\Artist 2 - Song 2.mp3
W:\Music Collection\Unsorted New Stuff\Artist 3 - Song 3.mp3

Имена файлов гарантированно будут одинаковыми, пути всегда будут разными.

В этом плейлисте около 300 треков, поэтому было бы трудно вручную искать каждый из них в отдельности. Я взглянул на XCOPY, прочитав об ИСКЛЮЧЕНИИ, я надеялся, что это будет ВКЛЮЧЕНО, но, увы, это не вариант. Я также читал об использовании цикла FOR внутри командного файла, но прошло много времени с тех пор, как я писал командные файлы, и я не совсем уверен, с чего начать.

Большое спасибо за вашу помощь

2 ответа2

3

Я предполагаю, что вы можете получить свой старый список воспроизведения в текстовом файле - назовите его «oldList.txt».

Сначала вам нужно получить измененный список в текстовом файле, который содержит только имена файлов, без какой-либо информации о пути. Затем вы можете направить результат рекурсивной команды DIR в FINDSTR и использовать измененный список в качестве литеральных строк поиска без учета регистра, которые должны совпадать с концом полного пути из команды DIR.

Вот простой пакетный скрипт, который должен сделать свое дело:

@echo off
(for /f "eol=: delims=" %%F in (oldList.txt) do echo \%%~nxF)>searchList.txt
dir /b /s /a-d "W:\Music Collection\*"|findstr /lieg:searchList.txt >newList.txt
del searchList.txt
0

Итак, вот что я сделал. Все было сделано с помощью регулярных выражений. Я на 100% уверен, что есть более простой способ сделать это, чем этот, но это сработало, и мне нужно было сделать это только один раз, чтобы получить хороший результат.

Я использовал приложение под названием Regex Buddy, но вы могли бы использовать любой полуприличный текстовый редактор с поддержкой regex.

Обратите внимание, что все следующие регулярные выражения установлены так, что ^ и $ match при переносе строки и регулярное выражение обрабатывается построчно.

Я взял оригинальный список файлов:

F:\music\(Artist 1) - Song 1.mp3
F:\music\[Artist 2] - Song 2.mp3
F:\music\Artist 3 - Song 3 {remix}.mp3

и применил к нему следующее регулярное выражение:

^.*\\
replace with empty string

Что приводит к:

(Artist 1) - Song 1.mp3
[Artist 2] - Song 2.mp3
Artist 3 - Song 3 {remix}.mp3

Я тогда применил

[\.\[\]\(\)\{\}]
replace with
\$0

Что приводит к

\(Artist 1\) - Song 1\.mp3
\[Artist 2\] - Song 2\.mp3
Artist 3 - Song 3 \{remix\}\.mp3

Я тогда применил

$\s
replace with
|

Что приводит к

\(Artist 1\) - Song 1\.mp3|\[Artist 2\] - Song 2\.mp3|Artist 3 - Song 3 \{remix\}\.mp3

Я тогда применил

.*
replace with
^.*\\($0)$

Что приводит к

^.*\\(\(Artist 1\) - Song 1\.mp3|\[Artist 2\] - Song 2\.mp3|Artist 3 - Song 3 \{remix\}\.mp3)$

Теперь у нас есть супер длинное регулярное выражение, которое включает в себя все файлы, которые я ищу.

Теперь откройте командную строку и перейдите к музыкальному директору любого типа:

dir /s/b > filelist.txt

Когда команда завершится, откройте filelist.txt и примените к нему регулярное выражение в качестве поиска.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .