找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27942|回复: 11

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

[复制链接]
发表于 2017-1-18 23:25:35 | 显示全部楼层 |阅读模式
本帖最后由 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
 楼主| 发表于 2017-1-19 09:09:05 | 显示全部楼层
为什么没人回答
发表于 2017-1-19 09:32:25 | 显示全部楼层
为什么你会觉得晚上11点半到早上9点之间要有人给你写代码呢
 楼主| 发表于 2017-1-19 10:31:39 | 显示全部楼层
好吧。我错了。现在 有人帮忙解答下吗回复 3# GNU
发表于 2017-1-19 17:13:34 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1PB +6 收起 理由
523066680 + 6 乐于助人

查看全部评分

 楼主| 发表于 2017-1-19 17:32:33 | 显示全部楼层
不太一样,把ABC,,,,等等众多的目录底下复制10张图到  已选的目录底下,且路径也保持不变。
 楼主| 发表于 2017-1-19 17:34:28 | 显示全部楼层
有不同的地方。回复 5# happy886rr
发表于 2017-1-19 17:38:06 | 显示全部楼层
回复 7# odrsun

子目录也是10张吗?这样复制太多了。如果有个目录一张图都没有怎么办?有的目录只有1张怎么复制?
发表于 2017-1-19 18:00:15 | 显示全部楼层
粗暴点的:
对整个文件夹复制副本改名为 已选择图片 (这样就能轻松保持目录结构了哇
再挨个子目录随机删除,直到剩下10张图片为止
如果图片数量 <= 10 ,不处理

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

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 666

查看全部评分

发表于 2017-1-19 19:09:42 | 显示全部楼层
本帖最后由 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. }
复制代码
发表于 2017-1-19 19:10:04 | 显示全部楼层
  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
复制代码

评分

参与人数 1PB +6 收起 理由
523066680 + 6 乐于助人

查看全部评分

发表于 2017-1-19 20:19:21 | 显示全部楼层
  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. 完成。按任意键退出本程序…
复制代码

评分

参与人数 1PB +6 收起 理由
523066680 + 6 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 12:48 , Processed in 0.023792 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表