标题: [文本处理] 【已解决】批处理怎么解决相似文件名怎么才能完美分类 [打印本页]
作者: 8532200 时间: 2020-7-24 13:13 标题: 【已解决】批处理怎么解决相似文件名怎么才能完美分类
本帖最后由 8532200 于 2020-7-24 22:46 编辑
找了足足两个小时。才找到这个不完美的解决方法- @echo off
- rem 将多个文件剪切/移动到以该文件名称开头前几位字符命名的文件夹里
- set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
- title %#% +%$%%$%/%@% %z%
- cd /d "%~dp0"
- set len=4
- for /f "delims=" %%a in ('dir /a-d/b') do (
- if /i "%%~nxa" neq "%~nx0" (
- set "base=%%~na"&set "file=%%a"
- setlocal enabledelayedexpansion
- if not exist "!base:~0,%len%!\" (md "!base:~0,%len%!\")
- echo;"!file!" --^> "!base:~0,%len%!\"
- move "!file!" "!base:~0,%len%!\"
- endlocal
- )
- )
- :end
- echo;%#% +%$%%$%/%@% %z%
- pause
- exit
复制代码
不过以上代码只能截取前六位字符相同的文件名自动分类
比如我有很多txt,文件名是
朱雀记001.txt
朱雀记002.txt
朱雀记003.txt
重生之文豪野犬001.txt
重生之文豪野犬002.txt
重生之文豪野犬003.txt
犬夜叉-001.txt
犬夜叉-002.txt
犬夜叉-003.txt
CCTVVIDEO-001.TXT
CCTVVIDEO-002.TXT
CCTVVIDEO-003.TXT
文件太多了。。没有什么大的规则。。。唯一规则是很多文件名是类似的,求问怎么才可以自动分类创建目录
最后结果是
朱雀记
重生之文豪野犬
犬夜叉
CCTVVIDEO
求解决。。实在是找不到方法。。目前用的是上面的代码。。但不好用
作者: smss 时间: 2020-7-24 14:13
本帖最后由 smss 于 2020-7-24 16:59 编辑
- @Echo off&SetLocal EnableDelayedExpansion
- for /f "delims=" %%i in ('dir /b/s *.txt ^|find /V "-"')do set "n=%%~nxi"&ren "%%i" "!n:~0,-7!-!n:~-7!"
- for /f "tokens=1,2 delims=-" %%i in ('dir /b/s *-*.txt')do (if not exist "%%~ni" md "%%~ni"
- move "%%i-%%j" "%%~ni")
- pause
复制代码
作者: ivor 时间: 2020-7-24 14:27
用正则匹配- ^([^\x00-\xff]|[A-Z])+(?=-)?
复制代码
作者: 8532200 时间: 2020-7-24 14:54
用正则匹配
ivor 发表于 2020-7-24 14:27
感谢回复。。。但你这个毫无反应
作者: 8532200 时间: 2020-7-24 14:57
smss 发表于 2020-7-24 14:13
非常感谢回复。。实测毫无用处。。。只创建了同名文件夹(例如朱雀记001)。。甚至没有把txt放进去
理论结果应该是把含有朱雀记文件名的文件放进朱雀记文件夹里
作者: 8532200 时间: 2020-7-24 15:10
用正则匹配
ivor 发表于 2020-7-24 14:27
实际测试了一下。。。。这段代码需要改为^([^\x00-\xff]|[A-Z])+
才可以对txt正则。。。但我这个不是修改txt里面的文字。。。而是需要分类文件
作者: smss 时间: 2020-7-24 17:02
回复 5# 8532200
另存为ANSI编码再试试
作者: 8532200 时间: 2020-7-24 18:33
回复 8532200
另存为ANSI编码再试试
smss 发表于 2020-7-24 17:02
我默认就是ansi。实测确实毫无用处。。。只创建了一些空白文件夹
作者: smss 时间: 2020-7-24 20:21
本帖最后由 smss 于 2020-7-24 20:23 编辑
回复 8# 8532200 已修改再试试
作者: 8532200 时间: 2020-7-24 20:28
回复 8532200 已修改再试试
smss 发表于 2020-7-24 20:21
实测还是和之前的一样。。只创建了空白文件夹。。。。
作者: 8532200 时间: 2020-7-24 20:31
回复 8532200 已修改再试试
smss 发表于 2020-7-24 20:21
我知道为何出错了。。。我测试了朱雀记001,002成功了。。。但是小说有很多文件名。。。看起来没办法做到完美分类了。。。只要稍微不同就不行
作者: 8532200 时间: 2020-7-24 20:33
回复 8532200 已修改再试试
smss 发表于 2020-7-24 20:21
简单说。目前你这个代码没办法做到我说的相近字符就分类。需要一些条件。。看起来还是需要手动调节。。。或者可以配合我找到的那个代码来使用了。。。
作者: qixiaobin0715 时间: 2020-7-24 22:29
如果文件名仅限于你列出的那样,试试下面的代码:- @echo off
- setlocal enabledelayedexpansion
- for /r %%i in ("*.txt")do (
- set "Name=%%~nxi"
- if "!Name:~-8,1!" == "-" (
- if not exist "!Name:~0,-8!" md "!Name:~0,-8!"
- move /-y "%%i" "!Name:~0,-8!"
- ) else (
- if not exist "!Name:~0,-7!" md "!Name:~0,-7!"
- move /-y "%%i" "!Name:~0,-7!"
- )
- )
- pause
复制代码
作者: 8532200 时间: 2020-7-24 22:37
如果文件名仅限于你列出的那样,试试下面的代码:
qixiaobin0715 发表于 2020-7-24 22:29
不是。。。。文件名会有些许变动。楼上其实已经解决我说的问题。。。只是没办法完美
作者: Batcher 时间: 2020-7-24 22:39
回复 1# 8532200
试试 BAT + sed 的方法:
http://bcn.bathome.net/s/tool/index.html?key=sed- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- for /f "delims=" %%j in ('echo %%i^|sed -r "s/^([^\x00-\xff]+).*/\1/; s/^([A-Z]+).*/\1/"') do (
- if not exist "%%j" (
- md "%%j"
- )
- move /y "%%i" "%%j"
- )
- )
复制代码
作者: 8532200 时间: 2020-7-24 22:44
如果文件名仅限于你列出的那样,试试下面的代码:
qixiaobin0715 发表于 2020-7-24 22:29
实测你的貌似好用一点。。。我还没对比。。。粗略一看貌似差不多。。非常感谢你的回复
作者: 8532200 时间: 2020-7-24 22:45
回复 8532200
试试 BAT + sed 的方法:
Batcher 发表于 2020-7-24 22:39
13楼已经基本解决了。。加上一楼那个我自己找到的代码就基本可以做到大部分了。。。感激不尽
作者: qixiaobin0715 时间: 2020-7-25 10:20
回复 1# 8532200
表述问题一定要清楚,否则别人想帮你也帮不到。
就你提出的问题:
1.要说明文件名相同部分的特征,比如是否象你列举的全部由中文和英文字母组合而成,是否还有别的字符;
2.分界点前后字符有何特征;
3.后面不同部分是否都是有类似-001、-002或001、002构成。
你想到的特征都要尽量表达出来。
作者: 8532200 时间: 2020-7-25 10:31
回复 8532200
表述问题一定要清楚,否则别人想帮你也帮不到。
就你提出的问题:
1.要说明文件名相同 ...
qixiaobin0715 发表于 2020-7-25 10:20
谢谢。已经解决了。。主要是txt文件名变数太多。。。没办法全部列举。。只能列举部分。稍微一丁点变动bat就出错。。而且就连上面最完美的也没办法做到完美。。毕竟变数太多。。说出来也没用。。。批处理不是万能的。。还是需要灵活使用
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |