Board logo

标题: [文本处理] 如何将一个文件夹里的多个文件按指定数量依次移动到另一个文件夹里的多个子文件夹里 [打印本页]

作者: dan5262    时间: 2011-12-15 09:58     标题: 如何将一个文件夹里的多个文件按指定数量依次移动到另一个文件夹里的多个子文件夹里

本帖最后由 pcl_test 于 2016-11-12 10:06 编辑

描述一:A文件夹 和 B文件夹处于同一级.
A文件夹下有几千个文件, B文件夹下有M个子文件夹(子文件夹可能是空文件夹也可能不是空的)
怎样每次从A文件夹下提取1个文件到B文件夹下的一个子文件夹中,直到提取M次,每个文件夹中都提取到一个文件,完成一轮。

共提取N轮,实现M个子文件夹中都被提取进N个不同的文件.  提取前,手动输入N的值。

并不是一次提取N个,而是N次提取,每次提取一个。

------------------------------------------------------------------------------------------------------------------------------
举例: A文件夹中保证有足够的文件数.
若N值取3, 则
第一次从A文件夹中提取1个文件到B中的任一个子文件夹中,然后删除被提取过的这个文件.
第二次从A文件夹中提取1个文件到另一个子文件夹中,然后删除被提取过的这个文件.
........
第M次从A文件夹中提取1个文件到另一个子文件夹中,然后删除被提取过的这个文件.
至此完成一轮。然后开始第二轮提取,直到N轮完成。
------------------------------------------------------------------------------------------------------------------------------





描述二:我换个描述,最终的效果类似:从A文件夹中随机剪切N个文件到B文件夹的任一子文件夹中,直到每个子文件夹都被剪切到N个文件.

即,
第一次从A中剪切N个文件到B中的任一子文件夹,
第二次从A中剪切N个文件到B中的另一子文件夹,
直到每个子文件夹都被剪切到N个文件

A中文件数保证有足够文件数.



实现任一描述效果均可,两者效果差不多,都能实现一定随机效果。第一种描述是规律性随机 第二种描述是无序性随机。

tmplinshi 斑竹曾给我写了一个不随机的,如果能加上随机就是第二种描述了。大家参考,贴子见 http://www.bathome.net/thread-13428-1-1.html

谢谢大家。
作者: jellyhk    时间: 2011-12-15 10:37

本帖最后由 jellyhk 于 2011-12-15 10:40 编辑

不理解!
是从A文件夹下提取任意一个文件到b任意一个文件夹
第2次的时候是不是就不能提取文件到上面那个文件夹了?是不是说每个文件夹都要从A下提取一个文件过来!
----------另外文件是一样的吗?都是txt或其他?
---------A文件夹是固定叫A吗?B文件夹是叫B么》?
作者: BS0小陈    时间: 2011-12-15 11:06

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /ad /b /s B\*') do (
  4. set /a a+=1
  5. set !a!=%%a
  6. echo !a!=%%a
  7. )
  8. set /p n=请输入
  9. set /a aa=!n!*!a!
  10. for /f "delims=" %%a in ('dir /a-d /b /s A *.*') do (
  11. set /a b+=1
  12. set /a c+=1
  13. if "!c!" gtr "!a!" set c=1
  14. call :a "%%a"
  15. if "!b!"=="!aa!" pause&exit
  16. )
  17. :a
  18. move %1 "!%c:"=%!"
  19. goto :eof
复制代码
不知道这样子行不?
作者: dan5262    时间: 2011-12-15 20:41

不理解!
是从A文件夹下提取任意一个文件到b任意一个文件夹?
第2次的时候是不是就不能提取文件到上面那个 ...
jellyhk 发表于 2011-12-15 10:37



    不理解!
1.是从A文件夹下提取任意一个文件到b任意一个文件夹?
2.第2次的时候是不是就不能提取文件到上面那个文件夹了?是不是说每个文件夹都要从A下提取一个文件过来!
3.----------另外文件是一样的吗?都是txt或其他?
4.--------A文件夹是固定叫A吗?B文件夹是叫B么》?

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

