[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 如何将每个目录随机10张图片移动到另一目录(保持原目录结构)?

本帖最后由 odrsun 于 2017-1-18 23:29 编辑

如何将所有目录下(含子目录)的图片文件,每个目录随机10张图片移动到另一目录(保持原目录结构)?

如题,E盘《图片》目录下,有《A》《B》《C》。。。等子目录,每个目录中均有数量不等的jpg图片,且所有的jpg图片不重名,想实现的功能:
运行一次批处理,就在《图片》目录下所有子目录中,每个目录随机挑选10个文件(不足10张的就全部算进去),移动到E盘《已选择图片》目录下,并保持相应目录结构(如,原来文件路径是E:\图片\A\A01.jpg,移动之后是E:\已选择图片\A\A01.jpg;原来文件路径是E:\图片\C\C01.jpg,移动之后是E:\已选择图片\C\C01.jpg,等等)
感谢热心关注,期待指教。
------------------------------------
和这个帖子有点类似,但是有不同的地方:http://www.bathome.net/thread-39700-1-4.html

  1. @set "srcDir=R:\Downloads"            && rem 来源
  2. @set "desDir=R:\Downloads2"           && rem 目标
  3. @set "maxNum=3"                       && rem 最大文件数量
  4. @echo off
  5. title 随机文件拷贝工具
  6. setlocal enabledelayedexpansion
  7. rem 获取图片列表
  8. for /f "delims=?" %%b in ('dir /a/b/s "%srcDir%\*.jpg" "%srcDir%\*.jpeg" "%srcDir%\*.png"') do (
  9.   set/a n+=1
  10.   set "#F!n!=%%~b"
  11. )
  12. rem 生成随机数
  13. if %n% LEQ %maxNum% (
  14.   echo 图片小于 %maxNum% 张!程序即将退出。
  15.   pause
  16.   goto :eof
  17. )
  18. :loop
  19.   set/a rnd=!random! %% !n! + 1  
  20.   if not defined #R%rnd% (
  21.     set/a #R%rnd%=%rnd%
  22.     set/a n2+=1
  23.   )
  24.   if !n2! LSS %maxNum% goto :loop
  25. echo ^> 预览结果
  26. echo 来源:%srcDir%
  27. echo 目标:%desDir%
  28. echo 数量:%maxNum%
  29. echo 随机选择复制文件预览列表如下:
  30. for /f "tokens=1,* delims==" %%a in ('set #R') do (
  31.   set "#F2%%b=!#F%%b:%srcDir%=%desDir%!"
  32.   echo   !#F2%%b!
  33. )
  34. set/p p=按任意键开始执行复制操作… <nul & pause>nul
  35. echo.& echo.
  36. echo ^> 执行复制操作
  37. for /f "tokens=1,* delims==" %%a in ('set #R') do (
  38.   echo !#F2%%b!
  39.   for /f "delims=?" %%c in ('echo,!#F2%%b!') do (
  40.     if not exist "%%~dpc" md "%%~dpc"
  41.     copy /v /y /z "!#F%%b!" "%%~dpc"
  42.   )
  43. )
  44. set/p p=完成。按任意键退出本程序… <nul & pause>nul
  45. echo.& echo.
复制代码
  1. > 预览结果
  2. 来源:R:\Downloads
  3. 目标:R:\Downloads2
  4. 数量:3
  5. 随机选择复制文件预览列表如下:
  6.   R:\Downloads2\1 2\nature13.jpg
  7.   R:\Downloads2\3\11.png
  8.   R:\Downloads2\4 5 6\pexels-photo.png
  9. 按任意键开始执行复制操作…
  10. > 执行复制操作
  11. R:\Downloads2\1 2\nature13.jpg
  12. 100% 已复制 已复制         1 个文件。
  13. R:\Downloads2\3\11.png
  14. 100% 已复制 已复制         1 个文件。
  15. R:\Downloads2\4 5 6\pexels-photo.png
  16. 100% 已复制 已复制         1 个文件。
  17. 完成。按任意键退出本程序…
复制代码
1

评分人数

『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

  1. @echo off
  2. for /d /r E:\图片 %%i in (*) do (
  3.         setlocal enabledelayedexpansion
  4.         set "fd=%%i"
  5.         set "fd=!fd:E:\图片=E:\新图片!"
  6.         for %%j in ("%%i\*.jpg") do set /a n+=1 & set "_!Random!_!n!=%%j"
  7.         (for /f "tokens=1*delims==" %%j in ( 'set _' ) do (
  8.                 set /a m+=1
  9.                 if !m! LEQ 10 ( md "!fd!" & copy "%%k" "!fd!\" )
  10.         ))2>nul
  11.         endlocal
  12. )
  13. pause
复制代码
1

评分人数

TOP

本帖最后由 WHY 于 2017-1-20 11:37 编辑

PowerShell
  1. $SrcDir = 'E:\图片'
  2. $DstDir = 'E:\新图片'
  3. $num = 10
  4. $reg = [regex]::Escape($SrcDir);
  5. dir -Path $SrcDir -Include *.jpg -Recurse | Group { $_.DirectoryName } | %{
  6.         $fd = $_.Name -replace $reg, $DstDir;
  7.         if (![IO.Directory]::Exists($fd)) { [void][IO.Directory]::CreateDirectory($fd) }
  8.         $_.Group | Get-Random -Count $num | Copy -Dest $fd -Force
  9. }
复制代码

TOP

粗暴点的:
对整个文件夹复制副本改名为 已选择图片 (这样就能轻松保持目录结构了哇
再挨个子目录随机删除,直到剩下10张图片为止
如果图片数量 <= 10 ,不处理

如果图片量特别大,那就在数据结构中模拟一次然后实际执行复制。
1

评分人数

TOP

回复 7# odrsun

子目录也是10张吗?这样复制太多了。如果有个目录一张图都没有怎么办?有的目录只有1张怎么复制?

TOP

有不同的地方。回复 5# happy886rr

TOP

不太一样,把ABC,,,,等等众多的目录底下复制10张图到  已选的目录底下,且路径也保持不变。

TOP

回复 4# odrsun
具体有啥区别啊,你的问题就是直接复制的,我没看到区别。
请描述清楚你的问题,难道你的目录也跟他的一样吗?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b /s "*.jpg"') do ( set /a N+=1)
  4. for /f "delims=" %%i in ('dir /a-d /b /s "*.jpg"') do (
  5. set /a RN=!random!%%!N!+1
  6. if not defined #!RN! (set "#!RN!=%%i")
  7. )
  8. for /f "tokens=2 delims==" %%i in ('set #') do (
  9. xcopy "%%i" "E:\已选择图片%%~pi"
  10. del /f /q "%%i"
  11. set /a i+=1
  12. if !i! equ 10 (goto end)
  13. )
  14. :end
  15. echo 执行完毕!
  16. pause>nul
复制代码
1

评分人数

TOP

好吧。我错了。现在 有人帮忙解答下吗回复 3# GNU

TOP

为什么你会觉得晚上11点半到早上9点之间要有人给你写代码呢

TOP

为什么没人回答

TOP

返回列表