Board logo

标题: [文件操作] 一些批量重命名存在的漏洞 [打印本页]

作者: 523066680    时间: 2009-7-26 13:54     标题: 一些批量重命名存在的漏洞

在cn-dos发过,现在cn-dos暂时xx,还好我有原稿~ 整理一下发过来

主要话题:
不小心发现,好多 BatchRename (批量重命名) 代码 都有的一个bug ~  dir会把名字排序并列出,但是...
Assume(假设) 存在 0.jpg 1.jpg  a.jpg ...
    dir得到第一个文件 0.jpg ,按编号会把0.jpg 重命名为 1.jpg 但是1.jpg已经存在了,就会矛盾。
这种矛盾多一些的话,就全乱了。


前传-简洁代码出错
首先,谈谈经典的一句话批量重命名
@echo off
for %%a in (*.jpg) do (set /a n+=1 &call ren %%a %%n%%.jpg)

代码是短,就是ren的时候好多编号都大了一些
我ren 001-099 这些文件,结果出现了100以上的编号,百思不得其解
于是往代码加echo ,看了以后郁闷,那句for居然可以把Ren过的文件再次抓进集合...好先进的功能

先进列表如下
001.jpg - 1
:
:
:
093.jpg - 93
094.jpg - 94
095.jpg - 95
096.jpg - 96
097.jpg - 97
098.jpg - 98
099.jpg - 99         
1.jpg - 100      <<----把1.jpg又抓进来了
10.jpg - 101         
11.jpg - 102
12.jpg - 103
13.jpg - 104
14.jpg - 105
15.jpg - 106
16.jpg - 107
:
:

而且一般该代码执行过一次以后再试一次,还会出问题的,编号混乱了,重复矛盾了......
改成 for /f "tokens=*" %%a in ('dir *.jpg /b') do (    就不会出现重复重命名同一个文件的问题了
(这个故事告诉我们,精简的时候,该保留的,就得留着,别老为了“代码一句话”就猛缩代码。)
-----------------------------------------------------------------------
回到主要话题:
dir会把名字排序并列出,
但是存在类似 0.jpg 1.jpg 的情况时,执行第一句ren 0.jpg 1.jpg 就会矛盾.因为1.jpg已经存在

个人临时的解决方案是-
前面先 ren *.jpg *.jpg#

接下来挨个重命名 "xx.jpg#" 为 "编号.jpg" 就不会矛盾了.      只是jpg文件多的时候感觉开头停顿了一下下.
来个自己的代码,粗糙的。
  1. @echo off
  2. title code by 523066680 @ cn-dos.net
  3. if not exist *.jpg (echo,不存在jpg文件&pause>nul&exit)
  4. setlocal enabledelayedexpansion
  5. ::判断文件数位数,决定名字前面补0的最大个数.文件数不能多于9位数.
  6. for %%a in (*.jpg) do set /a a+=1
  7. set "a=%a%987654321" & set "o=0000000000"
  8. set /a k=0
  9. ::避免重命名同名冲突
  10. ren *jpg *.jpg#
  11. for /f "tokens=*" %%a in ('dir *.jpg# /b') do (
  12.   set /a k+=1
  13.   set name=%o%!k!
  14.   ren "%%a" "0!name:~-%a:~9,1%!.jpg"
  15.   echo,0!name:~-%a:~9,1%!
  16. )
复制代码


[ 本帖最后由 523066680 于 2009-7-26 15:29 编辑 ]
作者: slore    时间: 2009-7-26 14:43

ren *.jpg *.jpg#


这个有慢,还不符合逻辑。

我们要从命名10个文件为1~10.jpg

如果原来是
0~9.jpg

我们要那样重命名,首先我们没有个要一一对应的想法吧。
只想目录里面是1~10.jpg罢了。

本身其实只要ren 0.jpg 10.jpg执行ren一次。

而上面的方式,首先ren 了10次为了避免冲突
然后又ren了10次到需要的文件名

1:20……的效率比。。。

所以批量重命名的代码现在要考虑的效率,而且思路也得转变。。。
就是冲突其实应该高兴,我们可以少ren一些。。。
重点是冲突文件名传入for后如何剔出。
作者: 523066680    时间: 2009-7-26 15:05

刚刚有想了一下
0 1 2 Ren 1 2 3的例子
主要问题是,假如已经存在,将错就错
出现的状况之一是:  0 to 1  而 1 存在  跳过  所以0这个文件应当特别处理

临时的打算是用Call ~  一个 x 从已知数累加,到可以为止

--------------------------------------------------------------------------
呼 这样不行……

[ 本帖最后由 523066680 于 2009-7-26 15:17 编辑 ]




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