Board logo

标题: [文件操作] 根据特殊的文件名中的隔符将文件批量放到对应的文件夹中 [打印本页]

作者: palehe    时间: 2021-5-12 09:00     标题: 根据特殊的文件名中的隔符将文件批量放到对应的文件夹中

本帖最后由 palehe 于 2021-5-12 09:49 编辑

各位大佬,RT:
我有一批文件,文件命名格式为:小区_户型_编号.jpg; 小区可能是2个字,也有可能是3个字,户型可能是 X-XXX(6-901);XX-XXXX(23-2301)等等,编号就是针对小区+户型相同的做依次编号的;
小区与户型 使用"_"隔开,户型与编号 也使用"_"隔开;
现在需要批量处理的是:
首先根据小区,将同小区的文件放到一起(如果能执行路径去放更好);
然后再根据户型,将同户型的文件再放到一起;
再放的时候,如果发现存放路径里面已经有了这个小区或者这个户型的文件夹,就直接放进去,如果没有就根据小区或者户型新建文件夹,然后再放进去;
不知道各位大佬有没有什么bat代码能实现呀,麻烦了。
图片太多了,成千张,而且是几乎每天都要处理的。

比如我有下面一些文件,名称是:
别院_6-901_1.png
别院_7-901_1.png
别院_7-901_2.png
别院_7-902_1.png
别院_7-902_2.png
别院_7-902_3.png
桃花源_10-1012_1.png
桃花源_19-1-12_1.png
桃花源_19-1-12_2.png
桃花源_19-1-12_3.png
那么现在我需要把这批文件按照以下规则批量分类
1、首先是分成 别院 跟 桃花源 两个大的文件夹 (如果能执行位置创建文件件更好)
2、然后在别院文件夹中再分6-901;7-901;7-902 三个文件件;在桃花源文件夹中 分 10-1012;19-1-12
3、然后分别将对应的图片放在文件夹下面:
别院_6-901_1.png--》别院\6-901\
别院_7-901_1.png--》别院\7-901\
别院_7-901_2.png--》别院\7-901\
别院_7-902_1.png--》别院\7-902\
别院_7-902_2.png--》别院\7-902\
别院_7-902_3.png--》别院\7-902\
桃花源_10-1012_1.png--》桃花源\10-1012\
桃花源_19-1-12_1.png--》桃花源\19-1-12\
桃花源_19-1-12_2.png--》桃花源\19-1-12\
桃花源_19-1-12_3.png--》桃花源\19-1-12\
4、如果已经有对应的文件夹了,就不用新建,直接放图片进去即可。
作者: newswan    时间: 2021-5-12 09:35

表述不清楚。
提问,回答,必须换位思考下,别人能不能看明白
作者: palehe    时间: 2021-5-12 09:48

回复 2# newswan

不好意思 是这样的,比如我有下面一些文件,名称是:
别院_6-901_1.png
别院_7-901_1.png
别院_7-901_2.png
别院_7-902_1.png
别院_7-902_2.png
别院_7-902_3.png
桃花源_10-1012_1.png
桃花源_19-1-12_1.png
桃花源_19-1-12_2.png
桃花源_19-1-12_3.png
那么现在我需要把这批文件按照以下规则批量分类
1、首先是分成 别院 跟 桃花源 两个大的文件夹 (如果能执行位置创建文件件更好)
2、然后在别院文件夹中再分6-901;7-901;7-902 三个文件件;在桃花源文件夹中 分 10-1012;19-1-12
3、然后分别将对应的图片放在文件夹下面:
别院_6-901_1.png--》别院\6-901\
别院_7-901_1.png--》别院\7-901\
别院_7-901_2.png--》别院\7-901\
别院_7-902_1.png--》别院\7-902\
别院_7-902_2.png--》别院\7-902\
别院_7-902_3.png--》别院\7-902\
桃花源_10-1012_1.png--》桃花源\10-1012\
桃花源_19-1-12_1.png--》桃花源\19-1-12\
桃花源_19-1-12_2.png--》桃花源\19-1-12\
桃花源_19-1-12_3.png--》桃花源\19-1-12\
4、如果已经有对应的文件夹了,就不用新建,直接放图片进去即可。
作者: xp3000    时间: 2021-5-12 09:56

