博客迁移:Shell脚本批量文件处理

最近我对全部文章链接(permalink)进行了又一次设计。 为了使得旧链接仍可訪问。须要把全部旧的URL重定向到新的URL。 由于本博客由Github Pages提供服务,HTTPserver和域名均不可配置,仅仅能通过旧的HTML重定向到新的HTML。

于是我须要为全部文章创建一个HTML文件用于重定向。

HTML提供了一种301重定向的方式:

<meta http-equiv="refresh" content="0; url=xxx">
<link rel="canonical" href="xxx" />

第一行是指示浏览器马上重定向。到URL:xxx。content指定了重定向之前显示当前页面的秒数。

第二行是给主流的搜索引擎看的,
详情请见: https://www.mattcutts.com/blog/canonical-link-tag/

比如文章2015-05-02-tex-note.md。其文件开头指定了分类信息:

---
layout: blog
categories: linux
...

这篇文章新的URL是/2015/05/02/tex-note.html,旧的URL是/linux/tex-note.html
我须要为它生成一个文件:/linux/tex-note.html来匹配旧的URL。其内容为:

<html>
<head lang="en">
  <meta http-equiv="refresh" content="0; url=/2015/05/02/tex-note.html">
  <link rel="canonical" href="/2015/05/02/tex-note.html" />
</head>
</html>

这样当用户訪问/linux/tex-note.html时,便能够重定向到/2015/05/02/tex-note了。

Bash提供了丰富的文件和字符串Builtin,同一时候借助Linux下的sedawk等字符串处理工具,
进行批量的文件处理实在不能再方便了。

比如,本站的全部缩略图是用Makefile批量更新的,參见:Makefile
批量更新缩略图

如今来一个脚本继续处理上述的问题吧。

