Board logo

标题: [讨论]文件分类的问题。 [打印本页]

作者: yefeng2651     时间: 2008-10-9 17:46    标题: [讨论]文件分类的问题。

问题:

一目录下 有 N个jpg,现在想按文件名第一个_前四位数 建立文件夹 并将相应的jpg移动到对应的目录里去,即0001_*.jpg 到0001目录下、0002_*.jpg 到0002目录下

0001_0000_0000.jpg
0001_0000_0001.jpg
……
0002_0000_0000.jpg
0002_0000_0001.jpg
……

俺的答案:

@echo off
for /f "delims=_" %%i in ('dir /a-d /b *.jpg') do md %%i & move %%i_*.jpg %%i

问题如下:

E:\000>list3.cmd
E:\000\0001_0000_0000.jpg
E:\000\0001_0000_0001.jpg
子目录或文件 0001 已经存在。
存在一个重名文件,或是找不到文件。
子目录或文件 0001 已经存在。
存在一个重名文件,或是找不到文件。
E:\000\0002_0000_0000.jpg
E:\000\0002_0000_0001.jpg
子目录或文件 0002 已经存在。
存在一个重名文件,或是找不到文件。
子目录或文件 0002 已经存在。
存在一个重名文件,或是找不到文件。

E:\000>

可以看到有重复的行为。浪费资源。 请大家讨论。
作者: yefeng2651     时间: 2008-10-9 17:49
HAT 版 回复:

@echo off
for /f "delims=_" %%i in ('dir /a-d /b *.jpg') do (
  if not exist %%i (
    md %%i
    move %%i_*.jpg %%i
  )
)

很完美的解决问题。

E:\000>list.cmd
E:\000\0001_0000_0000.jpg
E:\000\0001_0000_0001.jpg

E:\000>

ps:在dos命令行下 这个怎么打哦?
作者: yefeng2651     时间: 2008-10-9 17:54
buddiyar兄:

@echo off
for /f "delims=_" %%i in ('dir /a-d /b *.jpg') do (move %%i_*.jpg %%i || md %%i && move %%i_*.jpg %%i)

好强大的脑袋啊,怎么想的??

不过美中不足,有点问题,如下:


E:\000>list2.cmd

E:\000>for /F "delims=_" %i in ('dir /a-d /b *.jpg') do (move %i_*
.jpg %i   || md %i   && move %i_*.jpg %i )

E:\000>(move 0001_*.jpg 0001   || md 0001   && move 0001_*.jpg 000
1 )
无法将多个文件移动到单个文件中。
E:\000\0001_0000_0000.jpg
E:\000\0001_0000_0001.jpg

E:\000>(move 0001_*.jpg 0001   || md 0001   && move 0001_*.jpg 000
1 )
存在一个重名文件,或是找不到文件。
子目录或文件 0001 已经存在。

E:\000>(move 0001_*.jpg 0001   || md 0001   && move 0001_*.jpg 000
1 )
存在一个重名文件,或是找不到文件。
子目录或文件 0001 已经存在。

E:\000>(move 0001_*.jpg 0001   || md 0001   && move 0001_*.jpg 000
1 )
存在一个重名文件,或是找不到文件。
子目录或文件 0001 已经存在。



E:\000\0002_0000_0000.jpg
E:\000\0002_0000_0001.jpg

E:\000>(move 0002_*.jpg 0002   || md 0002   && move 0002_*.jpg 000
2 )
存在一个重名文件,或是找不到文件。
子目录或文件 0002 已经存在。

E:\000>(move 0002_*.jpg 0002   || md 0002   && move 0002_*.jpg 000
2 )
存在一个重名文件,或是找不到文件。
子目录或文件 0002 已经存在。

E:\000>


------------

不知如何解决!
作者: yefeng2651     时间: 2008-10-9 17:56
最后谢谢各位帮助我的,及群里的各位听我唠叨的。
留下痕迹,以助后来者 :)
作者: Vampire     时间: 2008-10-9 17:56
纯DOS好象FOR就支持环境变量的读取...........
作者: buddiyar     时间: 2008-10-9 18:37
E:\000>(move 0001_*.jpg 0001   || md 0001   && move 0001_*.jpg 000
1 )
无法将多个文件移动到单个文件中。
E:\000\0001_0000_0000.jpg
E:\000\0001_0000_0001.jpg

这个错误提示很奇怪啊 我不理解 那个单个文件 是什么东西  怎么来的?
作者: HAT     时间: 2008-10-9 20:00    标题: Re 3楼

