Board logo

标题: 去掉文件名称前的特定字符 [打印本页]

作者: 9527     时间: 2006-12-7 04:12    标题: 去掉文件名称前的特定字符

这个是我在GOOGLE组上看到的,顺便发到这里供大家学习,虽然局限性很大,不过可以看看。

主要是去掉文件名前的0

处理前:
0000001.txt    00000010.txt   00000011.txt
00000012.txt   00000013.txt   00000014.txt   00000015.txt   00000016.txt
00000017.txt   00000018.txt   00000019.txt   0000002.txt    00000020.txt
0000003.txt    0000004.txt    0000005.txt    0000006.txt    0000007.txt
0000008.txt    0000009.txt   

处理后:
1.txt      10.txt     11.txt     12.txt     13.txt
14.txt     15.txt     16.txt     17.txt     18.txt     19.txt     2.txt
20.txt     3.txt      4.txt      5.txt      6.txt      7.txt      8.txt
9.txt
@echo off
for /f "delims=" %%a in ('dir/b *.txt') do call :next %%a
echo Finish...
goto :eof
:next
set pp=%1
:loop
if %pp:~0,1%==0 set pp=%pp:~1%& goto :loop
ren %1 %pp%

作者: ccwan     时间: 2006-12-7 04:29
9527兄涉猎很广啊!学习了。
作者: redtek     时间: 2006-12-7 08:20
欣赏~~
作者: youxi01     时间: 2006-12-7 08:42
如果名字纯粹是楼主所示(类型),貌似还可以利用数字的特性来处理开头的"00....."简化代码:
@echo off
for /f "delims=" %%i in ('dir/b *.txt') do (
echo 正在处理.......
set /a name=%%~ni+0
call ren "%%i" "%%name%%%%~xi"
)
echo 处理完毕
pause

作者: redtek     时间: 2006-12-7 09:10
欣赏youxi01兄非常巧妙的方法~:)

太巧合啦,SET /A 居然把这么多的0前缀的 00000020 当成了以0开头的8进制数字了,结果8进制的20正好是10进制的16~:)
C:\TEMP\file>set /a 00000020
16
意外的是那个 00000020.txt 被 SET /A 由 SET认为的8进制转成了10进制的  16.txt 了~:)
不过这只是意外:)


欣赏youxi01兄好玩的实现方法~:)
作者: 不得不爱     时间: 2006-12-7 09:50
4楼的如果遇到00000018.txt   00000019.txt就会无法处理了
作者: 不得不爱     时间: 2006-12-7 09:55

@echo off
for /f "delims=" %%i in ('dir/b *.txt') do (
echo 正在处理.......
set /a name=1%%~ni%%100000
call ren "%%i" "%%name%%%%~xi"
)
echo 处理完毕
pause
作者: namejm     时间: 2006-12-7 10:26
  set /a 的方法要么受进制的影响容易出错,要么就是难以得知首位0的个数从而不易通过在首位添1再减的方式来求出结果,还是通过探测首位是否为0来决定是否继续抛弃首位的一个0这种方法比较具备通用性。
作者: youxi01     时间: 2006-12-7 11:42
不好意思,忘记了进制的问题,自己比较粗心(冲动)的性格还是没有改变啊!namejm的说法不错,不过这个问题也不是没有解决的,看看下面的代码还存在什么的问题(解决了进制的问题):
@echo off & echo 正在处理.......
for /f "delims=" %%i in ('dir/b *.txt') do (
    set /a name=2%%~ni-1%%~ni
    call set /a name=1%%~ni-%%name%%
    call rename "%%i" "%%name%%%%~xi"
)
echo 处理完毕
pause

作者: 3742668     时间: 2006-12-7 11:47

@echo off
    for /f "delims=0 tokens=*" %%i in ('dir /b *.txt') do echo %%i
    pause>nul
goto :eof
未测试。
作者: pengfei     时间: 2006-12-7 11:57


  Quote:
