Diberikan daftar nama file, bagaimana Anda bisa beralih melalui subdirektori dan mengembalikan daftar di mana file-file itu ada?

1

Saya telah menemukan daftar putar lama yang ingin saya dengarkan. Sayangnya, itu yang dibuat untuk stik USB yang musiknya disalin dari koleksi saya ke dalam folder datar.

Apa yang ingin saya lakukan sekarang adalah membuat ulang daftar putar itu dengan mencocokkan nama-nama file itu dengan jalur dalam koleksi musik utama saya.

Sebagai contoh, anggap daftar putar saya yang ada terlihat seperti ini:

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

Dan setelah diproses, saya mungkin berakhir dengan sesuatu seperti ini:

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

Nama file dijamin sama, jalurnya akan selalu berbeda.

Ada sekitar 300 lagu di daftar putar ini, jadi akan sulit untuk mencari secara manual masing-masing secara individual. Saya telah melihat XCOPY, setelah membaca tentang EXCLUDE, saya berharap akan ada TERMASUK, tetapi sayangnya itu tidak akan menjadi pilihan. Saya juga membaca tentang menggunakan loop FOR di dalam file batch, tapi sudah lama sejak saya menulis file batch dan saya tidak yakin harus mulai dari mana.

Terima kasih banyak atas bantuannya

Iain Fraser
sumber

Jawaban:

3

Saya berasumsi Anda bisa mendapatkan daftar putar lama Anda dalam file teks - sebut saja "oldList.txt".

Pertama, Anda perlu mendapatkan daftar yang dimodifikasi dalam file teks yang hanya berisi nama file, tanpa informasi jalur. Kemudian Anda dapat mem-pipe hasil dari perintah DIR rekursif ke FINDSTR, dan menggunakan daftar yang dimodifikasi sebagai string pencarian literal yang case-sensitive yang harus cocok dengan akhir dari path lengkap dari perintah DIR.

Berikut ini adalah skrip kumpulan sederhana yang harus melakukan trik:

@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
dbenham
sumber
1
Sangat indah dan sangat cepat. Menariknya, solusi Anda mengalami masalah yang sama dengan yang dilakukan regex saya pada awalnya, yaitu bahwa ia akan menemukan file yang berakhir dengan pertandingan - dan saya memiliki file bernama "03.mp3", di mana ada nomor "Artist - Live in 2003 .mp3 "akan cocok untuk itu. Namun, seperti yang Anda sebutkan, ini terlihat pada path lengkap, jadi yang perlu saya lakukan adalah menambahkan garis miring di awal setiap baris oldList.txt. Pasangan solusi yang brilian.
Iain Fraser
@IainFraser - Ide bagus untuk menambahkan backslash sebelum setiap nama file dalam daftar pencarian. Saya sudah mengedit jawabannya.
dbenham
0

Oke, jadi inilah yang saya lakukan. Itu semua dilakukan dengan ekspresi reguler. Saya 100% yakin ada cara yang lebih mudah untuk melakukannya daripada ini, tetapi itu berhasil dan saya hanya perlu melakukannya sekali sehingga hasilnya bagus.

Saya menggunakan aplikasi yang disebut Regex Buddy, tetapi Anda dapat menggunakan editor teks setengah layak dengan dukungan regex.

Harap dicatat, semua Regex berikut ini diatur begitu ^ dan $ cocok pada jeda baris dan regex diproses baris demi baris.

Saya mengambil daftar file asli:

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

dan menerapkan regex berikut untuk itu:

^.*\\
replace with empty string

Yang mengakibatkan:

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

Saya kemudian melamar

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

Yang mengakibatkan

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

Saya kemudian melamar

$\s
replace with
|

Yang mengakibatkan

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

Saya kemudian melamar

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

Yang mengakibatkan

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

Kami sekarang memiliki regex yang sangat panjang yang menggabungkan semua file yang saya cari.

Sekarang buka command prompt, browse ke music director jenis apa pun yang berikut:

dir /s/b > filelist.txt

Setelah perintah selesai, buka filelist.txtdan terapkan regex yang kami buat sebagai pencarian.

Hai, astaga! Semua file dalam daftar putar ditemukan. Tentu saja ada beberapa kesalahan positif di mana saya memiliki nama file duplikat, tapi cukup bagus untuk membuat saya goyang dan tidak mengambil banyak waktu untuk mencapainya (terlepas dari tampilannya)

Iain Fraser
sumber