Dada uma lista de nomes de arquivos, como você pode iterar através de subdiretórios e retornar uma lista de onde esses arquivos existem?

1

Eu descobri uma playlist antiga que eu realmente gostaria de ouvir. Infelizmente, é um que foi criado para um dispositivo USB que tinha músicas copiadas da minha coleção para uma pasta simples.

O que eu quero fazer agora é recriar essa lista de reprodução, combinando esses nomes de arquivos com os caminhos da minha coleção de músicas principal.

Como exemplo, suponha que minha lista de reprodução existente seja assim:

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

Depois do processamento, posso acabar com algo parecido com isto:

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

Os nomes dos arquivos são garantidos como iguais, os caminhos sempre serão diferentes.

Existem cerca de 300 faixas nesta lista de reprodução, pelo que seria trabalhoso procurar manualmente por cada uma delas. Eu dei uma olhada no XCOPY, depois de ler sobre EXCLUDE, eu estava esperando que houvesse um INCLUDE, mas, infelizmente, isso não seria uma opção. Eu também li sobre o uso de um loop FOR dentro de um arquivo de lote, mas faz um longo tempo desde que eu escrevi arquivos em lote e não sei bem por onde começar.

Muito obrigado pela sua ajuda

    
por Iain Fraser 14.03.2014 / 01:27

2 respostas

3

Suponho que você pode obter sua antiga lista de reprodução em um arquivo de texto - chame-a de "oldList.txt".

Primeiro, você precisa obter uma lista modificada em um arquivo de texto que contenha apenas os nomes dos arquivos, sem nenhuma informação de caminho. Em seguida, você pode canalizar o resultado de um comando DIR recursivo para FINDSTR e usar a lista modificada como sequências de pesquisa literais, sem distinção entre maiúsculas e minúsculas, que devem corresponder ao final de um caminho completo do comando DIR.

Aqui está um script em lote simples que deve funcionar:

@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
    
por 14.03.2014 / 02:37
0

Ok, então aqui está o que eu fiz. Tudo foi feito com expressões regulares. Tenho 100% de certeza de que há uma maneira mais fácil de fazer isso do que isso, mas funcionou e eu tive que fazer isso apenas uma vez com um resultado tão bom.

Eu usei um aplicativo chamado Regex Buddy, mas você poderia usar qualquer editor de texto meio decente com suporte a regex.

Por favor, note que todos os seguintes Regexs são definidos de forma a ^ e $ correspondem a quebras de linha e o regex é processado linha por linha.

Eu peguei a lista de arquivos original:

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

e aplicou o seguinte regex a ele:

^.*\
replace with empty string

O que resulta em:

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

Eu então apliquei

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

Quais resultados em

$\s
replace with
|

Eu então apliquei

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

Quais resultados em

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

Eu então apliquei

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

Quais resultados em

dir /s/b > filelist.txt

Agora temos um regex super longo que incorpora todos os arquivos que estou procurando.

Agora, abra o prompt de comando, navegue até o diretor musical do tipo:

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

Quando o comando terminar, abra filelist.txt e aplique o regex que construímos nele como uma pesquisa.

Ei, pronto! Todos os arquivos da playlist foram encontrados. Havia, é claro, alguns falsos positivos onde eu tinha nomes de arquivo duplicados, mas é bom o suficiente para me fazer balançar e não levo tanto tempo para alcançar (apesar de como parece)

    
por 14.03.2014 / 02:43