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

[文件操作] 批处理将文件以数字重命名

[复制链接]
发表于 2008-6-9 17:13:10 | 显示全部楼层 |阅读模式
讨论:将文件以数字重命名
看似简单,其实不然。
现有a.txt文件内容如下,一行一个文件名。路径为当前目录。
要求:
   1、不能改变a.txt内容的顺序
   2、将当前目录下的所有jpg文件以序号的形式重命名 如:从1-16

   3、如果有16个文件,必须重命名为1-16,不允许出现16之后的序号

暂不公布我的代码,各位不防先试试。
a.txt 内容:
  1. 2.jpg
  2. 1.jpg
  3. a.jpg
  4. 5ww.jpg
  5. c.jpg
  6. f.jpg
  7. rty.jpg
  8. 3.jpg
  9. 11.jpg
  10. b.jpg
  11. 6.jpg
  12. e.jpg
  13. 8.jpg
  14. 111.jpg
  15. 7.jpg
  16. 30.jpg
复制代码


重新描述一下要求:
当前文件夹有一万多个jpg文件,文件名没有规律,有数字,英文,中文、及中英文混合。
要求:
   将jpg文件以数字形式重命名,必须是从1开始递增,即:最大的一个文件名就是文件的总数。
   要求效率,即:不能先判断文件的总数,再重命名。


[ 本帖最后由 随风 于 2008-6-10 23:55 编辑 ]
发表于 2008-6-9 17:36:27 | 显示全部楼层
  没有看明白你的意思:是从a.txt中读取jpg文件名来重命名当前目录下的文件?a.txt只是一个单独的文件,如何有顺序一说?
 楼主| 发表于 2008-6-9 17:46:19 | 显示全部楼层
a.txt中的内容其实就是当前文件夹下的jpg文件列表。
要求将当前文件夹里的所有jpg文件以序号的形式重命名。
但只能从 a.txt 获取当前文件夹里的所有 jpg 的文件名。
以序号重命名文件,陷阱重重,但如果用dir或for等命令来获取文件名的话,获取的先后次序会有一定规律,导致有些问题不能体现出来。
发表于 2008-6-9 17:56:46 | 显示全部楼层
  随风 是担心重命名后文件名可能和现有文件名重名是吧?但是我始终没明白你"不能改变a.txt的顺序
"到底是什么意思:a.txt只是一个单独的文件,没看到它到底和谁排序呢?难道是不能改变a.txt文件内容的顺序?
发表于 2008-6-9 19:46:27 | 显示全部楼层
不知道以下代码是不是投机:
  1. @echo on
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. set n1=0
  5. for /f "tokens=*" %%a in (a.txt) do (
  6.      set /a n+=1
  7.      ren %%a t!n!.jpg
  8.     )
  9. :loop
  10. set /a n1+=1  
  11. ren t%n1%.jpg %n1%.jpg&&goto :loop
  12. exit
复制代码

评分

参与人数 1PB +12 收起 理由
随风 + 12 不错

查看全部评分

 楼主| 发表于 2008-6-9 20:37:01 | 显示全部楼层
呵呵,个人认为算投机。。
不过也不错,也是一个解决方法

[ 本帖最后由 随风 于 2008-6-11 16:53 编辑 ]
发表于 2008-6-10 16:55:45 | 显示全部楼层
我有两个版本。第一个:
  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do set/a n+=1
  3. for /f "delims=" %%i in (a.txt) do (
  4.   for /l %%j in (1,1,%n%) do if %%~ni equ %%j set .%%j=ok
  5. )
  6. for /f "delims=" %%i in (a.txt) do (
  7.   if not defined .%%~ni call :out %%i
  8. )
  9. pause
  10. :out
  11. for /l %%i in (1,1,%n%) do (if not defined .%%i (ren %1 %%i.jpg&set .%%i=ok&goto :eof))
复制代码
第二个更简单:
  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do set/a n+=1
  3. for /f "delims=" %%i in (a.txt) do call :out %%i
  4. pause
  5. :out
  6. for /l %%i in (1,1,%n%) do (ren %1 %%i.jpg 2>nul&&goto :eof)
复制代码
 楼主| 发表于 2008-6-10 17:15:39 | 显示全部楼层
呵呵,强免完成任务。
两个版本的效率都非常的低。。









..
发表于 2008-6-10 17:21:46 | 显示全部楼层
暂时没想出很简洁的方法,再思考思考..........
发表于 2008-6-10 21:06:59 | 显示全部楼层
再来一个,效率要比前两个要好:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in (a.txt) do (set/a n+=1&set .!n!=ok)
  3. for /f %%i in (a.txt) do (
  4.   if not defined .%%~ni (set/a n1+=1&set name!n1!=%%i
  5.   ) else (set .%%~ni=)
  6. )
  7. for /l %%i in (1,1,%n%) do (if defined .%%i (set/a n2+=1&set num!n2!=%%i))
  8. for /l %%i in (1,1,%n1%) do ren !name%%i! !num%%i!.jpg
复制代码
 楼主| 发表于 2008-6-10 21:50:03 | 显示全部楼层
首先:效率仍是问题。
10 楼测试过吗?


代码绕的我好晕。。。

[ 本帖最后由 随风 于 2008-6-10 21:51 编辑 ]
发表于 2008-6-10 23:27:48 | 显示全部楼层
10楼测试过,代码虽然多,但都是for和if,不过也只能说比前面的快点。测试了几次,平均耗时0.03秒。
思路是将a.txt中 范围数字 之外的名称装进一个数组,再将剩余a.txt中没用过的数字装进一个数组,再一一对应重命名。

[ 本帖最后由 wankoilz 于 2008-6-10 23:32 编辑 ]
 楼主| 发表于 2008-6-10 23:55:49 | 显示全部楼层
见顶楼红色字部分,再试试。。。
发表于 2008-6-11 00:15:11 | 显示全部楼层
测试1000个文件用了2.8秒,10000个不敢测试了。发现太多的set很耗时间........
再思考思考................

[ 本帖最后由 wankoilz 于 2008-6-11 00:32 编辑 ]
发表于 2008-6-11 16:07:00 | 显示全部楼层
想给想得太简单了,呵呵……

[ 本帖最后由 lovelymorning 于 2008-6-11 16:36 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 13:24 , Processed in 0.012752 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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