无忧启动论坛

标题: 用DOS批处理批量删除文件名指定位数字符 [打印本页]

作者: overcet6    时间: 2015-9-16 09:42
标题: 用DOS批处理批量删除文件名指定位数字符
本帖最后由 overcet6 于 2015-9-21 13:46 编辑

就比如:
150908_080703_1023_083012345678.u8k
150908_080706_1001_084012345678.u8k
150908_080710_1068_085012345678.u8k
150908_080729_1046_086012345678.u8k
我想删完后只剩下:
83012345678.u8k
84012345678.u8k
85012345678.u8k
86012345678.u8k

删除前面20位字符,虽然我也有软件可以做到,但是要处理的文件太多,觉得还是dos省心,速度快,

谢谢了!


+++++++++++++9月21日更新+++++++++++++++

谢谢楼下各位的不辞辛劳,可能是我原帖没表达清楚,
不知道大家有没有看清楚
这个要求不只是把文件名分成四份,去掉前三份即可,还要把第四部分的第一个字符也要去掉,一共是20位字符,

所有楼下各位只是完成了一步,还差一步,

我想要是我事先说明:只保留文件名最后11位,就不会造成这么多误会了,

不过我已经找到相关代码,谢谢各位了!!
作者: fuldho    时间: 2015-9-16 11:24
重命名?
作者: wang_966    时间: 2015-9-16 13:21
本帖最后由 wang_966 于 2015-9-16 13:52 编辑

假设 input.txt 内容如下列四行:
150908_080703_1023_083012345678.u8k
150908_080706_1001_084012345678.u8k
150908_080710_1068_085012345678.u8k
150908_080729_1046_086012345678.u8k

for /f %%f in (input.txt) do  for /f "tokens=1,2,3,4 delims=_" %%i in (%f%) do  move   %%i_%%j_%%k_%%l    %%l


for %%f in (*.u8k) do  for /f "tokens=1,2,3,4 delims=_" %%i in (%f%) do  move   %%i_%%j_%%k_%%l    %%l

______ 另一方法為:



如何利用 仿unix/linux命令 sed 一次替换文字中的 "某些相似性的字串" ==>
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=362520

假设 input.txt 内容如下列四行:
150908_080703_1023_083012345678.u8k
150908_080706_1001_084012345678.u8k
150908_080710_1068_085012345678.u8k
150908_080729_1046_086012345678.u8k


sed.exe -e "s/\(.*_\)\(.*\)/move   \1\2   \2/" < input.txt > ren_file.bat

执行  ren_file.bat 可完成改名


作者: overcet6    时间: 2015-9-16 14:20
wang_966 发表于 2015-9-16 13:21
假设 input.txt 内容如下列四行:
150908_080703_1023_083012345678.u8k
150908_080706_1001_084012345678 ...

谢谢,看来前一种不适合我,要是处理5000个文件,那代码里是不是要从1写到5000.,后面这个我试试看
作者: overcet6    时间: 2015-9-18 08:18
本帖最后由 overcet6 于 2015-9-18 08:22 编辑
fuldho 发表于 2015-9-16 11:24
重命名?


对的,就是想弄个傻瓜式的,一键改名
文件太多,用软件光导入就需要很长时间,当然我也会把文件名导出来,然后构造批处理,每行一个的那种,但还是嫌慢,重复性的劳动,每天要做好几次,所以来看看有没有简单点的办法
作者: overcet6    时间: 2015-9-19 08:38
本帖最后由 overcet6 于 2015-9-19 08:40 编辑
wang_966 发表于 2015-9-16 13:21
假设 input.txt 内容如下列四行:
150908_080703_1023_083012345678.u8k
150908_080706_1001_084012345678 ...


这个第一种方法我试了,在代码前加上土著007说的那一行,然后保存成cmd文件,放在存放要处理文件的文件夹,双击执行,没反应,我用的是xp系统,

上一个回复之所以说5000行,是因为我看到代码里有“tokens=1,2,3,4”,不知道这是什么意思,因为你举例就是四行,所以我以为如果要是5000行,就要tokens=1,2,3,4,,到5000来。
作者: 土著007    时间: 2015-9-19 09:26
本帖最后由 土著007 于 2015-9-19 10:05 编辑
overcet6 发表于 2015-9-19 08:38
这个第一种方法我试了,在代码前加上土著007说的那一行,然后保存成cmd文件,放在存放要处理文件的文件 ...

哦,我仔细看了下二楼的,发现确实有错,我修改的如下,请保存为cmd文件执行,已在win10下测试通过:
@echo off
for /f "tokens=1,2,3,4* delims=_" %%i in ('dir /b *.u8k') do move %%i_%%j_%%k_%%l %%l

作者: 土著007    时间: 2015-9-19 09:30
overcet6 发表于 2015-9-19 08:38
这个第一种方法我试了,在代码前加上土著007说的那一行,然后保存成cmd文件,放在存放要处理文件的文件 ...

是根据文件名特点,用“_"作为分隔符,将文件名拆分成四个变量,第四个变量就是你需要的最终文件名
作者: overcet6    时间: 2015-9-19 09:42
本帖最后由 overcet6 于 2015-9-19 09:59 编辑
土著007 发表于 2015-9-19 09:26
哦,我仔细看了下二楼的,发现确实有错,我修改的如下,请保存为cmd文件执行,已在win10下测试通过:
...


这个是对了,完美!!还是批处理速度快,

作者: wang_966    时间: 2015-9-19 21:03
本帖最后由 wang_966 于 2015-9-19 21:07 编辑
overcet6 发表于 2015-9-19 09:42
这个是对了,完美!!还是批处理速度快,

第一种方式:
for %%f in (*.u8k) do  for /f "tokens=1,2,3,4 delims=_" %%i in (%f%) do  move   %%i_%%j_%%k_%%l    %%l
我忘了说明须编辑 *.BAT 再执行, 因为 %%f 适用在 *.BAT, 而 %f 是直接在 DOS 下命令.
利用 "_" 将字串切成4份, 其值分别存入 %%i, %%j, %%k, %%l

至于第二种方式比第一种方式更有弹性, 因为Unix/Linux原本的强项便是字串处理,
如果每一行并不一定有3个 "_", 则仍可正常执行,
利用 "\(.*_\)" 及 "\(.*\)" 将字串切成2份, 其值分别存入 \1, \2

如何利用 仿unix/linux命令 sed 一次替换文字中的 "某些相似性的字串" ==>
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=362520

假设 input.txt 内容如下列四行:
1509_08_080703_1023_083012345678.u8k
150_90080706_1001_084012345678.u8k
15090080710_1068_085012345678.u8k
150908080721046_086012345678.u8k

sed.exe -e "s/\(.*_\)\(.*\)/move   \1\2   \2/" < input.txt > ren_file.bat

执行  ren_file.bat 可完成改名

作者: nttwqz    时间: 2015-9-19 22:00
for /f "delims=_ tokens=1-4" %%a in ('dir /b *.u8k') do ren %%a_%%b_%%c_%%d %%d
作者: overcet6    时间: 2015-9-21 13:41
问题已解决,谢谢各位了




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3