这样可以么?
@echo off
for /f "delims=_" %%i in ('dir /a-d /b *.jpg') do (move %%i_*.jpg %%i 2>nul|| md %%i && move %%i_*.jpg %%i)

作者: yefeng2651     时间: 2008-10-10 14:51


  Quote:
Originally posted by buddiyar at 2008-10-9 18:37:
E:\000>(move 0001_*.jpg 0001   || md 0001   && move 0001_*.jpg 000
1 )
无法将多个文件移动到单个文件中。
E:\000\0001_0000_0000.jpg
E:\000\0001_0000_0001.jpg

这个错 ...

换成

@echo off
for /f "delims=_" %%i in ('dir /a-d /b *.jpg') do (@echo %%i_*.jpg %%i || md %%i && move %%i_*.jpg %%i)

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

E:\000>list2.cmd
0000_*.jpg 0000
0000_*.jpg 0000
0000_*.jpg 0000
0000_*.jpg 0000
0001_*.jpg 0001
0001_*.jpg 0001
0001_*.jpg 0001
0001_*.jpg 0001

E:\000>


————————

之前 我也出现过这个问题,是因为 do 后加了 括号的问题

我的理解是 可以不能识别*的缘故,等高人指点! :)

[ Last edited by yefeng2651 on 2008-10-10 at 15:20 ]
作者: yefeng2651     时间: 2008-10-10 14:54


  Quote:
Originally posted by HAT at 2008-10-9 20:00:
这样可以么?
@echo off
for /f "delims=_" %%i in ('dir /a-d /b *.jpg') do (move %%i_*.jpg %%i 2>nul|| md %%i && move %%i_*.jpg %%i)

出现的是这个:


E:\000>list4.cmd
E:\000\0000_0000.jpg
E:\000\0000_0001.jpg
E:\000\0000_0002.jpg
E:\000\0000_0003.jpg
子目录或文件 0000 已经存在。
子目录或文件 0000 已经存在。
子目录或文件 0000 已经存在。
E:\000\0001_0000.jpg
E:\000\0001_0001.jpg
E:\000\0001_0002.jpg
E:\000\0001_0003.jpg
子目录或文件 0001 已经存在。
子目录或文件 0001 已经存在。
子目录或文件 0001 已经存在。
E:\000\0002_0000.jpg
E:\000\0002_0001.jpg
E:\000\0002_0002.jpg
E:\000\0002_0003.jpg
子目录或文件 0002 已经存在。
子目录或文件 0002 已经存在。
子目录或文件 0002 已经存在。

E:\000>
作者: tireless     时间: 2008-10-10 16:13

@echo off
for /f "delims=_" %%a in ('dir /b *.jpg') do (
     if not exist %%a md %%a
     if exist %%a_*.jpg move /y %%a_*.jpg %%a>nul
)
[ Last edited by tireless on 2008-10-10 at 17:38 ]
作者: huahua0919     时间: 2008-10-10 16:24

@echo off
for /f "tokens=1* delims=_" %%i in ('dir/b/a-d *.jpg') do (
md %%i >nul 2>nul
move /y "%%i_%%j" %%i
)

作者: yefeng2651     时间: 2008-10-10 17:48


  Quote:
Originally posted by tireless at 2008-10-10 16:13:
@echo off
for /f "delims=_" %%a in ('dir /b *.jpg') do (
     if not exist %%a md %%a
     if exist %%a_*.jpg move /y %%a_*.jpg %%a>nul
)
[ Last edited by tireless ...

呵呵,兄弟改得可真快,不过, /y 加与不加都没有关系的。没有出错的问题。

  Quote:
Originally posted by huahua0919 at 2008-10-10 16:24:
@echo off
for /f "tokens=1* delims=_" %%i in ('dir/b/a-d *.jpg') do (
md %%i >nul 2>nul
move /y "%%i_%%j" %%i
)

11楼的兄弟,你最狠,直接给屏蔽了。所以我也没有看到错误,不过可以肯定 一定有错误。只是我没看到 :P
作者: tireless     时间: 2008-10-10 18:40
 

[ Last edited by tireless on 2008-10-10 at 23:00 ]
作者: huahua0919     时间: 2008-10-10 18:48
什么叫错误?如果又错误那就是你文件下所有JPG文件的格式不是你所说的那样,如果要用exist来判断说效率最高,那用>2的效率不知道要比exist快多少倍!

你说呢?