Typora清理assets目录中未被引用的图片

在Typora中Ctrl+C,Ctrl+V引入本地图片时,会在当前md文件目录下创建md文件名.assets文件夹用于存放图片资源。如果在编辑文档时直接删除图片的引入代码,虽然图片在md文档中删除了,但会继续留在assets文件夹中,正确的删除方式时右键引入的图片点击删除。Typora官方也没有提供对于这种情况的解决办法,要是添加这种检验功能,用来检验文档中资源与本地资源的绑定情况而且可以一键删除未引用的资源就好了。综上所述,只好写了下面一段python脚本,本地测试没问题,如果在使用过程中遇到问题,可以在评论区留言和指正哦。

import re
import os
import shutil
from bs4 import BeautifulSoup

def main(ROOT_PATH):
    # 定义正则表达式用于匹配.md文件中的图片引用语句
    pattern = re.compile(r"!\[.*\]\((.*)\)")
    
    if os.path.exists(ROOT_PATH + "unused_imgs"):
        print("unused_imgs文件夹已存在,处理结果将覆盖原文件夹")
        shutil.rmtree(ROOT_PATH + "unused_imgs")
    os.mkdir(ROOT_PATH + "unused_imgs")

    for file in os.listdir(ROOT_PATH):
        # 扫描该路径下的所有.md文件,file是md文件名
        if file.endswith(".md"): 
            with open(os.path.join(ROOT_PATH, file), "r", encoding="utf-8") as f:
                md_text = f.read()
                # 根据正则匹配得到 ![图片名](地址.png) 这种形式的图片引用,当然如果有类似的文本内容也会被匹配到
                # 相比于list,set通常是用来进行去重,内容无序不可重复
                img_references = set() 
                for img in pattern.findall(md_text):
                    img = img.split("/")[-1]
                    img_references.add(img)
                # 上面只能找到符合正则pattern的图片引用,如果图片是以html的img形式引入的,将不会被匹配到的
                soup = BeautifulSoup(md_text, "html.parser")
                for img in soup.find_all("img"):
                    src = img.get("src")
                    if src:
                        img_references.add(src.split("/")[-1])
                f.close()
            file_name = file[0:-3]
            # 比较assets目录下的资源与对应md文档中匹配到的资源,得到未被引用的资源
            if os.path.exists(ROOT_PATH + file_name + ".assets"):
                img_asssets = set(os.listdir(ROOT_PATH + file_name + ".assets"))
                unused_imgs = img_asssets - img_references
                print(f"{file_name}.assets中存在{len(unused_imgs)}张未被引用的图片")
                new_assets_dir = ROOT_PATH + "unused_imgs//" + file_name + ".assets"
                os.mkdir(new_assets_dir)
                for img in unused_imgs:
                    shutil.move(
                        os.path.join(ROOT_PATH + file_name + ".assets", img),
                        new_assets_dir,
                    )
            else:
                print(f"未找到{file}对应的.assets目录")
    return 0

if __name__ == "__main__":
    # 输入md文档所在路径,程序会找出其中未被引用的图片,并移动到unused_imgs文件夹下
    ROOT_PATH = "D://BaiduSyncdisk//MyNotes//博客//"
    main(ROOT_PATH)

运行程序后,请先检查一下md文档中引入的图片有没受影响(一般不会),如果没有可以删除unused_imgs目录下被分离出来的图片资源。

参考博客:

注意输入的路径ROOT_PATH是以"//"为结束。

GitHub 加速计划 / ass / assets
185
19
下载
Ultralytics assets
最近提交(Master分支:2 个月前 )
969b5911 3 个月前
dcb30515 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