1.是任意提取,也可以按名称排列,依次提取. 速度优先.
2.每从A中提取出一个就删除一个,以免提取到重复文件. 每个文件夹-每轮都要提取到一个文件,共提取N轮.  最终的结果是B中的每个文件夹都提取到N个文件.
3. 文件可能是一样的,也可能不一样.   有TXT HTML或 MHT
4.是固定的.  

谢谢.
作者: dan5262    时间: 2011-12-15 20:45

不知道这样子行不?
BS0小陈 发表于 2011-12-15 11:06



    谢谢.
用少量文件测试成功.

当A样本用10000个文件, B样本用200个子文件夹时,
输入N值后, 运行BAT,很久没有反应.
N取1也没反应.

XP 双核 2G

谢谢.
作者: jellyhk    时间: 2011-12-16 10:59

本帖最后由 jellyhk 于 2011-12-16 11:03 编辑

3楼!
1:为什么3楼的18行代码中的"!%c:"=%!"就变成文件夹了呢?
2:为什么要这么写呢?好象!%c%!也行为什么要多   “=
3:第10行的dir /a-d /b /s A *.*  不能写成dir /a-d /b /s A\*.*
作者: jellyhk    时间: 2011-12-16 11:10

本帖最后由 jellyhk 于 2011-12-16 11:12 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /ad /b /s B\*') do (
  4. set /a a+=1
  5. set !a!=%%a
  6. echo !a!=%%a
  7. )
  8. set /p n=请输入
  9. set /a aa=!n!*!a!
  10. for /f "delims=" %%a in ('dir /a-d /b /s A\*.*') do (
  11. set /a b+=1
  12. set /a c+=1
  13. if "!c!" gtr "!a!" set c=1
  14. call :a "%%a"
  15. if !b! == !n! pause&exit
  16. )
  17. :a
  18. move %1 "!%c:"=%!"
  19. goto :eof
复制代码
这样不知道行不!请看到6楼的问题会的帮忙解惑!
作者: dan5262    时间: 2011-12-16 11:21

谢谢,  测试没成功.  可能我的描述不清楚.

我换个描述,最终的效果类似:从A文件夹中随机剪切N个文件到B文件夹的任一子文件夹中,直到每个子文件夹都被剪切到N个文件.
作者: dan5262    时间: 2011-12-16 11:23

即,
第一次从A中剪切N个文件到B中的任一子文件夹,
第二次从A中剪切N个文件到B中的另一子文件夹,
直到每个子文件夹都被剪切到N个文件

A中文件数保证有足够文件数.
作者: HAT    时间: 2011-12-16 11:30

回复 9# dan5262


请把所有的问题描述更新到顶楼,一遍他人查看。
作者: slore    时间: 2011-12-16 11:52

不是说一次移动一个文件,现在又变成一次N个,虽然说最后结果是一样的。。。不知道LZ到底想要那样的过程。。。
作者: dan5262    时间: 2011-12-16 11:56

不是说一次移动一个文件,现在又变成一次N个,虽然说最后结果是一样的。。。不知道LZ到底想要那样的过程。。 ...
slore 发表于 2011-12-16 11:52



   
谢谢关注,实际上是一个效果,前一种描述是N轮, 即每次提取一个,提取N次。  后一种描述是一次随机提取N个。
作者: jellyhk    时间: 2011-12-16 12:18

例如A下有1.txt -10.txt
B下有文件夹a b c
set n=2
你现在的意思是:随便移动2个文件放到A\a,再把这2个文件删除吗?  把1.txt 2.txt放到A\a!
    并删除A\下的这2个文件?
再继续移动文件一直到A\下的没有文件?
作者: dan5262    时间: 2011-12-16 12:24

回复 13# jellyhk


    是的,剪切的意思。 如果不删除的话,下次就会提取到重复文件。

谢谢。
作者: jellyhk    时间: 2011-12-17 13:12

本帖最后由 jellyhk 于 2011-12-17 16:55 编辑

