自从前段时间新浪开启防盗链不能做位图床之后,我们写了【新浪图床近期不稳定论自建图床的重要性】,建议大家自建图床。下面我们说一下如何快速得将WordPress站点中使用到的新浪图片利用Shell脚本迅速本地化。本方法使用所有的网站,我们这里只是将WordPress作为举例说明。
WordPress备份、准备工作
备份是基础工作,大家一定要经常备份。
备份完成后我们这里将sql文件保存为:『 jiloc.sql 』
找出所有新浪图床上的照片
- WordPress MYSQL 数据库及各表结构
- [Vutlr]Linux Cetnos Debian 使用putty登陆 vultr VPS 服务器
- 搬瓦工BandwagonHost VPS 使用Putty连接SSH图文教程
- Putty SSH使用私钥验证登录Linux centos debian VPS主机图文教程
如果你是打开你网站的每一个页面,然后一个个去找的话,请打开窗户,确认下面没人,然后把电脑丢下去。老季这里提供一个非常快速的方法找出所有新浪图床上的图片,我们先来看看新浪图床图片 URL 的特点(主要是 ·wp_posts
· 表):
http://wx4.sinaimg.cn/mw690/644ee728gy1fv0uy0qkzaj20im0okdtl.jpg http://wx1.sinaimg.cn/mw690/644ee728gy1fv0wn9qytrj21hc0ein4u.jpg http://wx3.sinaimg.cn/mw690/644ee728gy1fv0wn8y93cj20sg07pq94.jpg
我们需要一个正则表达式把上面的链接都匹配出来
- 最前面的协议有两种情况 http 和 https,所以我们用 https?来匹配(问号表示前面的‘s’要么出现 0 次,要么出现 1 次)
- 后面的 ws 开头的主机好像有 4 台,然后我就算他 10 台,所以对应的正则为 ws[0-9]
- ‘/large/491ea66cgy1g26kbwkrgpj22001hs7wh’这一段杂七杂八的用[a-Z0-9/]+?来匹配,‘[a-Z0-9/]’这里表示不管你是字母还是数字,还是/都给你匹配上,后面的+表示前面的数字、字母会出现一次或者多次,最后的问号是用来防止过渡匹配的,在这不加问号也没问题。
- 最后面的图片格式用.(jpg|png|gif)来匹配。
最终的正则表达式为
https?://wx[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)
当然,如果你的网站数据库非常大的话,你需要把这条正则写的尽量的精确,免得半天都跑不出来结果,比方说你全站 https 就可以这样写:
http://wx[1-4].sinaimg.cn/large/[a-Z0-9/]+?.(jpg|png|gif)
正则有了,我们现在去网站的数据库文件里面把所有新浪图床上的图片捞出来,执行下面的命令,最后的 jiloc.sql 是网站数据库备份文件。
正则有了,我们现在去网站的数据库文件里面把所有新浪图床上的图片捞出来,在终端中执行下面的命令,最后的 jiloc.sql 是网站数据库备份文件。
grep -Eo 'https?://wx[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' jiloc.sql
我们这里站点用的图片全部都是 mw690
目录的图片。这里一定要注意,后面SQL语句替换的时候要用到。
注:这里只是正则匹配图片,并没有去重功能。
利用Shell脚本迅速将sql语句中的新浪图片下载到本地
我们在shell中用一个 for 循环把新浪上的图片全下载下来,建议在网站根目录新建一个图片目录,把你网站数据库备份文件 jiloc.sql
也放到这里,然后把图片全下载到这里,在图片目录里面执行,这里将图片目录设定在 wp-content/uploads/images/
:
for i in `grep -Eo 'https?://wx[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' jiloc.sql`;do wget $i;done
注意:本方法仅适用在Linux系统Shell终端中。
去除重复图片
如果有重复的文件则会命名为:xxxxx.jpg.1 , xxxxx.png.2 之类,可以通过在shell中执行下面命令批量删除。
rm -rf *.jpg.[0-9]
这里的.jpg需要自己分析下载到本地的文件名。
删除当前目录下的.sql文件
rm *.sql