Board logo

标题: [文件操作] 求助批处理robocopy镜像30天内的文件和文件夹 [打印本页]

作者: onging    时间: 2024-9-7 13:43     标题: 求助批处理robocopy镜像30天内的文件和文件夹

我做的是这种:
  1. robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /maxage:30
复制代码
但我做的不精确的,几个月前的也镜像了,麻烦大佬们完善一下,谢谢!
作者: 77七    时间: 2024-9-7 15:36

http://bbs.bathome.net/redirect. ... =6283&pid=40646
作者: Five66    时间: 2024-9-7 15:37

”几个月前的也镜像了“ , 举个例子?
作者: onging    时间: 2024-9-7 15:50

”几个月前的也镜像了“ , 举个例子?
Five66 发表于 2024-9-7 15:37

意思是我要30天的文件镜像,但是我的这段代码却30天外的也镜像过来了,不知道那里有问题?
作者: Five66    时间: 2024-9-7 23:16

回复 4# onging


    请给个实际的例子,到底哪个30天外的也镜像过来了,该不会你看错或者搞错了吧?最好附上图
作者: ppll2030    时间: 2024-9-8 01:47

回复 1# onging


    可以试试把参数 mir 改成 s ,其意为 复制子目录,但不包含空文件夹,结果应该就符合你的要求了。

因为 mir 是镜像完整的目录树。而 maxage 是限制文件的,所以你的结果超出30天应该都是些空文件夹,而文件实际应该是符合要求的。

由于 maxage 限制了30天的文件,所以不符合条件的文件会被视为不存在,这些文件的文件夹都成空文件夹了,自然也被 /s 自动过滤了。

留下的就只有符合条件的文件和文件夹了。
作者: onging    时间: 2024-9-9 09:19

回复 6# ppll2030
可以是可以,但文件夹却不会镜像了,mir就可以
作者: ppll2030    时间: 2024-9-9 14:04

回复 7# onging

不会镜像是什么意思??不是复制备份吗?
作者: onging    时间: 2024-9-9 19:06

回复 8# ppll2030
镜像跟复制备份好像不一样吧,镜像是比较快的
作者: 77七    时间: 2024-9-9 22:56

不妨先明确下 楼主需要的是修改时间还是创建时间?robocopy 又指的是什么时间?
作者: Five66    时间: 2024-9-9 23:13

回复 10# 77七


    看7楼回复,大概就是文件夹创建时间是30天以前的,但是文件夹里面的文件创建时间是30天之内的,楼主想要不复制文件夹就复制里面的文件
作者: 77七    时间: 2024-9-10 00:34

回复 11# Five66


   看不明白,7楼回复的6楼
  1. /MIR :: 镜像目录树(等同于 /E 和 /PURGE)。
复制代码


/mir 更改 为 /s  ,不知道怎么就 “可以”了...难道改为 /e /purge /maxage:30 保留空文件夹,就完全符合要求了?但是它是等同于1楼代码的,所以还是 “时间” 未明确的问题。
1楼所说的多出了一些文件,应该是30天前创建,30天内修改过的,/maxage:30 包括了这部分文件。
作者: onging    时间: 2024-9-10 10:03

回复 5# Five66
把6月份的都镜像过来了,现在以经9月了,而且有些是空文件夹,有些里面还有文件
我看了一些教程,镜像是比复制备份快的吧?

作者: onging    时间: 2024-9-10 10:04

回复 12# 77七
把6月份的都镜像过来了,现在以经9月了,而且有些是空文件夹,有些里面还有文件
我看了一些教程,镜像是比复制备份快的吧?

作者: ppll2030    时间: 2024-9-10 10:57

回复 13# onging


    镜像就是1:1备份啊,
参数"/mir"的作用等同于"/purge /e","/purge"表示清理目标文件夹内有而源文件夹里没有的文件和文件夹
如果你需要这个清理功能。那就保留你的/mir 然后再加一个 /S吧,去除空文件夹就好了

另/mir 对于备份到同一个目标文件夹,相同的文件会对其时间戳比对,日期一样就不会再次复制。
这个可能是你认为的速度快的一方面,但是如果每次都是新建目标文件夹备份,那就没有速度快这一说了:lol
作者: 77七    时间: 2024-9-10 11:00

回复 14# onging


   测试 /mir 日志
  1.       选项: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30
复制代码

测试 /e /purge 日志
  1.       选项: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /R:1000000 /W:30
