找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 109854|回复: 39

[文件操作] [已解决]批处理如何将文件名中的序号用0补齐?

[复制链接]
发表于 2021-8-2 09:55:13 | 显示全部楼层 |阅读模式
本帖最后由 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批处理的时候,就不会章节混乱了。
发表于 2021-8-2 10:07:33 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-8-2 10:33 编辑
  1. @echo off
  2. set names=斗罗大陆
  3. setlocal enabledelayedexpansion
  4. for %%a in (%names%*.txt) do set /a n+=1
  5. (for /l %%b in (1,1,!n!) do type %names%%%b.txt)>all.txt
  6. pause
复制代码
发表于 2021-8-2 10:45:21 | 显示全部楼层
回复 1# autoav
刚才有点小问题,已修改。要合并的文件和bat文件保存为ansi编码。
 楼主| 发表于 2021-8-2 10:45:48 | 显示全部楼层
qixiaobin0715 发表于 2021-8-2 10:07



    我试了,只合并了1-9,没有合并10以上的文件,跟我的要求不符,而且斗罗大陆只是举例,不能用set定义
发表于 2021-8-2 10:51:35 | 显示全部楼层
回复 4# autoav
现在也没有明白你的具体需求,要说清楚,不能只是自己明白。
 楼主| 发表于 2021-8-2 10:57:47 | 显示全部楼层
回复 5# qixiaobin0715
如果A1,A2,A3,A4....A10,A11这种TXT合并的时候是按照A1,A10,A11,A2,A3,A4这样的顺序进行合并的,与实际顺序是错乱的。
所以想A1改为A001,A002,A003,A004...A010,A011。这样合并的话,顺序就不会错乱了
发表于 2021-8-2 11:14:30 | 显示全部楼层
回复 6# autoav
如果是A1、A2...,就改为set names=A不就行了。
 楼主| 发表于 2021-8-2 11:35:44 | 显示全部楼层
回复 7# qixiaobin0715


    总共至少是几十万个小文件,最后组成的单个文件也有上万个,有时间改set,还不如我把9,99,999,9999,99999前后相关文件单独拎出来处理呢
发表于 2021-8-2 11:56:14 | 显示全部楼层
你最起码要说清楚目录结构吧,是要合并的同一类文件分别在各个文件夹,还是所有文件都在一个文件夹中。
 楼主| 发表于 2021-8-2 12:08:28 | 显示全部楼层
回复 9# qixiaobin0715


    同一个目录下。
发表于 2021-8-2 12:51:21 | 显示全部楼层
软件法:
ReNamer添加正则替换规则,并且保存预设,以后直接导入
第一条:
第([0-9]+)
替换
第000$1

第二条:
第0+([0-9]{4})章
替换
第$1章
发表于 2021-8-2 12:57:53 | 显示全部楼层
像你要的把不在()的字符删除就行
发表于 2021-8-2 12:58:28 | 显示全部楼层
linux sort

  1. dir /b | sort --version-sort
复制代码
发表于 2021-8-2 14:19:30 | 显示全部楼层
本帖最后由 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
发表于 2021-8-2 14:50:07 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-8-2 14:54 编辑

回复 14# idwma
思路不错。但是用"tokens=1 delims=1"不妥,万一文件名中的其它地方有1的话就会出问题,修改如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir/b *1.txt^|findstr "[^0-9]1.txt"') do (
  4.     set "str=%%~ni"
  5.     set "str=!str:~0,-1!"
  6.     for %%a in ("!str!*.txt") do set /a n+=1
  7.     (for /l %%b in (1,1,!n!) do type !str!%%b.txt)>!str!all.txt
  8.     set n=
  9. )
  10. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 10:44 , Processed in 0.014354 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表