本帖最后由 xp3000 于 2021-5-13 16:57 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2,3,* delims=^._" %%i in ('"dir /b/a-d/on *.jpg *.png *.bmp"') do (
  3. if not exist %%~nxi\%%j MD "%%~nxi\%%j"
  4. setlocal
  5. set m=0&set n=1
  6.     if not exist "%%~nxi\%%j\%%i_%%j_%%k.%%l" (
  7.     move "%%i_%%j_%%k.%%l" "%~dp0%%~nxi\%%j"
  8.     ) else (
  9. for /f "delims=" %%i in ('"dir /b/a-d/on %%~nxi\%%j\*.jpg %%~nxi\%%j\*.png"') do (set /a m+=1)
  10. set /a n=!m!+!n!
  11.     move "%%i_%%j_%%k.%%l" "%~dp0%%~nxi\%%j\%%i_%%j_!n!.%%l"
  12.     )
  13. endlocal
  14. )
  15. pause
复制代码

作者: palehe    时间: 2021-5-12 10:08

回复 4# xp3000

谢谢老师,太感谢!
作者: newswan    时间: 2021-5-12 10:19

  1. "tokens=1,2,3 delims=_."
复制代码

作者: palehe    时间: 2021-5-12 10:20

回复 4# xp3000

老师,我再问一下,如果是只识别第一个分隔符呢?

别院_6-901.png--》别院\
别院_7-901.png--》别院\
别院_7-902.png--》别院\
桃花源_10-1012.png--》桃花源\
桃花源_19-1-12.png--》桃花源\
作者: xp3000    时间: 2021-5-12 10:34

  1. @echo off
  2. for /f "tokens=1,* delims=_" %%i in ('"dir /b/a-d/on *.jpg *.png *.bmp"') do (
  3.     if not exist "%%~nxi" MD "%%~nxi"
  4.         move /y "%%i_%%j" "%~dp0%%~nxi"&echo %%~nxi_%%j移动成功&echo.
  5. )
  6. for /f "tokens=*" %%k in ('dir/s/b/ad^|sort /r') do rd "%%k" 2>nul >nul
  7. pause
复制代码
只处理批处理所在文件夹,附带清空空文件夹
作者: palehe    时间: 2021-5-12 10:47

回复 8# xp3000


好的,谢谢老师,辛苦了
作者: rockjean    时间: 2021-5-12 13:58

xp3000老师,牛批了!
作者: palehe    时间: 2021-5-13 11:05

回复 8# xp3000


老师,再打扰你一下,我处理的文件会有这种情况
今天我有一张
别院_6-901_1.png的图片
用老师的代码 处理后 它自动到
别院\6-901\别院_6-901_1.png
路径下;
但是明天 或者后天 可能又会有一张 别院_6-901_1.png的图片
这个时候我再执行,代码会把我前面的那张图片给覆盖了
老师能不能让它不覆盖,而是相同名字的 自动增加一个后缀做区分,
同样 可能后续还会再有 别院_6-901_1.png的图片 所以加了后缀后能否再判断一下是否有重复,有就继续加后缀。
作者: palehe    时间: 2021-5-13 16:17

回复 12# xp3000


老师,我测试了一下
第一次有重复的 可以新建,
可是再有重复的 就不行了
因为同一个户型,有可能每天都要施工图的,
那个施工图是我根据一定规则处理好了的,所以每天的同一个户型可能会有很多重复的名字
按照上面的代码 ,第一天的处理了,第二天再处理,遇到重复的会新建,第三天在处理,就覆盖了。
不过还是谢谢老师,最早的方式已经解决了,我后面手动去剪切 粘贴 系统会提示有重复的,我选择不覆盖就可以了
谢谢老师
作者: xp3000    时间: 2021-5-13 16:51

回复 12# palehe

哦,修正了,在4楼,刚开始没考虑到哪




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2