复制代码

它们实际执行是相同的。

如果以楼主的文件夹命名方式(创建日期?),备份名称为30天内的文件夹,要利用 robocopy 的多线程速度优势,可以先用for筛选出符合条件的文件夹,再单个robocopy。
作者: ppll2030    时间: 2024-9-10 11:21

回复 15# ppll2030


    在补充一点,/maxage 的时间限制,只是针对为即将要备份的文件,
目标文件夹内已经存在的文件,比如6月份备份的,再次/mir ,只要源文件夹还有,目标文件夹也不会清除。
这就是所谓的镜像,/mir 你有我也有 ,你不要我也不要。
你有新的但我只要一部分,那就加码提要求 /maxage /minage /s  
作者: onging    时间: 2024-9-10 15:50

回复 16# 77七
这个不用创建日期,能把代码写全吗
作者: onging    时间: 2024-9-10 16:03

回复 17# ppll2030
怎么跟我那段连接起来使用呢
作者: ppll2030    时间: 2024-9-10 17:09

回复 19# onging


    看题不认真。那是相当累的啊 15楼都告诉你了。在你的命令后面再添加 /s 的参数即可。
作者: 77七    时间: 2024-9-10 18:05

回复 18# onging


  
  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. for %%a in (0.s 30.e) do (
  5. for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
  6. set %%~xa=%%i
  7. )
  8. )
  9. for /f "delims=" %%d in ('dir /b /ad ^| findstr /rxc:"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]"') do (
  10. if "%%d" geq "%.s%" (
  11. if "%%d" leq "%.e%" (
  12. robocopy "%%d" "G:\新建文件夹\%%d" /mir
  13. )
  14. )
  15. )
  16. pause
复制代码

作者: onging    时间: 2024-9-10 18:11

回复 20# ppll2030
robocopy D:\新建文件夹\新建文件夹 D:\新建文件夹+ /mir /s /PURGE /maxage:30
是这样写吗,但还是有很多空白文件夹,如下图:

作者: onging    时间: 2024-9-10 18:13

回复  onging
77七 发表于 2024-9-10 18:05

目标文件是“G:\新建文件夹”这里吧,原文件夹在那里填入呢?
作者: 77七    时间: 2024-9-10 18:16

回复 23# onging


   第3行
  1. cd /d "D:\新建文件夹\新建文件夹"
复制代码

作者: onging    时间: 2024-9-10 18:28

回复 24# 77七
不好意思,又不支持目录

作者: 77七    时间: 2024-9-10 19:10

本帖最后由 77七 于 2024-9-10 22:08 编辑

回复 25# onging


   
试试通过robocopy /create 达到映射效果,再比较后从源目录复制

  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. set fd_from=d:\新建文件夹
  5. set fd_to=g:\新建文件夹
  6. set fd_tmp=f.f
  7. robocopy "%fd_from%" "%fd_tmp%" /create /lev:2 /e
  8. for %%a in (0.s 30.e) do (
  9.         for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
  10.                 set %%~xa=%%i
  11.         )
  12. )
  13. pushd "%fd_tmp%"
  14. for /f "delims=" %%d in ('dir /b /ad ^| findstr /rxc:"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]"') do (
  15.         if "%%d" geq "%.s%" (
  16.                 if "%%d" leq "%.e%" (
  17.                         robocopy "%fd_from%\%%d" "%fd_to%\%%d" /mir
  18.                 )
  19.         )
  20. )
  21. popd
  22. rem rd /s /q "%fd_tmp%"
  23. pause
复制代码
代码错误,此楼和21楼,我把开始日期和截止日期写反了,参考28楼大佬写的。
作者: ppll2030    时间: 2024-9-10 20:50

回复 22# onging


    /mir 已经包含 /purge了。命令行不需要再添加了。
许多空文件夹的存在,你要先去看看,源文件夹是不是也有。
mir的清理功能,只能删除是源文件夹上没有,而目标文件夹还存在的。不是根据时间限制来清理的。
mir最终是达到1:1备份,/maxage 只能限制文件,对文件夹无效, /s 针对文件夹,复制包括子文件夹,但不复制空文件夹

综上,你的情况和目的到现在都没有表达清除。我只能靠猜测了
首先,你要是在空白的新目标文件夹下备份,就用下面的命令即可。这个时候,存在的文件和文件夹都是30天内的。
  1. robocopy "d:\源文件夹"  "e:\目标文件夹" /mir /s /maxage:30