Originally posted by redtek at 2006-12-7 09:10:
欣赏youxi01兄非常巧妙的方法~:)

太巧合啦,SET /A 居然把这么多的0前缀的 00000020 当成了以0开头的8进制数字了,结果8进制的20正好是10进制皠...

这种取位循环去零法的确很爽, 通用各种情况. 在批处理处理浮点数中也屡试不爽.

关于进制出错的问题, 以前也有过讨论.

http://www.cn-dos.net/forum/viewthread.php?tid=22951&fpage=1&highlight=

[ Last edited by pengfei on 2006-12-7 at 01:09 PM ]
作者: youxi01     时间: 2006-12-7 12:40
第9楼测试结果:
测试前:
F:\test 的目录

2006-12-06  23:33    <DIR>          .
2006-12-06  23:33    <DIR>          ..
2006-10-26  23:13                17 NT-CMD.bat
2006-12-06  23:34                 2 0001.txt
2006-12-06  23:34                 2 0002.txt
2006-12-06  23:34                 2 0003.txt
2006-12-06  23:34                 2 0004.txt
2006-12-06  23:34                 2 0005.txt
2006-12-06  23:34                 2 0006.txt
2006-12-06  23:34                 2 0007.txt
2006-12-06  23:34                 2 0008.txt
2006-12-06  23:34                 2 0009.txt
2006-12-06  23:34                 2 00010.txt
2006-12-06  23:34                 2 00011.txt
2006-12-06  23:34                 2 00012.txt
2006-12-06  23:34                 2 00013.txt
2006-12-06  23:34                 2 00014.txt
2006-12-06  23:34                 2 00015.txt
2006-12-06  23:34                 2 00016.txt
2006-12-06  23:34                 2 00017.txt
2006-12-06  23:34                 2 00018.txt
2006-12-06  23:34                 2 00019.txt
2006-12-06  23:34                 2 00020.txt
2006-12-06  23:34                 2 00021.txt
2006-12-06  23:34                 2 00022.txt
2006-12-06  23:34                 2 00023.txt
2006-12-06  23:34                 2 00024.txt
2006-12-06  23:34                 2 00025.txt
2006-12-06  23:34                 2 00026.txt
2006-12-06  23:34                 2 00027.txt
2006-12-06  23:34                 2 00028.txt
2006-12-06  23:34                 2 00029.txt
2006-12-06  23:34                 2 00030.txt
2006-12-06  23:34                 2 00031.txt
2006-12-06  23:34                 2 00032.txt
2006-12-06  23:34                 2 00033.txt
2006-12-06  23:34                 2 00034.txt
2006-12-06  23:34                 2 00035.txt
2006-12-06  23:34                 2 00036.txt
2006-12-06  23:34                 2 00037.txt
2006-12-06  23:34                 2 00038.txt
2006-12-06  23:34                 2 00039.txt
2006-12-06  23:34                 2 00040.txt
2006-12-06  23:34                 2 00041.txt
2006-12-06  23:34                 2 00042.txt
2006-12-06  23:34                 2 00043.txt
2006-12-06  23:34                 2 00044.txt
2006-12-06  23:34                 2 00045.txt
2006-12-06  23:34                 2 00046.txt
2006-12-06  23:34                 2 00047.txt
2006-12-06  23:34                 2 00048.txt
2006-12-06  23:34                 2 00049.txt
2006-12-06  23:34                 2 00050.txt
              51 个文件            117 字节
               2 个目录 17,874,583,552 可用字节
测试后:
F:\test 的目录

