遍历文件夹中的所有文件,检查文件名的第一部分是否与 diff 文件夹中的任何文件匹配 - 如果不匹配则移动
loop through all files in folder, check if first part of filename matches any files in a diff folder-move if not
我有 75,000 个卡拉 OK 系统文件。每首歌都有音乐 (.mp3
) 和歌词 (.cdg
)。所以,每首歌都有两个文件。
Artist - SongName [Karaoke Brand1].mp3
Artist - SongName [Karaoke Brand1].cdg
问题是有些歌曲有很多版本(5-10)。 Brand1
是最好的,所以我只是使用标准 windows 搜索来过滤该品牌的所有文件并手动剪切和粘贴它们,这让我在新的旧版本中找到了 25,000 个文件。
但是原文件夹里有很多歌曲Brand1
没有版本。在这种情况下,我更喜欢 Brand2
和 Brand3
,但并非每首歌都是由两者完成的。不管每首歌至少是一个或另一个完成的。
我想遍历所有剩余的 MP3 文件(不需要查看所有文件,因为 .cdg
名称相同但扩展名不同):
"D:/Karaoke/All"
然后在方括号 [通配符?] 之前取文件名,看看我是否已经有它的一个版本:
"D:/Karaoke/Curated"
如果没有什么也不做并转到下一个文件。
如果没有移动 Brand2
如果它存在(完整文件名 .mp3
AND .cdg
)到 D:/Karaoke/Curated
.
如果 Brand2
不存在,请查看 Brand3 是否存在并使用那个
所有品牌的文件命名都相同,只是括号 [Brand]
中的文本会有所不同。
编辑
到目前为止我想出了什么
@echo off
setlocal enabledelayedexpansion
for %%i in (*.mp3) do (
for /f "tokens=1 delims=[" %%a in ("%%i") DO (
REM get "checkable name first"
REM echo %%a
set checkName=%%a
REM echo !checkName!
)
echo !checkName!
)
exit
根据您的要求,这里有一个可能的解决方案:
@echo off
cd /d "D:\Karaoke\All"
for %%A IN ("*.mp3") do (
for /f "delims=[]" %%B IN ("%%~nA") do (
dir /A "D:\Karaoke\Curated\%%B*" >nul 2>&1
if errorlevel 1 (
if exist "%%B[Karaoke Brand2].mp3" (
move "%%B[Karaoke Brand2].*" "D:\Karaoke\Curated\"
) else (
if exist "%%B[Karaoke Brand3].mp3" (
move "%%B[Karaoke Brand3].*" "D:\Karaoke\Curated\"
)
)
)
)
)
我有 75,000 个卡拉 OK 系统文件。每首歌都有音乐 (.mp3
) 和歌词 (.cdg
)。所以,每首歌都有两个文件。
Artist - SongName [Karaoke Brand1].mp3
Artist - SongName [Karaoke Brand1].cdg
问题是有些歌曲有很多版本(5-10)。 Brand1
是最好的,所以我只是使用标准 windows 搜索来过滤该品牌的所有文件并手动剪切和粘贴它们,这让我在新的旧版本中找到了 25,000 个文件。
但是原文件夹里有很多歌曲Brand1
没有版本。在这种情况下,我更喜欢 Brand2
和 Brand3
,但并非每首歌都是由两者完成的。不管每首歌至少是一个或另一个完成的。
我想遍历所有剩余的 MP3 文件(不需要查看所有文件,因为 .cdg
名称相同但扩展名不同):
"D:/Karaoke/All"
然后在方括号 [通配符?] 之前取文件名,看看我是否已经有它的一个版本:
"D:/Karaoke/Curated"
如果没有什么也不做并转到下一个文件。
如果没有移动 Brand2
如果它存在(完整文件名 .mp3
AND .cdg
)到 D:/Karaoke/Curated
.
如果 Brand2
不存在,请查看 Brand3 是否存在并使用那个
所有品牌的文件命名都相同,只是括号 [Brand]
中的文本会有所不同。
编辑 到目前为止我想出了什么
@echo off
setlocal enabledelayedexpansion
for %%i in (*.mp3) do (
for /f "tokens=1 delims=[" %%a in ("%%i") DO (
REM get "checkable name first"
REM echo %%a
set checkName=%%a
REM echo !checkName!
)
echo !checkName!
)
exit
根据您的要求,这里有一个可能的解决方案:
@echo off
cd /d "D:\Karaoke\All"
for %%A IN ("*.mp3") do (
for /f "delims=[]" %%B IN ("%%~nA") do (
dir /A "D:\Karaoke\Curated\%%B*" >nul 2>&1
if errorlevel 1 (
if exist "%%B[Karaoke Brand2].mp3" (
move "%%B[Karaoke Brand2].*" "D:\Karaoke\Curated\"
) else (
if exist "%%B[Karaoke Brand3].mp3" (
move "%%B[Karaoke Brand3].*" "D:\Karaoke\Curated\"
)
)
)
)
)