复制代码
然后,如果你是在旧的备份目标文件夹下再次备份,那就需要多一条命令。用于清除过时的空文件夹。
当然,这个目标文件夹下除了上面的30天内的文件和文件夹,可能还存在一些过时的文件和非空文件夹,比如6月的,这个就是源文件夹下依然存在,所以/mir 给与保留的。
  1. @echo off
  2. set "fd=e:\目标文件夹"
  3. for /f "delims=" %%d in ('dir /b /s /ad "%fd%" ^| sort /r') do rd "%%d"
  4. pause
复制代码

作者: flashercs    时间: 2024-9-10 21:48

回复 25# onging

批处理脚本位于共享文件夹中是无法cd 到 脚本所在目录的.
  1. @echo off
  2. rem 保存为ansi编码
  3. @REM cd /d "%~dp0" & REM 共享文件夹不支持 cd 切换当前路径
  4. echo CD="%cd%"
  5. @REM 镜像来源文件夹
  6. set fd_from=\\pgy8\F
  7. @REM 镜像目标文件夹
  8. set fd_to=G:\新建文件夹
  9. for %%a in (0.e 30.s) do (
  10. for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
  11. set %%~xa=%%i
  12. )
  13. )
  14. for /f "delims=" %%d in ('dir /b /ad "%fd_from%\*" ^| findstr /rxc:"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]"') do (
  15. if "%%d" geq "%.s%" (
  16. if "%%d" leq "%.e%" (
  17. robocopy "%fd_from%\%%d" "%fd_to%\%%d" /S /PURGE
  18. )
  19. )
  20. )
  21. pause
复制代码
用 /S /PURGE代替/MIR
作者: aloha20200628    时间: 2024-9-10 23:24

本帖最后由 aloha20200628 于 2024-9-10 23:30 编辑

回复 1# onging

有必要澄清一下采用 /mir 完成镜像备份的基本含义 》
   运行
   robocopy D:\源文件夹 D:\目标文件夹 /mir
   的结果
是确保 ‘目标文件夹(或称 ‘到达文件夹’ 或 ‘目的地文件夹’)与源文件夹的结构及内容完全相同’,其运行结果还会 ‘删除目标文件夹存在但源文件夹不存在的内容(目录和文件)’,其中参数 /mir 的作用等同于组合参数 /purge /e,这是采用 /mir 完成两个文件夹之间镜像备份的真正含义,因此,额外附加参数 /maxage 或 /minage 对于镜像备份的操作均无意义...

作者: Five66    时间: 2024-9-11 02:36

啊,你这6月份的是上次或者上上次或者上上上次镜像得来的吧
最简单办法:镜像前清空目标文件夹所有?
作者: onging    时间: 2024-9-11 09:15

回复 28# flashercs
只会镜像源文件夹的文件夹,不会镜像源文件夹的文件,如图箭头所指的PDF文件

作者: onging    时间: 2024-9-11 09:32

回复 28# flashercs
谢谢!不想太复杂了,
robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
能在这段代码的基础上添加清空目标文件夹的空文件夹可以吗
或者清空目标文件夹的空文件夹怎么写的,越简单越好.
作者: onging    时间: 2024-9-11 09:33

回复 30# Five66
谢谢!不想太复杂了,
robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
能在这段代码的基础上添加清空目标文件夹的空文件夹可以吗
或者清空目标文件夹的空文件夹怎么写的,越简单越好.
作者: onging    时间: 2024-9-11 09:33

回复 29# aloha20200628
谢谢!不想太复杂了,
robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
能在这段代码的基础上添加清空目标文件夹的空文件夹可以吗
或者清空目标文件夹的空文件夹怎么写的,越简单越好.
作者: onging    时间: 2024-9-11 09:34

回复 27# ppll2030
谢谢!不想太复杂了,
robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
能在这段代码的基础上添加清空目标文件夹的空文件夹可以吗
或者清空目标文件夹的空文件夹怎么写的,越简单越好.
作者: ppll2030    时间: 2024-9-11 10:33

本帖最后由 ppll2030 于 2024-9-11 10:41 编辑

回复 35# onging


    27楼不是已经都给出了吗?保存为bat文件,需要的时候运行一下就好了。
