脚本实现自动同步文件到百度云
标签:其他

脚本实现自动同步文件到百度云

1. 起源

一开始的想法是想着我的博客能自动备份在云端就好了,最开始我想的是用git,但我发现了一个问题,不知道我的东西太多了还是目录结构太复杂了,总是不能完全的同步上去。这就促使我的找一个新的方法来保存我的博客到云端。

这里先给出hexo如果更换了电脑怎么实现重建,来源一个知乎问题:使用hexo,如果换了电脑怎么更新博客?

1、从官网Git下载git,在新电脑上安装,因为https速度慢,而且每次都要输入口令,常用的是使用ssh。使用下面方法创建:

(1)打开git bash,在用户主目录下运行:ssh-keygen -t rsa -C "youremail@example.com" 把其中的邮件地址换成自己的邮件地址,然后一路回车

(2)最后完成后,会在用户主目录下生成.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH key密钥对,id_rsa是私钥,千万不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

(3)登陆GitHub,打开「Settings」->「SSH and GPG keys」,然后点击「new SSH key」,填上任意Title,在Key文本框里粘贴公钥id_rsa.pub文件的内容(千万不要粘贴成私钥了!),最后点击「Add SSH Key」,你就应该看到已经添加的Key。 注意:不要在git版本库中运行ssh,然后又将它提交,这样就把密码泄露出去了。

2、下载Node.js,并安装

3、打开git bash客户端,输入 npm install hexo-cli -g,开始安装hexo

4、下面就将原来的文件拷贝到新电脑中,但是要注意哪些文件是必须的,哪些文件是可以删除的。

(1)讨论下哪些文件是必须拷贝的:首先是之前自己修改的文件,像站点配置_config.yml,theme文件夹里面的主题,以及source里面自己写的博客文件,这些肯定要拷贝的。除此之外,还有三个文件需要有,就是scaffolds文件夹(文章的模板)、package.json(说明使用哪些包)和.gitignore(限定在提交的时候哪些文件可以忽略)。其实,这三个文件不是我们修改的,所以即使丢失了,也没有关系,我们可以建立一个新的文件夹,然后在里面执行hexo init,就会生成这三个文件,我们只需要将它们拷贝过来使用即可。总结:_config.ymltheme/source/scaffolds/package.json.gitignore,是需要拷贝的。

(2)再讨论下哪些文件是不必拷贝的,或者说可以删除的:首先是.git文件,无论是在站点根目录下,还是主题目录下的.git文件,都可以删掉。然后是文件夹node_modules(在用npm install会重新生成),public(这个在用hexo g时会重新生成),.deploy_git文件夹(在使用hexo d时也会重新生成),db.json文件。其实上面这些文件也就是.gitignore文件里面记载的可以忽略的内容。总结:.git/node_modules/public/.deploy_git/db.json文件需要删除。

5、在git bash中切换目录到新拷贝的文件夹里,使用 npm install 命令,进行模块安装。很明显我们这里没用hexo init初始化,因为有的文件我们已经拷贝生成过来了,所以不必用hexo init去整体初始化,如果不慎在此时用了hexo init,则站点的配置文件_config.yml里面内容会被清空使用默认值,所以这一步一定要慎重,不要用hexo init。 _

6、安装其他的一些必要组件,如果在node_modules里面有的,就不要重复安装了:

(1)为了使用hexo d来部署到git上,需要安装 npm install hexo-deployer-git --save

(2)为了建立RSS订阅,需要安装 npm install hexo-generator-feed --save

(3)为了建立站点地图,需要安装 npm install hexo-generator-sitemap --save 插件安装后,有的需要对配置文件_config.yml进行配置,具体怎么配置,可以参考上面插件在github主页上的具体说明

7、使用hexo g,然后使用hexo d进行部署,如果都没有出错,就转移成功了!

2. 尝试

这里用的GitHub上的一个python脚本实现的上传,给出仓库:houtianze/bypy

Step 1: 安装pip

由于我电脑原来已经已经安装过python环境并使用过pip,这里我直接给我一个参考的链接 安装pip最简单的方法

Step 2:安装bypy

pip install requests
pip install bypy

Step 3:授权登录

>>>bypy info # 输入 bypy info
Please visit:   # 访问下边这个连接,复制授权码
https://openapi.baidu.com/oauth/2.0/authorize?scope=basic+netdisk&redirect_uri=oob&response_type=code&client_id=q8WE4EpCsau1oS0MplgMKNBn
And authorize this app
Paste the Authorization Code here within 10 minutes.
Press [Enter] when you are done    # 提示在下边粘贴授权码

