人生苦短,我(需要)用 Python !
另外,如果你还没有创建博客,推荐使用 Hexo 搭建;如果刚创建博客,还在搜寻可用插件的话,那么可以参考我之前的几篇文章:
- 「Hexo On Win10」新手搭建博客过程
- 分享几个实用的 HEXO 博客功能插件
- 分享一个精致实用的 HEXO 博客小插件:日历云
二、正文
注意:本文仅适用于那些使用 Hexo 搭建博客,平时写的文章有大量图片,还需要自己手动上传服务器的朋友。其他同学就请随意啦! :laughing:
问题所在
问题已经描述过了,比如之前我在自己的博客页面添加了一个日历云小插件,然后高兴地使用 hexo g 命令重新生成所有文章,接下来一顿崩溃:
- 我的文章比较多,网络不给力,上传所有文件到服务器非常耗时
- 直接覆盖全部文件会遇到断线重连的情况,导致服务器上某些文件“半途而废”
- 图片多而且不会发生变化,不需要把图片上传覆盖到服务器
- 如果选择手动提取 HTML 文件则非常耗时,因为文件夹“很有深度”
有点啰嗦,虽然我使用的 WinSCP 有选择覆盖“最新的文件”的功能,但是并没有什么卵用,我也没有在 Hexo 插件中找到相关解决方案的插件,所以只能自己动手了。
私信菜鸟007即可获取数十套PDF哦!
import os import shutil def searchFile(src_dir, ext_filters, result_list): if not os.path.exists(src_dir) or not os.path.isdir(src_dir): print('None exits folder or not a directory at all, for:', src_dir, 'and will be ignored!') return for file in os.listdir(src_dir): file = os.path.join(src_dir, file) if os.path.isfile(file) and os.path.splitext(file)[1] in ext_filters: result_list.append(file) elif os.path.isdir(file): searchFile(file, ext_filters, result_list) def getSearchedFiles(src_dir, ext_filters): results = [] searchFile(src_dir, ext_filters, results) print('Find %d files in %s directory!' % (len(results), src_dir)) return results def copySingleFile(src_file, dst_dir): if not os.path.exists(src_file): print('No such source file') return src_dir = os.path.split(src_file)[0] if os.path.isfile(src_file) else src_file src_dir = os.path.relpath(src_dir) dst_dir = os.path.join(dst_dir, src_dir) dst_dir = dst_dir.replace('..\\', '') # for test! if not os.path.exists(dst_dir): os.makedirs(dst_dir) shutil.copy2(src_file, dst_dir) def createGeneratedFolder(): current_path = os.path.abspath('.') # 临时文件夹,自行修改吧 generate_path = os.path.join(current_path, 'temp') generate_path = os.path.join(generate_path, 'generated') if os.path.exists(generate_path): os.removedirs(generate_path) os.makedirs(generate_path) return generate_path# 修改这里为你的文件夹路径 def getInputWorkDirectories(): dirs = [] # 你的文件夹路径,绝对路径,可以不写 use_default = input('Use default directories?(y/n):') if use_default not in['n', 'no', 'NO', 'N']: return dirs path = input('Input the work directory(0 char to stop):') dirs = [path] while len(path) > 1: path = input('Input the work directory(0 char to stop):') dirs.append(path) return dirs def startWork(): gene = createGeneratedFolder() dirs = getInputWorkDirectories() if len(dirs) == 0: return extensions = getInputExtensions() # 方法已省略,返回扩展名数组 for d in dirs: files = getSearchedFiles(d, extensions) for f in files: copySingleFile(f, gene) if __name__ == '__main__': print('Start working......') startWork() print('Done!')
如果有大神看到了这篇文章,希望能打造一个 Hexo 内部功能或者插件,类似用于重新生成指定文件类型的命令,就像: hexo rebuild -html,json,xml 。(嗯,这个命令是我乱写的,别被忽悠!)