第一条备份30天文件和文件夹(不含空文件夹)到目标文件夹,第二条去除目标文件夹内所有空的文件夹。
  1. robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
  2. for /f "delims=" %d in ('dir /b /s /ad "G:\新建文件夹" ^| sort /r') do @rd "%d" 2>nul
复制代码
这个是在cmd窗口下执行就可以了。
作者: onging    时间: 2024-9-11 11:36

回复 26# 77七
谢谢!不想太复杂了,
robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
能在这段代码的基础上添加清空目标文件夹的空文件夹可以吗
或者清空目标文件夹的空文件夹怎么写的,越简单越好.
作者: 77七    时间: 2024-9-11 12:17

不必要重复回复,你回的大家都能看到。
主要是你说不清楚你需要的是什么?写出来可能是白写,再加之我水平太有限。
  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. set fd_from=d:\新建文件夹
  5. set fd_to=g:\新建文件夹
  6. for %%a in (0 30) do (
  7. for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%a) -uformat "%%Y-%%m-%%d""') do (
  8. robocopy "%fd_from%\%%i" "%fd_to%\%%i" /s
  9. )
  10. )
  11. robocopy "%fd_from%" "%fd_to%" /maxage:30
  12. pause
复制代码

复制 目录名(创建日期?)在30天内的目录。
复制 fd_from下(不包含子目录 )文件修改时间在30天内的文件。
这样写的不伦不类的
作者: aloha20200628    时间: 2024-9-11 12:22

本帖最后由 aloha20200628 于 2024-9-11 12:38 编辑

回复 34# onging

根据 robocopy 用法细则的一些最简单的正确示例如下

   1. 复制 ‘源文件夹’ 的全部内容(目录结构+文件)自然也包括空目录,无视其中的数据寿命(maxage/minage),还会删除 ‘目的地文件夹’ 存在但 ‘源文件夹’ 不存在的内容》
         robocopy d:\源文件夹 e:\目的地文件夹 /mir
   2. 复制 ‘源文件夹’ 的全部内容(即包含空目录)》
         robocopy d:\源文件夹 e:\目的地文件夹 /e
   3. 复制 ‘源文件夹’ 中排除空目录以外的全部内容》
         robocopy d:\源文件夹 e:\目的地文件夹 /s
   4. 复制 ‘源文件夹’ 中符合指定寿命条件(maxage/minage)的全部内容》
         robocopy d:\源文件夹 e:\目的地文件夹 /maxage:30

试过 robocopy d:\源文件夹 e:\目的地文件夹 /s /maxage:30 的用法吗?
楼主的混合用法 ... /mir /maxage:30 ... 是先要整鸡,后要鸡腿 ... 叫 robocopy 犯晕去吧

作者: onging    时间: 2024-9-13 09:00

本帖最后由 onging 于 2024-9-13 09:04 编辑

回复 39# aloha20200628
robocopy d:\源文件夹 e:\目的地文件夹 /s /maxage:30
上面这条感觉好一点,但还是有很多空文件夹,
36楼给的去除目标文件夹内所有空的文件夹: for /f "delims=" %d in ('dir /b /s /ad "G:\新建文件夹" ^| sort /r') do @rd "%d" 2>nul
这段代码不起作用呢
红框里面的都是空文件夹

作者: onging    时间: 2024-9-13 09:02

本帖最后由 onging 于 2024-9-13 09:03 编辑

回复 36# ppll2030
第二条去除目标文件夹内所有空的文件夹不起作用呢?
红框里面的都是空文件夹

作者: aloha20200628    时间: 2024-9-13 10:13

回复 40# onging

你确认这些 ‘空文件夹’ 没有隐藏文件吗?否则 robocopy ... /s ... 这种 ‘仅复制非空目录’ 的标定用法就丢大脸了...

作者: onging    时间: 2024-9-13 16:58

回复 42# aloha20200628
今天发现S还是不是我想要的,要想的是MIR的效果,MIR再加空文件夹即可
空文件夹确实有隐藏的文件,不知道这个文件是怎么生成的
如图
作者: ppll2030    时间: 2024-9-14 09:07

回复 41# onging


    删不掉表示文件夹非空。你找到了隐藏文件,是图片缓存文件,删除它不影响实际应用。那就在删除空文件夹之前,多加一条命令。先删除之再删除空文件夹即可。
  1. for /f "delims=" %i in ('dir /b /s /ahs-d "G:\新建文件夹" ^| findstr /ic:"thumbs.db"') do @del /ahs "%i"
复制代码





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