前言:
我们整理NAS中文件时经常遇到需要将同名不同格式的文件移动到同名文件夹中的情况,而且大部分时候这些文件还有不同的后缀,如图中所示,文件除了本名,后缀还有-fanart,-poster等字符,还需要创建文件夹,再改名,之后才能将文件拖入文件夹中,如果纯手动进行操作,往往面对数万的文件而感到头皮发麻,纯手动整理几天几夜也整理不完......有没有办法能快速便捷的将同名不同格式的文件移动到同名文件夹中呢?答案是:有的!
方法(旧)
创建一个批处理文件:
打开记事本(Notepad)。
将以下代码粘贴到记事本中:
@echo off
setlocal enabledelayedexpansion
rem 设置前缀长度
set "length=15" rem 替换为你想要的字符数量
rem 遍历所有文件
for %%f in (*.*) do (
rem 提取前缀
set "filename=%%~nf"
set "prefix=!filename:~0,%length%!"
rem 创建对应的文件夹(如果不存在)
if not exist "!prefix!\" (
mkdir "!prefix!"
)
rem 移动文件到对应的文件夹
move "%%f" "!prefix!\"
)
代码中"set "length=15"代表你文件名中所需要的字符数量,多出的后缀将被识别忽略,一同归类至同名文件夹中,之后保存文件:点击“文件” -> “另存为”,在文件名框中输入 move_files.bat,将“保存类型”选择为“所有文件”,然后保存到你想要操作的文件夹中。
方法(新)
最近deepseek很火,然后突发奇想把上列代码扔进去让ds帮忙修改,效果很不错,让ds填加了一些功能:
1.支持撤销移动
2.支持再命令行中输入限制字符数量
3.不再将本bat文件也整理进文件夹
具体代码如下:
@echo off
setlocal enabledelayedexpansion
:: 配置文件参数
set "LOG_FILE=undo_log.txt"
set "SELF_FILE=%~nx0"
set "FOLDERS_TO_CHECK=folders.tmp"
:MAIN_MENU
cls
echo 文件管理工具 v2.3
echo --------------------------
echo 1. 执行文件分类
echo 2. 撤销上次操作
echo 3. 退出
echo --------------------------
set /p choice=请选择操作 (1/2/3):
if "%choice%"=="1" goto GET_LENGTH
if "%choice%"=="2" goto UNDO
if "%choice%"=="3" exit /b
echo 无效选项,请重新输入
timeout /t 2 >nul
goto MAIN_MENU
:GET_LENGTH
cls
:INPUT_LOOP
set /p "length=请输入文件名前缀长度(1-50): "
:: 输入验证
if not defined length goto INPUT_LOOP
echo %length%|findstr /r "^[1-9][0-9]*$" >nul || (
echo 输入无效,必须是1-50之间的正整数
timeout /t 2 >nul
goto INPUT_LOOP
)
if %length% gtr 50 (
echo 长度不能超过50
timeout /t 2 >nul
goto INPUT_LOOP
)
goto CLASSIFY
:CLASSIFY
:: 初始化日志文件
if exist "%LOG_FILE%" del "%LOG_FILE%"
set "counter=0"
for %%f in (*.*) do (
if /i not "%%~nxf"=="%SELF_FILE%" (
:: 获取绝对路径
set "source=%%~ff"
set "filename=%%~nf"
:: 动态处理短文件名
if "!filename!"=="" (
set "prefix=NO_NAME"
) else (
set "prefix=!filename:~0,%length%!"
)
set "target=!prefix!\%%~nxf"
:: 记录完整绝对路径(带引号)
echo move "!source!" "!target!" >> "%LOG_FILE%"
:: 创建文件夹并移动文件
if not exist "!prefix!\" mkdir "!prefix!"
move "%%f" "!prefix!\" >nul && set /a "counter+=1"
)
)
echo 操作完成! 共移动了 %counter% 个文件
echo 按任意键返回主菜单...
pause >nul
goto MAIN_MENU
:UNDO
if not exist "%LOG_FILE%" (
echo 未找到操作记录,无法撤销
timeout /t 2 >nul
goto MAIN_MENU
)
:: 初始化临时文件
if exist "%FOLDERS_TO_CHECK%" del "%FOLDERS_TO_CHECK%"
set "counter=0"
echo 正在撤销操作...
for /f "usebackq delims=" %%a in ("%LOG_FILE%") do (
:: 解析带引号的路径
set "command=%%a"
set "command=!command:move =!"
for /f "tokens=1,2" %%b in ("!command!") do (
:: 记录目标文件夹路径
set "target_folder=%%~dpc"
echo !target_folder! >> "%FOLDERS_TO_CHECK%"
:: 执行移动操作
if exist "%%c" (
move "%%c" "%%b" >nul && set /a "counter+=1"
) else (
echo 文件不存在: "%%c"
)
)
)
:: 删除空文件夹
if exist "%FOLDERS_TO_CHECK%" (
sort "%FOLDERS_TO_CHECK%" /unique > "%FOLDERS_TO_CHECK%.sorted"
echo 正在清理空文件夹...
for /f "delims=" %%d in ('type "%FOLDERS_TO_CHECK%.sorted"') do (
if exist "%%~d" (
dir "%%~d" /b 2>nul | findstr . >nul || (
echo 删除空文件夹: "%%~d"
rmdir "%%~d"
)
)
)
del "%FOLDERS_TO_CHECK%.sorted"
)
del "%LOG_FILE%"
del "%FOLDERS_TO_CHECK%" 2>nul
echo 撤销完成! 已还原 %counter% 个文件
echo 按任意键返回主菜单...
pause >nul
goto MAIN_MENU
endlocal
将上述代码文本文档写入之后另存为,在文件名框中输入 move_files.bat,将“保存类型”选择为“所有文件”,然后保存到你想要操作的文件夹中。
注意:文件格式选择ANSI !!!否则会乱码!!
效果图:

选项1:开始分类,会要求你输入文件名前缀长度

输入后自动执行分类,并生成undo_log.txt文件,分类后按任意键返回主菜单
选项2:撤销分类,按照undo_log.txt文件中记录的路径还原文件,并删除选项1中新生成的文件夹,撤销分类后按任意键返回主菜单
选项3:退出
注意事项:
- 确保要移动的文件都在同一个文件夹中。
- 运行批处理文件之前,最好先进行测试,以防意外情况。
- 文件格式一定要选择ANSI !!!否则会乱码!!
3586





