前言
无论是在搭建自己的个人博客过程中还是平时的工作生活中,都会有文件备份的习惯,有些文件往往比较重要,需要经常性的打包备份一次。就我在搭建Hexo博客而言,每次都要清理public
文件夹后将文件进行打包备份,移动到其他文件夹或者网盘存储。每次重复性的,周期性的操作认为比较繁琐,因此想使用一个简单的脚本将重复繁琐的备份任务用一个命令解决。
开始吧~
什么是shell
shell简单的说就是我们使用的命令解释器,你打开的终端就是shell。你部署hexo博客就是用的Git bash,其中bash属于shell中的一种。
什么是shell脚本
我们打开终端(shell)敲下一行行命令,是只能一条一条的发送命令。我所理解的shell脚本就是,可以将bash中一条一条敲下的命令组合到一起,命令之间可以相互联系,最终依次全部执行的文件。而且这类文件是一类带有.sh
拓展名的文件。
- shell脚本如何编写?
使用vi
/vim
编辑器、VS code
、Notepad++
等其他编辑器,以shell scripts
的格式保存即可编写.sh
文件。
使用bash
中执行的命令都可以在shell
脚本中执行。
如需要深入了解shell
脚本可参考:shell教程。
- shell脚本如何运行?
- 可双击
.sh
文件直接运行 - 在脚本文件目录下运行
sh xx.sh
- 添加环境变量PATH,使你的脚本变成一个命令。
- 可双击
制作打包备份博客源代码的shell脚本
开始制作脚本之前,需要了解一下,在打包过程中,需要用到自己安装的压缩软件的打包命令。
我使用的是Bandizip软件,官网提供了软件相关的命令行代码,Bandizip命令行参数。其他软件可自行百度。此教程使用Bandizip示例。
使用vi
、vim
、VS code
等编辑器创建新文本,使用简单的命令组合制作脚本:
#!/bin/sh
# 用于打包备份blog文件
cd /c/Users/Sumsung524/Sumsung524.github.io # 定位到需要清理的位置
echo "已定位到目标文件夹"
hexo clean # 清理文件
echo "清理完成"
cd /c/Users/Sumsung524 # 定位到需要打包的位置
echo "已定位到打包位置"
bandizip.exe c -y $(date -d "today" +"%Y.%m.%d").zip Sumsung524.github.io
# 将Sumsung524.github.io文件夹打包,并以当天打包时间命名。
# c表示打包文件,-y表示:所有询问都为是若无错误发生,则在任务完成时关闭(解)压缩窗口
echo "打包完成"
mv $(date -d "today" +"%Y.%m.%d").zip /C/Users/Sumsung/OneDrive/MyBlog/Backup.zip
# 将生成的打包文件移动到备份文件夹中
echo "移动成功"
cd /c/Users/Sumsung524/Sumsung524.github.io
hexo generate # 回到原来的位置重新解析文件
echo "重新解析成功"
做好之后以.sh
拓展名保存到一个位置(你也可以直接不带任何拓展名,同样可以直接运行命令,甚至更加方便)。其中#!/bin/sh
代表是一个shell
脚本文件(这个没有关系不大),#
用于注释,echo
表示输出内容,可以不用。$(date -d "today" +"%Y.%m.%d").zip
表示打包当天的日期。
如果你认为代码太复杂可以简化为:
#!/bin/sh
cd /c/Users/Sumsung524/Sumsung524.github.io
hexo clean
cd /c/Users/Sumsung524
bandizip.exe c -y $(date -d "today" +"%Y.%m.%d").zip Sumsung524.github.io
mv $(date -d "today" +"%Y.%m.%d").zip /C/Users/Sumsung/OneDrive/MyBlog/Backup.zip
cd /c/Users/Sumsung524/Sumsung524.github.io
hexo generate
如果你需要在打包的时候需要对文件加上其他命名,可加入如下代码:
echo "输入文件名"
read file_name
bandizip.exe c -y $(date -d "today" +"%Y.%m.%d")"${file_name}".zip Sumsung524.github.io
mv *.zip /C/Users/Sumsung/OneDrive/MyBlog/Backup.zip
在这里添加了一个叫file_name
(名称自取)的变量,访问变量时,需要在变量名称之前添加“$”
,如“$ {变量}”
,将变量用“{}”
括起来。
将$(date -d "today" +"%Y.%m.%d").zip
改为*.zip
。会将所在目录下的所有zip
格式移动到目标目录。
这样做好之后,运行脚本的时候就需要你设置文件名:
当然如果不想加文件名的时候可以选择直接回车。效果和之前脚本一样。
添加PATH
做好脚本之后,测试一两次没有问题之后,我们将脚本保存到一个文件夹中,以便日后再用。但以后每次使用都要到脚本文件目录下执行脚本,要在前面输入很长一段的路径,很不方便。因此我们要找一个linux命令行在任意目录下启动任意的脚本的方法,就是给他添加一个PATH。
简单说PATH就是一组路径的字符串变量,当你输入的命令不带任何路径时,LINUX会在PATH记录的路径中查找该命令。
- PATH的作用就是每次在Bash里面输入一个命令时, Bash都会去PATH列表里面去找对应的文件,找到了就执行, 脚本其实就是一个可执行的文件(ls, cd, mkdir..)
- 可以输入命令echo $PATH查看所有的路径,Bash就会在这些路径中依次查找
- 临时设置PATH
pwd #查看下脚本所在的绝对路径
export PATH="脚本的绝对路径:$PATH" # 这句话就是将脚本所在的目录加到PATH里
上面的PATH在重启Bash后就会失效。
- 永久设置PATH
touch ~/.bashrc # 创建~/.bashrc
vi ~/.bashrc # 编辑~/.bashrc
在编辑器里写入 export PATH="local的绝对路径:$PATH"
source ~/.bashrc # 保存编辑,这句命令一定要写
zip # zip是我的脚本文件名,直接输入你的文件名即可直接运行脚本。
注意:
整个备份脚本文件已经做完了,以后可以轻松的使用一个自己自定义的命令(修改脚本文件名)即可完成文件备份了!在使用过程中有几个需要注意的点:
- 不要去改动备份目标文件夹路径中文件夹的名称,或者改动之后相应的脚本位置也需要统一改动。
- 打包目录下不能存放其他
zip
格式的文件,否则会全部移动到目标路径文件夹下。 - 可以将备份文件的目标路径设置为网盘的备份文件夹(OneDrive、百度网盘、天翼云等),从而实现双备份。
个人使用的是Onedrive网盘同步盘,将目标文件夹下备份打包好的文件,等网盘同步之后,使用释放空间功能,将打包的文件上传到网盘而不保留到本地,既释放了空间,也实现的文件的备份。目标文件夹只相当于一个临时存储区。
另外,如需系统学习shell脚本请下载:Linux命令行与shell脚本编程大全.第3版。
其他实例
上传Github做笔记备份
目的:新建命令gitbackup一键备份笔记,并根据日期提交git commit
操作:
新建文件gitbackup,VScode编辑命令,保存:
#!/bin/sh
# 定位到笔记文件路径下
cd ~/matery/source/_posts
git add *
# 提交备注日期时间
git commit -m "$(date -d "today" +"%Y.%m.%d")"
# 查看上传内容
git status
git push origin master
简化上传博客命令
自己的博客需要上传至腾讯托管和GitHub仓库
正常情况下需要清空、压缩、上传github、上传腾讯云
hexo cl && gulp && hexo d && tcb hosting deploy ~/matery/public -e sumsung-107420 && hexo cl
命令太长,想设置一个命令uploadblog
代替上一段命令
新建uploadblog
文件,写入命令并保存:
#!/bin/sh
# 定位路径
cd ~/matery/
# 清理
hexo clean
# 压缩代码
gulp
# 上传github
hexo d
# 上传腾讯云托管
tcb hosting deploy ~/matery/public -e sumsung-107420
# 清理
hexo cl