for file in ./_posts/*
do
    # 遍历./_posts下的全部博客文章
    # 得到 file == ./_posts/2014-10-09-kiss.md

    fname=${file##.*/}
    # 删除最长前缀
    # 得到 fname == 2015-05-02-tex-note.md

    basename=${fname%%\.md}
    # 删除最长后缀
    # 得到 basename == 2015-05-02-tex-note

    urlname=${basename:11}
    # 从下标11開始的子字符串
    # 得到 urlname == tex-note

    layout=`sed -n ‘2p‘ $file | awk -F : ‘{print $2}‘`
    # 读取文章第二行:layout: blog
    # layout == blog

    layout="$(echo -e "${layout}" | sed -e ‘s/\s//g‘)"
    # 去除layout中的空白字符

    if [ "$layout" != "blog" ]; then
        continue
        # 当layout不为blog时,跳到下一篇文章
    fi

    line=$(sed -n ‘3p‘ $file)
    # 读取文章第三行
    # line == categories: linux

    category=$(echo $line | sed ‘s/.*:\s*//g‘ | sed ‘s/\s//g‘)
    # sed匹配冒号+空白字符后面的字符串。再移除全部的空白字符(非常重要。)
    # category == linux

    targetfile=./${category}/${urlname}.html
    # 拼接目标文件名称
    # targetfile == ./linux/tex-note.html

    targeturl=/$(echo ${basename} | sed ‘s/-/\//g‘ | sed ‘s/\//-/g4‘).html
    # 拼接目标URL:先把全部-替换为/。再把从第四个開始的/替换为-
    # targeturl == /2015/05/02/tex-note.html

    targeturl=$(echo ${targeturl} | sed ‘s/\//\\\//g‘);
    # targeturl
    # targeturl == \/2015\/05\/02\/tex-note

    sed "s/xxx/$targeturl/g" migrate_permalink_tpl.html > $targetfile
    # 将模板migrate_permalink_tpl.html中的xxx替换为targeturl,并存为targetfile
done

附上migrate_permalink_tpl.html

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <meta http-equiv="refresh" content="0; url=xxx">
  <link rel="canonical" href="xxx" />
</head>
<body></body>
</html>

得到的/linux/tex-note.html

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <meta http-equiv="refresh" content="0; url=/2015/05/02/tex-note">
  <link rel="canonical" href="/2015/05/02/tex-note" />
</head>
<body></body>
</html>


除非注明。本博客文章均为原创。转载请以链接形式标明本文地址: http://harttle.com/2015/07/25/bash-file-batch.html

时间: 2024-10-11 23:01:15

博客迁移:Shell脚本批量文件处理的相关文章

Shell脚本批量创建用户并随机生成密码

要求:批量创建10个系统账号oldboy01-oldboy10,并设置生成密码(密码不同). 实现脚本: #!/bin/bash #Question3 for i in $(seq -w 10) do         useradd -s /bin/bash oldboy$i         echo "password$i" | md5sum | tee -a passwd.txt | passwd --stdin  oldboy$i done 脚本执行效果: [[email pro

一篇博客分清shell中的状态返回值-return-break-continue-exit

一篇博客分清shell中的状态返回值-return-break-continue-exit 一.break.continue.exit.return的区别和对比 条件与循环控制及程序返回值命令知识表 命令 说明 break n 如果省略n,则表示跳出整个循环,n表示跳出循环的层数 continue n 如果省略n,则表示跳出本次循环,忽略本次循环剩余代码,进入循环的下一次循环.n表示退到第n层继续循环 exit n 表示退出当前shell程序,n为上一次程序执行的状态返回值,n也可以省略,在下一

Linux系统编写shell脚本批量创建和删除用户

一.编写shell脚本批量添加用户 实现方法:判断用户是否存在,存在则返回错误提示,同时判断用户文件是否存在,不存在则退出 1.创建添加用户脚本 [[email protected] ~]# vim useradd.sh #!/bin/bashif [ $# -eq 0 ];then        echo "你没有输入任何文件!"        exit 1fi if [ ! -f $1 ];then        echo "输入有误!"        exit

shell脚本批量部署ssh

日常运维工作中,需要给几十上百台服务器批量部署软件或者是重启服务器等操作, 这样大量重复性的工作一定很苦恼,本文给大家提供了最基本的批量操作的方法,虽然效率不高,对于初学者来说还是好理解.由于刚开始学习写脚本,什么 puppt这样的高级工具还不会使用,就简单的利用shell脚本.ssh-keygen.expect来实现.希望能给各位带来帮助,不足之处还请留言 指出,大家共同进步. 首先,需要检查expect是否安装:rpm -qa|grep expect 然后,在操作机上创建公钥:ssh-key

VMCloud见面礼&mdash;&mdash;VMCloud博客迁移全记录

微信号 VMCloud 大家好,为了避免在愚人节再公开本订阅号(其实为了避免被误会成是愚人节玩笑),所以选在今天,三月份的最后一天,VMCloud订阅号正式开张.如果说再说多的话也没办法去解释VMCloud订阅号的作用,那么就让我用实际行动来为各位了解关注本VMCloud订阅号的意义所在吧:P --------------------------------------------------------------------------------------------------- 正文

使用shell脚本清空文件

使用shell脚本清空文件 在最近的项目中,会生成很多日志文件,所以需要写一个脚本来手动清空它们,下面提供几种典型方法. 方法1 代码 #!/bin/bash ##方法1 echo "" > $1 echo "$1 cleaned up." 运行截图 说明 我想大家应该注意到了文件其实并没有真正被清空,而是有一个空行. 方法2 代码 #!/bin/bash ##方法2 : > $1 echo "$1 cleaned up." 运行截图

自动化运维Ansible批量部署服务+shell脚本批量推送公钥

一.概述分析 由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统方式进行维护会使得工作效率低下.这时,部署自动化运维就可以尽可能安全.高效地完成这些工作.一般会把自动化运维工具划分为两类:一类是需要使用代理工具的,也就是基于专用的ABem程序来完成管理功能,如: Puppet.Func. Zabbix等:另外一类是不需要配置代理工具的,可以直接基于SSH服务来完成管理功能,如: Ansible. Fabric等. - 下面介绍几款功能类似的自动化运

博客迁移-爱T-blog

从2012.8月后 博客迁移到http://blog.itiwin.cn  爱T-blog php技术博客 magento博客 版权声明:本文为博主原创文章,未经博主允许不得转载.

Hexo博客迁移到Coding

Coding是一个面向开发者的云端开发平台,目前提供代码托管,运行空间,质量控制,项目管理等功能. Coding提供社会化协作功能,包含了社交元素,为开发者提供技术讨论和协作平台. 一.创建项目 注:选择公开 点击创建之后 获取页面HTTPS或SSH地址 二.Clone项目到本地 $ git clone https://coding.net/itmyhome/blog.git blog 三.推送代码 如果已有hexo博客代码 放在blog目录下(.deploy .git除外),其他不变 修改根目