【问题标题】:batch file - detect duplicate file names before char?批处理文件 - 在字符之前检测重复的文件名?
【发布时间】:2020-04-15 11:31:40
【问题描述】:

我在文件夹“D:\Karaoke\”中有 70000 首卡拉 OK 歌曲。每个有两个文件

artist - songname [GT karaoke].mp3
artist - songname [GT karaoke].cdg
artist - songname [SJ karaoke].mp3
artist - songname [SJ karaoke].cdg
artist - songname [AF karaoke].mp3
artist - songname [AF karaoke].cdg

假设以上所有文件代表同一首歌曲。我想保留 AF 版本,并将所有其他匹配的文件移动到名为“D:\Karaoke\duplicates\”的新文件夹中。如果不存在 AF 版本,则什么也不做。需要在 [AF Karaoke] 之前获取文件名,因为它在那之后是唯一的。

【问题讨论】:

  • `*.cdg' 是怎么回事?保留还是移动?
  • cdg 是与 mp3 时间匹配的歌词部分。 cdg 必须与其对应的 mp3 保持一致。如果 mp3 移动,cdg 也必须移动

标签: windows batch-file cmd duplicates


【解决方案1】:

如果您在这些文件所在的同一文件夹中使用命令行/命令行,请尝试以下操作:


For %F in (*)do echo/%~nF|find /v /i "[AF k" >nul && move "%~dpnxF" "D:\Karaoke\duplicates\" >nul

对于 bat 文件:


@echo off && cd /d "d:\folder\where\files\are"
For %%F in (*)do echo/%%~nF|find /v /i "[AF k" >nul && move "%%~dpnxF" "D:\Karaoke\duplicates\" >nul

【讨论】:

  • 问题是移动所有除了 "*[AF k*].*
  • 哼,我的英语,你懂的!有限,thkX!
【解决方案2】:

好吧,我会从另一边给马套上鞍,然后开始搜索 (.mp3) 名称包含 [AF karaoke] 的文件,如果找到,然后做其他事情,不要...像这样,假设所有文件名都包含一对括号([]):

@echo off
rem // Change to working directory:
pushd "D:\Karaoke" && (
    rem // Create sub-directory for dublicate items if not yet done:
    2> nul mkdir "duplicates"
    rem // Enumerate `.mp3` files whose names contain `[AF karaoke]`:
    for /F "tokens=1-3 delims=[] eol=]" %%A in ('dir /B /A:-D-H-S "*[AF karaoke].mp3"') do (
        rem // Enumerate all files whose partial names before `[` are the same:
        for /F "tokens=1-3 delims=[] eol=]" %%D in ('dir /B /A:-D-H-S "%%A[?? karaoke].*"') do (
            rem // Exclude files whose names contain `[AF karaoke]` and move the rest:
            if /I not "%%E"=="AF karaoke" ECHO move "%%D[%%E]%%F" "duplicates\"
        )
    )
    rem // Return to original directory:
    popd
)

这个脚本并不真正关心文件扩展名(如.mp3.cdg),它也不关心括号中字符串的开头而不是AF(如GTSJ )。

测试正确的输出后,删除move 命令前面的大写ECHO 命令

【讨论】:

  • 谢谢!这项工作!我将这部分 ('dir /B /A:-DHS "%%A[?? karaoke].*"') 更改为 ('dir /B /A:-DHS "%%A[* karaoke].*" ') 因为它并不总是品牌名称中的两个字母。它在我对一些小批量进行的少数测试中起作用。否则您会发现任何问题吗?
  • 也感谢代码中的 cmets。现在很容易理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2019-06-08
  • 2014-08-11
  • 1970-01-01
相关资源
最近更新 更多