[20170425]实现磁盘文件与U盘同步.txt-阿里云开发者社区

开发者社区> 开发与运维> 正文

[20170425]实现磁盘文件与U盘同步.txt

简介: [20170425]实现磁盘文件与U盘同步.txt --//工作需要实现磁盘文件与U盘同步,也就是每天下班前拷贝磁盘文件到U盘,而回到家再需要U盘文件拷贝到本地磁盘,如此反复。

[20170425]实现磁盘文件与U盘同步.txt

--//工作需要实现磁盘文件与U盘同步,也就是每天下班前拷贝磁盘文件到U盘,而回到家再需要U盘文件拷贝到本地磁盘,如此反复。
--//随着文件越来越多,里面都是很小的文本文件,每次拷贝非常浪费时间,从以前几分钟到现在将近1X分钟,越来越慢。

--//我以前的脚本核心内容大致如下:
--// 说明 U:表示U盘, H:
--//in.bat U盘到本地磁盘
xcopy /d/e/y U:\blog\*.*  h:\blog

--//out.bat 本地磁盘到U盘
xcopy /d/e/y h:\blog\*.* U:\blog\*.*

--//实际上这样仅仅修改更新的文件才覆盖,真正拷贝的文件不是很多,随着里面文件增加,磁盘与U盘对比浪费许多时间,越来越慢。
--//于是开始考虑别的解决方法:
--//许多站点提到了robocopy,我看了一下不是很合适。

--//找到如下链接:
blog.csdn.net/kk185800961/article/details/42194327

--//不过竟然使用xcopy  /EXCLUDE的排他模式,显然这样不是很科学,正常选择拷贝文件就OK了。
--//里面提到了无法使用+在forfiles。实际上+支持日期模式:

R:\>forfiles  /?
...

示例:
    FORFILES /?
    FORFILES
    FORFILES /P C:\WINDOWS /S /M DNS*.*
    FORFILES /S /M *.txt /C "cmd /c type @file | more"
    FORFILES /P C:\ /S /M *.bat
    FORFILES /D -30 /M *.exe
             /C "cmd /c echo @path 0x09 在 30 前就被更改。"
    FORFILES /D 2001/01/01
             /C "cmd /c echo @fname 在 2001年1月1日就是新的。"
    FORFILES /D +2017/4/25 /C "cmd /c echo @fname 今天是新的。"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    FORFILES /M *.exe /D +1
    FORFILES /S /M *.doc /C "cmd /c echo @fsize"
    FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

--//注意看下划线以及日期格式。
--//有了这些知识,就有了前面2篇blog,windows批处理脚本真麻烦。
http://blog.itpub.net/267265/viewspace-2137952/
http://blog.itpub.net/267265/viewspace-2137957/

--//inx.bat U盘到本地磁盘
echo @echo on > d:\usb.bat
sleep 1
echo echo  start sync file from usb >> d:\usb.bat
sleep 1
echo h: >> d:\usb.bat
sleep 1
echo cd \blog >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat

rem xcopy /d/e/y *.* h:\blog\*.*
forfiles /p "U:\blog" /m * /s /d  +2017/04/24 /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat
rem forfiles /p "o:\blog" /m * /s /d  +%date:~0,10% /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat

sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
sleep 1
echo echo end sync >> d:\usb.bat
sleep 1
echo pause >> d:\usb.bat
pause
call d:\usb.bat

--//生成xcopy命令前加入管道,是因为如果是新文件目的地没有windows会提示是目录还是文件,正常选择F,于是前面有了echo F。
--//另外为了输出| ,前面必须加一个转义符号^.昏,微软的批处理脚本语言真混乱。
--//如果输出到文件usb.bat的时间不适合可以自己改,我不想再写了。

--//outx.bat 本地磁盘到U盘
echo @echo on > d:\usb.bat
sleep 1
echo echo  start sync file to usb >> d:\usb.bat
sleep 1
echo U: >> d:\usb.bat
sleep 1
echo cd \blog >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat

rem xcopy /d/e/y *.* h:\blog\*.*
sleep 1
forfiles /p "h:\blog" /m * /s /d  +%date:~0,10% /c "cmd /c if @isdir==FALSE echo echo F ^|  xcopy /d/e/y @path @relpath" >> d:\usb.bat

sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
sleep 1
echo echo end sync >> d:\usb.bat
sleep 1
echo pause >> d:\usb.bat
pause
call d:\usb.bat

--//这样U盘拷贝到磁盘稍微慢一点,基本也在3-4分钟解决问题。磁盘到U盘很快,基本1-2分钟。

--//还有一些疑问windows脚本如何获取前一天的日期,不知道如何实现替换+%date:~0,10%
--//linux下可以使用
$  date --date='1 days ago' "+%Y/%m/%d"
2017/04/24

--//linux bash shell可以通过变量写入,而windows批处理如何把命令的结果传递给变量呢?我想到仅仅是先将命令结果保存到文件,
--//在通过文件传递给变量。 不熟悉windows放弃!!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章