batch-file - 如何根据文件名将文件名排序到文件夹中
问题描述
我正在尝试根据文件名称的开头将文件移动到文件夹中,
比如我有六个文件,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,它们会分类到这样的文件夹中:
水果
- 水果_0_1.png
- 水果_0_2.png
- 水果_1_1.png
栅栏
- fence_0_1.png
- fence_0_2.png
你好世界
- hello_world_0_1.png
- hello_world_0_2.png
png 文件名称的格式始终为 (sometext) (firstnumber) (secondnumber).png sometext 可以包含下划线并且经常包含下划线,但它从不包含数字。firstnumber 和 secondnumber 可以和它们最终一样大(通常总是小于 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)
由于您的问题只是一个代码请求,因此我不会在发布时解释它的工作原理、使用方法或针对您的问题之外的任何场景进行扩展。
推荐阅读
- reactjs - react-router-dom:如何将 url 与某种模式匹配
- go - 为什么将单个字节类型转换为字符串在 go 中不起作用?
- python - django-excel pyexcel 显示 django heroku 的未知参数
- reactjs - React:如果 prop 更改,则重新渲染组件
- dart - 使用“Process.start”时如何处理不需要的标准输出?
- numpy - 在 Pi 4、32 位操作系统中,无法将符号张量 (lstm/strided_slice:0) 转换为 numpy 数组;在 LSTM 实施期间
- intellij-idea - 如何从 Intellij 中的 Embold 插件导出数据?
- html - 如何将实时值从网站导入到 Google 表格?
- python - 将 Python 值更新为 Google 表格
- azure - Azure blob 中的 .CSV 到 SQL 表