我郁闷!浪费了我8个小时终于搞定了!算来算去数字光错!头疼!
楼主你要这样的代码有什么用哦!貌似没什么吧!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p n=输入要复制的本数:
  4. set c=0
  5. for /f "delims=" %%a in ('dir /a-d /s /b a\*.*') do (set /a c+=1)
  6. set /a b=c-n
  7. :l
  8. for /f "delims=" %%a in ('dir /ad /s /b b\*') do (
  9.    set a=0
  10.    for /f "delims=" %%b in ('dir /a-d /s /b a\*.*') do (
  11.      set /a a+=1
  12.      if !a! gtr !b! move "%%b" "%%a"
  13.      if !a! == !c! set /a c-=n&set /a b-=n
  14. )
  15. )
  16. dir /a-d /s /b a\*.*
  17. if errorlevel == 1 (exit) else (goto l)
复制代码
=====================我简化了下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p n=输入要复制的本数:
  4. :l
  5. for /f "delims=" %%a in ('dir /ad /s /b b\*') do (
  6.    set a=0
  7.    for /f "delims=" %%b in ('dir /a-d /s /b a\*.*') do (
  8.      set /a a+=1
  9.      if !a! leq !n! move "%%b" "%%a"  
  10. )
  11. )
  12. dir /a-d /s /b a\*.*
  13. if errorlevel == 1 (exit) else (goto l)
复制代码

作者: jellyhk    时间: 2011-12-17 14:57     标题: [已解决]批处理文件替换变量为空怎么就变身为文件夹了?

这是题目http://bathome.net/thread-14993-1-1.html
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /ad /b /s B\*') do (
  4. set /a a+=1
  5. set !a!=%%a
  6. echo !a!=%%a
  7. )
  8. set /p n=请输入
  9. set /a aa=!n!*!a!
  10. for /f "delims=" %%a in ('dir /a-d /b /s A\*.*') do (
  11. set /a b+=1
  12. set /a c+=1
  13. if "!c!" gtr "!a!" set c=1
  14. call :a "%%a"
  15. if !b! == !n! pause&exit
  16. )
  17. :a
  18. move %1 "!%c:"=%!"
  19. goto :eof
复制代码
第18段!中的"!%c:"=%!"不懂!
我知道单独的“%c:"=%”这是把变量c里的"去掉!但是代码中外面加  !!  干什么?例外这代码怎么就成了目录了?
作者: canyuexiaolang    时间: 2011-12-17 15:49

!%c:"=%!
把%c%中的 " 替换成 %
作者: jellyhk    时间: 2011-12-17 16:47

回复 2# canyuexiaolang
错了吧!
作者: awk    时间: 2011-12-17 17:18

如果把@echo off删掉,执行过程中,18行如何显示?
作者: jellyhk    时间: 2011-12-18 10:02

回复 4# awk
他的执行结果就是dir /s /ad /b d\*  这个执行结果!只是他是1个1个用有点象for例如:
move 1.txt 1
move 2.txt a
作者: wc726842270    时间: 2011-12-18 11:22

可以说你不明白%的意义,在18行中%实际上比!要好(出于效率),但是%还有脱义的作用(也就是常说的转义),可以的话你可以试一下用%来代替!,看看结果
作者: Demon    时间: 2011-12-18 11:41

我是来围观楼上的。
作者: CrLf    时间: 2011-12-18 12:48

楼主可能对类似思路见得相对较少,所以有此一问。
第一个 for 先将所有目录名称赋给一个变量,变量名称是序号,序号每循环加 1,如果我没说清楚,那在第 7、8 两行间 set|more 一下就知道了。
看懂第一个 for 之后,代码的思路就很清晰了,只是引用序号对应的文件夹名而已。
第二个 for 其实其实也是同理,不过它只需引用 %%a 而不需要赋值给对应的序号。

%c:"=% 貌似写成 %c% 也可以,因为 %c% 本身就是纯数字,所以 !%c%! 的意思就是取 %c% 值对应的变量值(即第一个 for 中设置的文件夹名)




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