defmove_and_rename_markdown_files(base_dirs): for base_dir in base_dirs: for file in os.listdir(base_dir): if file.endswith('.md'): old_path = os.path.join(base_dir, file) new_dir = os.path.join(base_dir, file[:-3]) new_path = os.path.join(new_dir, 'index.md')
defmove_assets(base_dirs): for base_dir in base_dirs: assets_dir = os.path.join(base_dir, 'assets') ifnot os.path.exists(assets_dir): continue
for slug in os.listdir(assets_dir): slug_dir = os.path.join(assets_dir, slug) if os.path.isdir(slug_dir): target_dir = os.path.join(base_dir, slug) if os.path.exists(target_dir): for asset in os.listdir(slug_dir): asset_path = os.path.join(slug_dir, asset) if os.path.isfile(asset_path): shutil.move(asset_path, target_dir) print(f"Moved: {asset_path} -> {target_dir}")
if __name__ == "__main__": base_dirs = ["notes", "coding"] move_assets(base_dirs)
for base_dir in base_dirs: for slug in os.listdir(base_dir): slug_dir = os.path.join(base_dir, slug) if os.path.isdir(slug_dir): for file in os.listdir(slug_dir): if file.endswith('.md'): file_path = os.path.join(slug_dir, file)
withopen(file_path, 'r', encoding='utf-8') as f: content = f.read()
for pattern in link_patterns: content = pattern.sub( lambdamatch: f"[{match.group(1)}](../{match.group(2).split('.')[0]}/index.md{match.group(3) or''})", content )
withopen(file_path, 'w', encoding='utf-8') as f: f.write(content)
print(f"Updated links in: {file_path}")
if __name__ == "__main__": base_dirs = ["notes", "coding"] update_internal_links(base_dirs)
还有一些可以直接在 VS Code 里用正则批量替换的,就没再让 AI「帮忙」写脚本了。
博客文章的文件路径
博客文章页的处理机制就不太一样,虽然源文件的路径是 source/_posts/<year>/<post-slug>.md,但按照现在配置,构建出来的 HTML 页面路径是 .../<post-slug>/index.html。这也是之前发现的,用 VS Code 等编辑器编辑源文件时,图片的相对路径不好处理的原因。