在下边图示位置粘贴授权码,耐心等待一会即可(1-2分钟)

Press [Enter] when you are done
a288f3d775fa905a6911692a0808f6a8
Authorizing, please be patient, it may take upto None seconds...
Authorizing/refreshing with the OpenShift server ...
OpenShift server failed, authorizing/refreshing with the xx server ...
Successfully authorized
Quota: 2.015TB
Used: 740.493GB

授权成功。

Step 4 bypy测试

通过上面的步骤就可以实现文件的上传了,可以使用 bypy upload <path> 试试,不过只能上传到百度云的我的应用数据下的bypy目录下,如果你只是使用上面这个命令的话,传上去在一个大的目录下,很乱。

Step 5 自己写脚本优化上传

由于上传上去只是在同一级目录下,所以我这里新建一个本地本分的文件夹 H:\Backup 这样我不仅可以实现本地备份还可以保证上传上去的不会很乱,而且会按照我Backup目录下的路径放好

先给出目录结构:

核心就两个文件copy.bat 和mystart.bat,注意增加的功能就是可以每次只更新修改的文件,对于没修改的文件,不再通过bypy联网查找,提高效率。可以通过文件最近的修改时间和上次更新的时间来判断是否要对文件再做更新,后面去学习一下git判断新文件的方式,有可能是通过hash计算。对于第一次更新,建议先将同步的文件复制到Backup中,使用bypy的自带的命令更新就好。

mystart.bat

cd C:\MyFile\Blog
xcopy C:\MyFile\Blog\source\_posts\*.* H:\Backup\Blog\source\_posts /E /H /Y 
:xcopy C:\MyFile\Blog\scaffolds\*.* H:\Backup\Blog\scaffolds /E /H /Y 
:copy C:\MyFile\Blog\_config.yml H:\Backup\Blog  /Y 

H:
cd H:\Backup
:本地备份路径
set "dst_dir=H:\Backup\Blog\source\_posts"
set "C_a=H:\Backup\time.txt" 

for /f "tokens=* delims=" %%i in ('dir /s /b %dst_dir%') do (
   call copy.bat "%%i" "%C_a%"
)

echo %date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% >> time.txt
:echo %date:~0,4%/%date:~5,2%/%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% >> log.txt
:echo ========================================================>>log.txt
echo UpDate OK
pause

:c_t
for /f "skip=4 tokens=1,2" %%a in ('dir /tw "!!%~1!!"')do (
set %~1_t=%%a %%b&exit/b:c_t)

前面有三种语法,分别是复制相应的文件夹到指定的备份文件夹,复制相应的文件到指定的文件夹,前面加 : 表示取消从该文件夹复制,对于不经常变动的文件夹,建议注释掉。

copy.bat

@echo off&setlocal enabledelayedexpansion
:设置检测文件路径
set "S_a=%1"

:设置时间路径
set "C_a=%2" 

call :c_t S_a&call :c_t C_a

echo %S_a% 
:echo %C_a%
set S_a_t=%~t1
set C_a_t=%~t2
if "%S_a_t%"  Gtr "%C_a_t%" (
  @echo !S_a:~10!>>log.txt
  @echo 文件修改时间为:%S_a_t%>>log.txt
  @echo 上次更新时间为:%C_a_t%>>log.txt
  set ss=!S_a:~11!
  set ss=!ss:"=!
  call :up %S_a% "!ss:\=/!"
  @echo %date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% !S_a:~10!  Upload OK>>log.txt
  @echo =================================================================>>log.txt
)

:c_t
for /f "skip=4 tokens=1,2" %%a in ('dir /tw "!!%~1!!"')do (
set %~1_t=%%a %%b&exit/b:c_t)

:up
bypy upload %1 %2 --processes 5 

log.txt

日志文件,记录最近更新的文件,运行脚本自动建立

time.txt

更新时间记录文件,自动建立

写脚本主要困惑点在对于文件名包含特殊字符如空格等,在传参的时候,会被拆分成多个参数,导致失败。最后查询相关文档解决。

Step 6:设置开机启动脚本

C:\ProgramData\「开始」菜单\Programs\StartUp文件夹下新建一个bat脚本,这里命名为mystart.bat 去调用我在备份文件夹下的mystart.bat,注意上面的文件夹可能会打不开,更改相应的控制权限才能打开

@ECHO OFF

@call H:\Backup\mystart.bat

Step 7:

完成上面的这些步骤,每次开机就可以对上次操作的文件进行联网更新,保证文件不丢:sunglasses:

  • 9 min read

CONTRIBUTORS


  • 9 min read