2006-12-06  23:33    <DIR>          .
2006-12-06  23:33    <DIR>          ..
2006-12-06  23:38                 6 NT-CMD.bat
2006-12-06  23:34                 2 1.txt
2006-12-06  23:34                 2 2.txt
2006-12-06  23:34                 2 3.txt
2006-12-06  23:34                 2 4.txt
2006-12-06  23:34                 2 5.txt
2006-12-06  23:34                 2 6.txt
2006-12-06  23:34                 2 7.txt
2006-12-06  23:34                 2 8.txt
2006-12-06  23:34                 2 9.txt
2006-12-06  23:34                 2 10.txt
2006-12-06  23:34                 2 11.txt
2006-12-06  23:34                 2 12.txt
2006-12-06  23:34                 2 13.txt
2006-12-06  23:34                 2 14.txt
2006-12-06  23:34                 2 15.txt
2006-12-06  23:34                 2 16.txt
2006-12-06  23:34                 2 17.txt
2006-12-06  23:34                 2 18.txt
2006-12-06  23:34                 2 19.txt
2006-12-06  23:34                 2 20.txt
2006-12-06  23:34                 2 21.txt
2006-12-06  23:34                 2 22.txt
2006-12-06  23:34                 2 23.txt
2006-12-06  23:34                 2 24.txt
2006-12-06  23:34                 2 25.txt
2006-12-06  23:34                 2 26.txt
2006-12-06  23:34                 2 27.txt
2006-12-06  23:34                 2 28.txt
2006-12-06  23:34                 2 29.txt
2006-12-06  23:34                 2 30.txt
2006-12-06  23:34                 2 31.txt
2006-12-06  23:34                 2 32.txt
2006-12-06  23:34                 2 33.txt
2006-12-06  23:34                 2 34.txt
2006-12-06  23:34                 2 35.txt
2006-12-06  23:34                 2 36.txt
2006-12-06  23:34                 2 37.txt
2006-12-06  23:34                 2 38.txt
2006-12-06  23:34                 2 39.txt
2006-12-06  23:34                 2 40.txt
2006-12-06  23:34                 2 41.txt
2006-12-06  23:34                 2 42.txt
2006-12-06  23:34                 2 43.txt
2006-12-06  23:34                 2 44.txt
2006-12-06  23:34                 2 45.txt
2006-12-06  23:34                 2 46.txt
2006-12-06  23:34                 2 47.txt
2006-12-06  23:34                 2 48.txt
2006-12-06  23:34                 2 49.txt
2006-12-06  23:34                 2 50.txt
              51 个文件            106 字节
               2 个目录 17,874,583,552 可用字节
目前为止,没发现大的问题,成功解决进制的问题。
作者: namejm     时间: 2006-12-7 12:51
  youxi01 和 3742668 的代码有点出人意料,甚是精彩。
作者: pengfei     时间: 2006-12-7 12:54
3742668版主的爽, 直接用0作分隔符. 这种方法应该也可以通用, 妙哉...
作者: youxi01     时间: 2006-12-7 13:02
3742668版主的爽!!!斑竹应该多来逛逛,你的代码总是让人耳目一新啊!羡慕+学习!

[ Last edited by youxi01 on 2006-12-7 at 01:05 PM ]
作者: kennyfan     时间: 2006-12-7 13:49
呵呵.纯粹路过....学习一下!
作者: redtek     时间: 2006-12-7 22:00
3742668版主10楼方法真是绝妙~:)
欣赏~~~
作者: ccwan     时间: 2006-12-7 22:20
跟一下,确实很棒!
作者: 9527     时间: 2006-12-7 22:23
论坛最近很冷淡,希望各位多多努力...........
作者: redtek     时间: 2006-12-7 22:53
感谢9527兄的精彩贴子并介绍和引出了各种解题亮点~:)
希望论坛内容越来越丰富!每天都顶~:)
作者: 9527     时间: 2006-12-7 23:05
redtek兄哪里的话,有时间找我去玩儿...........
作者: uemuem     时间: 2006-12-7 23:17


  Quote:
Originally posted by 3742668 at 2006-12-7 11:47:
@echo off
    for /f "delims=0 tokens=*" %%i in ('dir /b *.txt') do echo %%i
    pause>nul
goto :eof
未测试。

一个字,绝