标题: [文件操作] [已解决]批处理如何将文件名中的序号用0补齐? [打印本页]
作者: autoav 时间: 2021-8-2 09:55 标题: [已解决]批处理如何将文件名中的序号用0补齐?
本帖最后由 autoav 于 2021-8-9 11:33 编辑
我用火车头采集了一些小说,导出成TXT,比如:斗罗大陆1.txt,斗罗大陆2.txt,斗罗大陆10.txt,斗罗大陆11.txt,我用【copy 斗罗大陆*.txt 斗罗大陆all.txt】合并的时候,是按照1,10,11合并的,而不是1,2,3合并的,这样章节就错乱了,所以我想对序号用0补齐,使之成为斗罗大陆001.txt,这样合并就不会错乱了。
和车模老妈的日常-71.txt
和车模老妈的日常-72.txt
和车模老妈的日常-73.txt
寄生-10.txt
寄生-11.txt
寄生-12.txt
寄生-13.txt
寄生-6.txt
寄生-7.txt
寄生-8.txt
寄生-9.txt
红尘仙道-100.txt
红尘仙道-93.txt
红尘仙道-94.txt
红尘仙道-95.txt
红尘仙道-96.txt
红尘仙道-97.txt
红尘仙道-98.txt
红尘仙道-99.txt
荒唐皇帝-90.txt
荒唐皇帝-91.txt
荒唐皇帝-92.txt
这是部分文件列表,我想通过以下批处理实现将不同章节的小说合并成单个txt文件。
copy 和车模老妈的日常*.txt 和车模老妈的日常.txt
copy 寄生*.txt 寄生.txt
copy 红尘仙道*.txt 红尘仙道.txt
copy 荒唐皇帝*.txt 荒唐皇帝.txt
这样就存在一个问题,因为序号没有用0补齐,寄生的10-13章会在6-9章前面,红尘仙道的100章会在93章前,我就想编一个批处理,用0补齐,最后结果的目录是这样的:
和车模老妈的日常-00071.txt
和车模老妈的日常-00072.txt
和车模老妈的日常-00073.txt
寄生-00006.txt
寄生-00007.txt
寄生-00008.txt
寄生-00009.txt
寄生-00010.txt
寄生-00011.txt
寄生-00012.txt
寄生-00013.txt
红尘仙道-00093.txt
红尘仙道-00094.txt
红尘仙道-00095.txt
红尘仙道-00096.txt
红尘仙道-00097.txt
红尘仙道-00098.txt
红尘仙道-00099.txt
红尘仙道-00100.txt
荒唐皇帝-00090.txt
荒唐皇帝-00091.txt
荒唐皇帝-00092.txt
这样我进行copy批处理的时候,就不会章节混乱了。
作者: qixiaobin0715 时间: 2021-8-2 10:07
本帖最后由 qixiaobin0715 于 2021-8-2 10:33 编辑
- @echo off
- set names=斗罗大陆
- setlocal enabledelayedexpansion
- for %%a in (%names%*.txt) do set /a n+=1
- (for /l %%b in (1,1,!n!) do type %names%%%b.txt)>all.txt
- pause
复制代码
作者: qixiaobin0715 时间: 2021-8-2 10:45
回复 1# autoav
刚才有点小问题,已修改。要合并的文件和bat文件保存为ansi编码。
作者: autoav 时间: 2021-8-2 10:45
qixiaobin0715 发表于 2021-8-2 10:07
我试了,只合并了1-9,没有合并10以上的文件,跟我的要求不符,而且斗罗大陆只是举例,不能用set定义
作者: qixiaobin0715 时间: 2021-8-2 10:51
回复 4# autoav
现在也没有明白你的具体需求,要说清楚,不能只是自己明白。
作者: autoav 时间: 2021-8-2 10:57
回复 5# qixiaobin0715
如果A1,A2,A3,A4....A10,A11这种TXT合并的时候是按照A1,A10,A11,A2,A3,A4这样的顺序进行合并的,与实际顺序是错乱的。
所以想A1改为A001,A002,A003,A004...A010,A011。这样合并的话,顺序就不会错乱了
作者: qixiaobin0715 时间: 2021-8-2 11:14
回复 6# autoav
如果是A1、A2...,就改为set names=A不就行了。
作者: autoav 时间: 2021-8-2 11:35
回复 7# qixiaobin0715
总共至少是几十万个小文件,最后组成的单个文件也有上万个,有时间改set,还不如我把9,99,999,9999,99999前后相关文件单独拎出来处理呢
作者: qixiaobin0715 时间: 2021-8-2 11:56
你最起码要说清楚目录结构吧,是要合并的同一类文件分别在各个文件夹,还是所有文件都在一个文件夹中。
作者: autoav 时间: 2021-8-2 12:08
回复 9# qixiaobin0715
同一个目录下。
作者: xp3000 时间: 2021-8-2 12:51
软件法:
ReNamer添加正则替换规则,并且保存预设,以后直接导入
第一条:
第([0-9]+)
替换
第000$1
第二条:
第0+([0-9]{4})章
替换
第$1章
作者: xp3000 时间: 2021-8-2 12:57
像你要的把不在()的字符删除就行
作者: newswan 时间: 2021-8-2 12:58
linux sort- dir /b | sort --version-sort
复制代码
作者: idwma 时间: 2021-8-2 14:19
本帖最后由 idwma 于 2021-8-2 14:45 编辑
回复 8# autoav
最后的那个变量重置手抖了应该是set n=
活学活用
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1 delims=1" %%i in ('dir/b *1.txt^|findstr "[^0-9]1.txt"') do (
for %%a in (%%i*.txt) do set /a n+=1
(for /l %%b in (1,1,!n!) do type %%i%%b.txt)>%%iall.txt
set a=
)
pause
作者: qixiaobin0715 时间: 2021-8-2 14:50
本帖最后由 qixiaobin0715 于 2021-8-2 14:54 编辑
回复 14# idwma
思路不错。但是用"tokens=1 delims=1"不妥,万一文件名中的其它地方有1的话就会出问题,修改如下:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir/b *1.txt^|findstr "[^0-9]1.txt"') do (
- set "str=%%~ni"
- set "str=!str:~0,-1!"
- for %%a in ("!str!*.txt") do set /a n+=1
- (for /l %%b in (1,1,!n!) do type !str!%%b.txt)>!str!all.txt
- set n=
- )
- pause
复制代码
作者: newswan 时间: 2021-8-2 15:30
powershell- $ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }
- Get-ChildItem -path 'X:\xx\a*.txt' | Sort-Object $ToNatural | ForEach-Object { get-content $_.fullname } | out-file a.txt
复制代码
作者: gcbgczhang 时间: 2021-8-2 16:21
本帖最后由 gcbgczhang 于 2021-8-8 08:40 编辑
学习中,太麻烦,删掉了
作者: gcbgczhang 时间: 2021-8-2 16:25
回复 17# gcbgczhang
文件夹里不要有其他TXT,因为用的*.txt,如果用斗魂大陆*.txt应该可以
作者: idwma 时间: 2021-8-2 22:54
回复 15# qixiaobin0715
继续活学活用小小改动实现改名效果- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir/b *1.txt^|findstr "[^0-9]1.txt"') do (
- set "str=%%~ni"
- set "str=!str:~0,-1!"
- for %%a in ("!str!*.txt") do set /a n+=1
- (for /l %%b in (1,1,!n!) do set/a nn=10000+%%b &ren !str!%%b.txt !str!!nn:~1!.txt)
- set n=
- )
- pause
复制代码
作者: newswan 时间: 2021-8-3 00:00
本帖最后由 newswan 于 2021-8-3 01:04 编辑
- $sour = "aaa"
- $ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }
- Get-ChildItem -path $sour -Filter "*.txt" |
- Sort-Object $ToNatural |
- ForEach-Object {
- get-content -Encoding utf8 $_.fullname |
- Out-File -Append (( $_.basename -replace "\d+$","" ) + ".txt")
- }
复制代码
作者: autoav 时间: 2021-8-4 10:06
软件法:
ReNamer添加正则替换规则,并且保存预设,以后直接导入
第一条:
第([0-9]+)
替换
第000$1
...
xp3000 发表于 2021-8-2 12:51
我最后是用total command+emeditor搞定的,当然,只用total command也可以,只是它的正则不太容易写,所以我用emeditor先改好文件名,然后一次修改
作者: autoav 时间: 2021-8-4 10:18
本帖最后由 autoav 于 2021-8-4 10:23 编辑
补到10,应该够用了
@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a- ...
gcbgczhang 发表于 2021-8-2 16:21
和车模老妈的日常-71.txt
和车模老妈的日常-72.txt
和车模老妈的日常-73.txt
寄生-10.txt
寄生-11.txt
寄生-12.txt
寄生-13.txt
寄生-6.txt
寄生-7.txt
寄生-8.txt
寄生-9.txt
红尘仙道-100.txt
红尘仙道-93.txt
红尘仙道-94.txt
红尘仙道-95.txt
红尘仙道-96.txt
红尘仙道-97.txt
红尘仙道-98.txt
红尘仙道-99.txt
荒唐皇帝-90.txt
荒唐皇帝-91.txt
荒唐皇帝-92.txt
这是部分文件列表,我想通过以下批处理实现将不同章节的小说合并成单个txt文件。
copy 和车模老妈的日常*.txt 和车模老妈的日常.txt
copy 寄生*.txt 寄生.txt
copy 红尘仙道*.txt 红尘仙道.txt
copy 荒唐皇帝*.txt 荒唐皇帝.txt
这样就存在一个问题,因为序号没有用0补齐,寄生的10-13章会在6-9章前面,红尘仙道的100章会在93章前,我就想编一个批处理,用0补齐,最后结果的目录是这样的:
和车模老妈的日常-00071.txt
和车模老妈的日常-00072.txt
和车模老妈的日常-00073.txt
寄生-00006.txt
寄生-00007.txt
寄生-00008.txt
寄生-00009.txt
寄生-00010.txt
寄生-00011.txt
寄生-00012.txt
寄生-00013.txt
红尘仙道-00093.txt
红尘仙道-00094.txt
红尘仙道-00095.txt
红尘仙道-00096.txt
红尘仙道-00097.txt
红尘仙道-00098.txt
红尘仙道-00099.txt
红尘仙道-00100.txt
荒唐皇帝-00090.txt
荒唐皇帝-00091.txt
荒唐皇帝-00092.txt
这样我进行批处理的时候,就不会章节混乱了。
作者: newswan 时间: 2021-8-4 14:20
本帖最后由 newswan 于 2021-8-4 14:21 编辑
powershell- $sour = "."
- Get-ChildItem -path $sour -Filter "*-*.txt" | ForEach-Object {
- if ($_.basename -match "(.*)-(\d+)$")
- {
- write-host $_.basename ($matches[1] + "-" + $matches[2].PadLeft(6,"0"))
- # rename-item -path $_.FullName -NewName ($matches[1] + "-" + $matches[2].PadLeft(6,"0") + $_.Extension)
- }
- }
复制代码
先测试,正确的话,把地6行的#去掉
作者: newswan 时间: 2021-8-4 14:25
这么多文件,应该按小说名分目录- 寄生\12.txt
- 寄生\13.txt
- 寄生\6.txt
- 寄生\7.txt
- 红尘仙道\100.txt
- 红尘仙道\93.txt
- 红尘仙道\94.txt
- 红尘仙道\95.txt
复制代码
后续处理方便
作者: autoav 时间: 2021-8-5 09:53
这么多文件,应该按小说名分目录后续处理方便
newswan 发表于 2021-8-4 14:25
多层子目录,才不方便,同样文件数目情况下,肯定一个目录更方便。
作者: autoav 时间: 2021-8-5 10:16
powershell先测试,正确的话,把地6行的#去掉
newswan 发表于 2021-8-4 14:20
powershell不了解
作者: autoav 时间: 2021-8-5 11:06
我发现最快捷的方法,就是用everything,直接用正则写,然后全部替换就可以了
作者: gcbgczhang 时间: 2021-8-5 12:39
你用我上面的代码,把斗魂大陆都改成你相应的名,就都可以了,肯定会按大小排列
作者: qixiaobin0715 时间: 2021-8-5 12:45
本帖最后由 qixiaobin0715 于 2021-8-7 10:03 编辑
回复 25# autoav
你说的不错。但是有一点,这么多不同类别的文件在一起,会增加处理难度。
可以考虑这样的思路:
1.假设全部是如楼主列出的比较规范的文件名;
2.将同一类型的文件移动到同一个文件夹;
3.然后在各个文件夹中分别对文件进行规范命名;
4.分别将各文件夹中的文件合并。- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=-" %%i in ('dir /b /a-d *-*.txt') do (
- if not exist %%i md %%i
- move "%%i-%%j" "%%i"
- )
- for /d %%k in (*) do (
- pushd "%%k"
- for /f "tokens=1* delims=-" %%a in ('dir /b /a-d') do (
- set str=0000%%b
- set str=!str:~-9!
- ren "%%a-%%b" "%%a-!str!"
- )
- copy "%%k-*" "%%~dpk%%k.txt"
- popd
- )
- pause
复制代码
以上代码未经测试。
作者: newswan 时间: 2021-8-5 12:47
回复 27# autoav
请问
everything 正则改名 怎么处理0的个数问题?
作者: autoav 时间: 2021-8-6 11:11
回复 autoav
请问
everything 正则改名 怎么处理0的个数问题?
newswan 发表于 2021-8-5 12:47
第一步:everything地址栏输入【K:\book regex:-\d.txt】 按F2,原表达式【^(.*?)-(\d+)\.txt$】新表达式【\1-0\2.txt】这样,原来AA-1.txt,就变成了AA-01.txt
第二步:everything地址栏输入【K:\book regex:-\d\d.txt】 按F2,原表达式【^(.*?)-(\d+)\.txt$】新表达式【\1-0\2.txt】这样,原来AA-11.txt,就变成了AA-011.txt
第三步:everything地址栏输入【K:\book regex:-\d\d\d.txt】 按F2,原表达式【^(.*?)-(\d+)\.txt$】新表达式【\1-0\2.txt】这样,原来AA-011.txt,就变成了AA-0011.txt
这个方法最大的优势是不挑文件夹,多深的目录都可以操作
作者: autoav 时间: 2021-8-6 11:13
回复 autoav
你说的不错。但是有一点,这么多不同类别的文件在一起,会增加处理难度。
可以考虑这样的思 ...
qixiaobin0715 发表于 2021-8-5 12:45
里面的文件都是mysql数据库导出来的,具体格式是我输入的,就是书名-数据Id.txt,所以里面文件格式都是一样的
作者: autoav 时间: 2021-8-6 11:21
回复 autoav
你说的不错。但是有一点,这么多不同类别的文件在一起,会增加处理难度。
可以考虑这样的思 ...
qixiaobin0715 发表于 2021-8-5 12:45
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1* delims=-" %%i in ('dir /b /a-d *-*.txt') do (
if not exist %%i md %%i
move "%%i-%%j" "%%i"
)
你所有的代码中,这一段可以执行,后面一段代码没有执行
作者: qixiaobin0715 时间: 2021-8-6 12:59
回复 33# autoav
像这种最好传一个示范附件作为测试用,否则不好检查到底代码有无问题。
作者: newswan 时间: 2021-8-6 13:24
本帖最后由 newswan 于 2021-8-8 10:29 编辑
回复 31# autoav
everything 以前没注意这个功能
谢谢
作者: qixiaobin0715 时间: 2021-8-7 12:38
回复 33# autoav
再次检查代码,发现有一个循环语句中in和后面的括号未加空格,已修改。应当可以了。
作者: gcbgczhang 时间: 2021-8-8 10:21
本帖最后由 gcbgczhang 于 2021-8-8 10:40 编辑
- @echo off &setlocal enabledelayedexpansion
- for /f "tokens=1-31 delims=-" %%a in ('dir /b /a-d *-*.txt ') do (
- set str=%%a
- set str1=000000%%b
- set str1=!str1:~-10!
- if not exist --!str! md --!str!
- copy %%a-%%b --!str!\!str!-!str1! >nul
- )
- for /d %%i in (--*) do (
- copy %%i\*-*.txt %%i\%%i.txt >nul
- )
- pause
复制代码
已测试可行,放在要处理的文件夹中运行。建相应文件夹,copy一份改名再合并,便于测试。
作者: autoav 时间: 2021-8-9 11:18
回复 autoav
你说的不错。但是有一点,这么多不同类别的文件在一起,会增加处理难度。
可以考虑这样的思 ...
qixiaobin0715 发表于 2021-8-5 12:45
经测试,已经成功,非常感谢!
作者: autoav 时间: 2021-8-9 11:23
已测试可行,放在要处理的文件夹中运行。建相应文件夹,copy一份改名再合并,便于测试。
gcbgczhang 发表于 2021-8-8 10:21
经测试,可行,非常感谢!
作者: ZDTMW 时间: 2022-12-1 05:33
这个非常实用,我一直在找的。终于找到了。感谢各位。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |