如何根据文件名将文件名排序到文件夹中



我正在尝试根据文件名的开头将文件移动到文件夹中,

例如,我有六个文件,xx_0_1.png、xx_0_2.png、xx_1_1.png、xxx_0_1.png、xxx_0_2.png xxx_1_1.png

(他们并不总是遵循这种拥有三个的模式(

我需要它们根据 _0 之前的字符对文件夹进行排序(因为可能有类似 hello_world_0_1.png 的东西,名称从不包含整数。 后面的数字对它们的大小没有限制。

因此,如果我有fruit_0_1.png,fruit_0_2.png,fruit_1_1.png,fence_0_1.png,fence_0_2.png,hello_world_0_1.png和hello_world_0_2.png,它们会像这样分类:

水果

  • fruit_0_1.png
  • fruit_0_2.png
  • fruit_1_1.png

栅栏

  • fence_0_1.png
  • fence_0_2.png

hello_world

  • hello_world_0_1.png
  • hello_world_0_2.png

PNG 文件名称的格式始终为(某些文本((第一个数字((第二个数字(.png SomeText 可以包含下划线,但通常不包含数字。第一个数字和第二个数字可以和它们最终一样大(通常总是小于 20,但可以更多( 并且文件始终属于 .png 类型

我已经尝试了其他堆栈溢出问题的一些解决方案,但是我还没有找到解决方案。

我得到的最接近的是将每个文件单独分类到它们自己的文件夹中(这不是我想要的(,这个例子是我所拥有的:

@echo off
for %%a in (*.*) do (
md "%%~na" 2>nul
move "%%a" "%%~na"
)
cd ..
del %%~na
pause

它目前将每个文件放入自己的文件夹中,而不是在名称后拆分。

下面是一个示例脚本:

@For %%F In ("*_*_*.png")Do @(Set "oF=%%F"
SetLocal EnableDelayedExpansion
For %%D In ("!oF:_=!....")Do @(Set "oD=%%~dpnD"
Set "oD=!oD:%__CD__%=!"
RoboCopy . "!oD:=_!" "%%F" /Mov>NUL)
EndLocal)

由于您的问题只是一个代码请求,因此我不打算解释它是如何工作的,如何使用它,或者在发布时针对您的问题以外的任何场景对其进行扩展。

这是一个可能的解决方案:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for %%V in ('2^> nul set "$ITEM["') do set "%%V="
cd /D "C:Projects" & rem // (specify target rooot directory here)
for /F "delims=" %%F in ('
dir /B /A:-D-H-S "*_*_*.png" ^| findstr /I /R "[^_]_[0-9][0-9]*_[0-9][0-9]*.png$"
') do (
call :SUB "%%~nF"
set /A "IDX-=2" & set "NAME=_" & for /L %%I in (0,1,!IDX!) do set "NAME=!NAME!!$ITEM[%%I]!_"
ECHO mkdir "%%~dpF!NAME:~1,-1!" 2> nul
ECHO move "%%~fF" "%%~dpF!NAME:~1,-1!%%~nxF"
)
endlocal
exit /B
:SUB
set /A "IDX=0" & set "FILE=%~1"
set "$ITEM[!IDX!]=%FILE:_=" & set /A "IDX+=1" & set "$ITEM[!IDX!]=%"
exit /B

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

相关内容

最新更新