Board logo

标题: [文件操作] 【已解决】批处理怎样将N个文件夹里的文件平分? [打印本页]

作者: liziyunabcd    时间: 2019-9-26 18:48     标题: 【已解决】批处理怎样将N个文件夹里的文件平分?

本帖最后由 liziyunabcd 于 2019-10-6 13:46 编辑

假如:

   有五个文件夹(文件夹名分区为:1、2、3、4、5),每个文件夹里有N个文件(文件假如是.MP4,每个文件夹里的数量可能是几十到几万不等。)

   现在需求一个BAT:点一下BAT后,这五个文件夹里的文件都平均分到每个文件夹。

  然后每个文件夹里的文件就一样多(当然,可能文件不一定5的倍数,最后一点点分不平均也没事。)

  求大神出手。
作者: hlzj88    时间: 2019-9-26 23:09

http://www.bathome.net/thread-26027-1-1.html
你参考
作者: xczxczxcz    时间: 2019-9-29 12:33

so easy 既然是平均分配,若没有因重名文件被替换(或改名),最终结果是最多与最少只差一个文件或0个文件。
作者: liziyunabcd    时间: 2019-10-5 21:16

回复 3# xczxczxcz 大哥,能整一个代码出来么,我小白一个
作者: Batcher    时间: 2019-10-5 21:24

回复 1# liziyunabcd


    5个文件夹里面会不会存在同名文件?
作者: liziyunabcd    时间: 2019-10-5 21:54

回复 5# Batcher


    不会存在同名的文件,哇,老大来了!!!
作者: liziyunabcd    时间: 2019-10-5 22:08

回复 5# Batcher


    老大,我查了好久,都没找到这样的代码,这个问题是不是很刁钻?
作者: terse    时间: 2019-10-6 09:42

最直接的就是全部拿出来 然后再分回去
作者: Batcher    时间: 2019-10-6 10:41

回复 6# liziyunabcd


假设N个待处理的文件夹放在 C:\Test\待处理 目录下面
以下代码保存为 test.bat 放在 C:\Test 目录下面
执行代码之前注意做好文件备份
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "SourceFolder=C:\Test\待处理"
  4. set "StageFolder=C:\Test\临时中转"
  5. if not exist "%StageFolder%" (
  6.     md "%StageFolder%"
  7. )
  8. for /f "delims=" %%i in ('dir /b /s /a-d "%SourceFolder%"') do (
  9.     move /y "%%i" "%StageFolder%"
  10. )
  11. set FolderNum=0
  12. for /f "delims=" %%i in ('dir /b /ad "%SourceFolder%"') do (
  13.     set /a FolderNum+=1
  14.     set "_!FolderNum!=%SourceFolder%\%%i"
  15. )
  16. set FileIndex=0
  17. for %%i in ("%StageFolder%\*.*") do (
  18.     set /a FileIndex+=1
  19.     set /a FolderIndex=FileIndex%%FolderNum
  20.     if !FolderIndex! neq 0 (
  21.         call move /y "%%%%i" "%%_!FolderIndex!%%"
  22.     ) else (
  23.         call move /y "%%%%i" "%%_!FolderNum!%%"
  24.     )
  25. )
复制代码

作者: liziyunabcd    时间: 2019-10-6 13:45

回复 9# Batcher


    老大出手,太牛了,完美解决!!!

   膜拜老大!!
作者: terse    时间: 2019-10-6 15:13

把文件名存放在变量里 不知道文件多时怎么样
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /b/ad') do (
  3.      set /a_%%a=0,m+=1
  4.      set files=!files! %%a
  5.      for /f "delims=" %%b in ('dir /b/a-d "%%~fa\*.jpg"') do (
  6.           set /a _%%a+=1
  7.           set $%%a_!_%%a!=%%b
  8.      )
  9. )
  10. for %%a in (!files!) do set/a n+=_%%a
  11. set /a p=n/m,q=n%%p
  12. for %%a in (!files!) do (
  13.      if !q! gtr 0 (
  14.         set /a q-=1,#p_%%a=p+1
  15.      ) else set /a#p_%%a=p
  16.      if !_%%a!  lss !#p_%%a! (
  17.          set files=!files: %%a=!
  18.          set "$#=!$#!:%%a"
  19.      ) else  if !_%%a!  equ !#p_%%a!  set files=!files: %%a=!
  20. )
  21. if not "#!files: =!" == "#" for %%a in (!files!) do (
  22.      set /a i=_%%a - #p_%%a
  23.      for /l %%b in (1,1,!i!) do (
  24.           for /f "delims=:" %%c in ("!$#!") do (
  25.                if  !_%%c! geq !#p_%%c! (
  26.                    set "$#=!$#:*%%c:=!"
  27.                    for /f "delims=:" %%c in ("!$#!") do set "f=%%c"
  28.               ) else set "f=%%c"
  29.           )
  30.           for %%c in ("!f!") do  (
  31.                move "%%a\!$%%a_%%b!"   "%%~c\"
  32.                set /a _%%~c+=1
  33.           )
  34.      )
  35. )
  36. pause
复制代码





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