标题: [文件操作] 求助批处理robocopy镜像30天内的文件和文件夹 [打印本页]
作者: onging 时间: 2024-9-7 13:43 标题: 求助批处理robocopy镜像30天内的文件和文件夹
我做的是这种:- 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楼
- /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 日志- 选项: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30
复制代码
测试 /e /purge 日志
- 选项: *.* /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
- @echo off
- rem 保存为ansi编码
- cd /d "%~dp0"
- for %%a in (0.s 30.e) do (
- for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
- set %%~xa=%%i
- )
- )
- 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 (
- if "%%d" geq "%.s%" (
- if "%%d" leq "%.e%" (
- robocopy "%%d" "G:\新建文件夹\%%d" /mir
- )
- )
- )
- 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行复制代码
作者: onging 时间: 2024-9-10 18:28
回复 24# 77七
不好意思,又不支持目录
作者: 77七 时间: 2024-9-10 19:10
本帖最后由 77七 于 2024-9-10 22:08 编辑
回复 25# onging
试试通过robocopy /create 达到映射效果,再比较后从源目录复制
- @echo off
- rem 保存为ansi编码
- cd /d "%~dp0"
-
- set fd_from=d:\新建文件夹
- set fd_to=g:\新建文件夹
- set fd_tmp=f.f
-
- robocopy "%fd_from%" "%fd_tmp%" /create /lev:2 /e
- for %%a in (0.s 30.e) do (
- for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
- set %%~xa=%%i
- )
- )
- pushd "%fd_tmp%"
- 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 (
- if "%%d" geq "%.s%" (
- if "%%d" leq "%.e%" (
- robocopy "%fd_from%\%%d" "%fd_to%\%%d" /mir
- )
- )
- )
- popd
- rem rd /s /q "%fd_tmp%"
- pause
复制代码
代码错误,此楼和21楼,我把开始日期和截止日期写反了,参考28楼大佬写的。
作者: ppll2030 时间: 2024-9-10 20:50
回复 22# onging
/mir 已经包含 /purge了。命令行不需要再添加了。
许多空文件夹的存在,你要先去看看,源文件夹是不是也有。
mir的清理功能,只能删除是源文件夹上没有,而目标文件夹还存在的。不是根据时间限制来清理的。
mir最终是达到1:1备份,/maxage 只能限制文件,对文件夹无效, /s 针对文件夹,复制包括子文件夹,但不复制空文件夹
综上,你的情况和目的到现在都没有表达清除。我只能靠猜测了
首先,你要是在空白的新目标文件夹下备份,就用下面的命令即可。这个时候,存在的文件和文件夹都是30天内的。- robocopy "d:\源文件夹" "e:\目标文件夹" /mir /s /maxage:30
复制代码
然后,如果你是在旧的备份目标文件夹下再次备份,那就需要多一条命令。用于清除过时的空文件夹。
当然,这个目标文件夹下除了上面的30天内的文件和文件夹,可能还存在一些过时的文件和非空文件夹,比如6月的,这个就是源文件夹下依然存在,所以/mir 给与保留的。- @echo off
- set "fd=e:\目标文件夹"
- for /f "delims=" %%d in ('dir /b /s /ad "%fd%" ^| sort /r') do rd "%%d"
- pause
复制代码
作者: flashercs 时间: 2024-9-10 21:48
回复 25# onging
批处理脚本位于共享文件夹中是无法cd 到 脚本所在目录的.- @echo off
- rem 保存为ansi编码
- @REM cd /d "%~dp0" & REM 共享文件夹不支持 cd 切换当前路径
- echo CD="%cd%"
-
- @REM 镜像来源文件夹
- set fd_from=\\pgy8\F
- @REM 镜像目标文件夹
- set fd_to=G:\新建文件夹
-
- for %%a in (0.e 30.s) do (
- for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
- set %%~xa=%%i
- )
- )
-
- 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 (
- if "%%d" geq "%.s%" (
- if "%%d" leq "%.e%" (
- robocopy "%fd_from%\%%d" "%fd_to%\%%d" /S /PURGE
- )
- )
- )
- 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天文件和文件夹(不含空文件夹)到目标文件夹,第二条去除目标文件夹内所有空的文件夹。- robocopy D:\新建文件夹\新建文件夹 G:\新建文件夹 /mir /s /maxage:30
- 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
不必要重复回复,你回的大家都能看到。
主要是你说不清楚你需要的是什么?写出来可能是白写,再加之我水平太有限。
- @echo off
- rem 保存为ansi编码
- cd /d "%~dp0"
- set fd_from=d:\新建文件夹
- set fd_to=g:\新建文件夹
- for %%a in (0 30) do (
- for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%a) -uformat "%%Y-%%m-%%d""') do (
- robocopy "%fd_from%\%%i" "%fd_to%\%%i" /s
- )
- )
- robocopy "%fd_from%" "%fd_to%" /maxage:30
- 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
删不掉表示文件夹非空。你找到了隐藏文件,是图片缓存文件,删除它不影响实际应用。那就在删除空文件夹之前,多加一条命令。先删除之再删除空文件夹即可。- for /f "delims=" %i in ('dir /b /s /ahs-d "G:\新建文件夹" ^| findstr /ic:"thumbs.db"') do @del /ahs "%i"
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |