如何用批处理脚本按文件名前缀归类文件,忽略下划线至点间内容?
解决方案:按前缀批量归类文件到对应文件夹
你的需求是把共享同一基础前缀的文件(比如MS394-19-1872.tif、MS394-19-1872_mods.xml这类)统一放到以该前缀命名的文件夹中,下面分两种场景给出批处理代码:
场景1:当前文件名格式(下划线区分前缀和后缀)
针对你现在的文件命名(比如MS394-19-1872.tif、MS394-19-1872_mods.xml),可以用下面的批处理代码:
@echo off setlocal enabledelayedexpansion :: 遍历当前目录下所有文件 for %%a in (*.*) do ( :: 跳过文件夹,只处理文件 if not "%%~fa"=="%%~dpa%%~na" ( :: 提取文件名(不含扩展名),按下划线分割取第一部分作为文件夹名 for /f "delims=_" %%b in ("%%~na") do set "folder=%%b" :: 创建文件夹(已存在则忽略错误提示) md "!folder!" 2>nul :: 移动文件到目标文件夹 move "%%a" "!folder!" ) ) endlocal
代码说明:
setlocal enabledelayedexpansion:启用延迟变量扩展,确保循环内变量能正确更新和读取。if not "%%~fa"=="%%~dpa%%~na":过滤掉文件夹,只处理文件(避免把新建的文件夹再当成文件处理)。for /f "delims=_" %%b in ("%%~na") do set "folder=%%b":把文件名(不含扩展名)按下划线拆分,取第一部分作为文件夹名——比如MS394-19-1872_mods会被拆成MS394-19-1872,而MS394-19-1872(来自.tif文件)直接作为文件夹名。md "!folder!" 2>nul:创建文件夹,2>nul用来屏蔽“文件夹已存在”的错误提示,避免刷屏。
场景2:改为点分隔后缀的格式(如MS394-19-1872.mods.xml)
如果你把文件名改成点分隔的形式,只需要调整分割符为.即可,代码如下:
@echo off setlocal enabledelayedexpansion for %%a in (*.*) do ( if not "%%~fa"=="%%~dpa%%~na" ( :: 按点分割取第一部分作为文件夹名 for /f "delims=." %%b in ("%%~na") do set "folder=%%b" md "!folder!" 2>nul move "%%a" "!folder!" ) ) endlocal
注意事项
- 把批处理文件放到要处理的文件所在的文件夹中运行,不要放到其他目录。
- 运行前建议先备份文件,避免误操作导致文件丢失。
- 如果已经存在同名文件夹,代码会直接把文件移动进去,不会覆盖原有文件(move命令遇到同名文件会询问是否替换,如果你想自动覆盖,可以在move后加
/y参数:move /y "%%a" "!folder!")。
内容的提问来源于stack exchange,提问作者ArchivistG
相关产品推荐
相关产品推荐

