当前位置: 首页 > news >正文

【Golang】清理Markdown未引用图片

概述

 本文介绍一个使用Go语言编写的脚本,其功能是清理指定目录中未被Markdown文件引用的图片。该脚本通过读取Markdown文件中的图片引用,与存储在特定目录下的所有图片进行对比,将未引用的图片移动到另一个指定的目录中。此脚本适用于需要维护图片库,确保其中只包含有效引用图片的场景。

功能和实现

命令行参数

脚本通过命令行参数接收两个目录路径:

  • imgDir:存储Markdown文件中引用图片的目录。
  • delDir:用于存放未引用图片的目录。

主要步骤

  1. 解析命令行参数:使用flag包解析命令行参数,获取图片目录和删除目录的路径。
  2. 读取Markdown文件:遍历当前目录下的所有文件,识别.md扩展名的文件。
  3. 提取图片引用:对于每个Markdown文件,使用正则表达式提取文件中引用的图片路径,并将这些路径存储在一个切片中。
  4. 获取所有图片文件:读取图片目录下的所有文件和文件夹,存储在一个切片中。
  5. 对比和移动未引用图片:遍历所有图片文件,检查它们是否在Markdown文件中被引用。如果未被引用,则将其移动到删除目录。

关键函数

  • extractReferencedImages:从Markdown文件中提取所有图片引用。
  • isContained:检查图片是否在引用列表中。
  • moveFile:移动文件到新位置,并删除原始文件。

使用说明

  1. 将脚本放在包含Markdown文件的目录中。
  2. 运行脚本,并指定图片目录和删除目录的路径。
  3. 脚本将自动处理并移动未引用的图片。

代码

package mainimport ("flag""fmt""os""path/filepath""regexp"
)func main() {defer pressKeyToExit()// 解析命令行参数imgDirPtr := flag.String("i", "pic", "Image directory path")delDirPtr := flag.String("d", ".del", "Invalid image deletion directory path")flag.Parse()picDir := *imgDirPtr // 图片存储的目录delDir := *delDirPtr // 要移动未引用图片的目录// 获取当前工作目录dir, err := os.Getwd()if err != nil {fmt.Println("获取文件夹失败:", err)return}// 读取目录下的所有文件和文件夹files, err := os.ReadDir(dir)if err != nil {fmt.Println("读取文件夹失败:", err)return}referencedImages := &[]string{}// 遍历文件和文件夹for _, file := range files {// 检查文件是否以.md结尾if filepath.Ext(file.Name()) == ".md" {// 获取Markdown文件中所有引用的图片referencedImages = extractReferencedImages(referencedImages, file.Name())}}// 获取目录中的所有图片文件allImages, err := os.ReadDir(picDir)if err != nil {fmt.Println("读取文件夹失败:", err)return}// 确保删除目录存在if _, err := os.Stat(delDir); os.IsNotExist(err) {os.Mkdir(delDir, 0755)}// 查找未引用的图片for _, img := range allImages {if img.IsDir() {continue}imgName := img.Name()if contained, _ := isContained(*referencedImages, filepath.Join(picDir, imgName)); !contained {// 移动未引用的图片到删除目录err = moveFile(filepath.Join(picDir, imgName), filepath.Join(delDir, imgName))if err != nil {fmt.Println(err)}}}fmt.Println("未引用图片清理完成")
}func pressKeyToExit() {fmt.Println("\n按任意键退出...")var input stringfmt.Scanln(&input)
}// extractReferencedImages 从Markdown文件中提取所有图片引用
func extractReferencedImages(referencedImages *[]string, mdFile string) *[]string {content, err := os.ReadFile(mdFile)if err != nil {fmt.Println("读取文件失败:", err)return referencedImages}re := regexp.MustCompile(`!\[.*?\]\((.*?)\)`)matches := re.FindAllStringSubmatch(string(content), -1)for _, match := range matches {matchPath, err := filepath.Abs(match[1])if err != nil {fmt.Println("文件不存在:", err)}*referencedImages = append(*referencedImages, matchPath)}return referencedImages
}// isContained 检查图片是否在引用列表中
func isContained(slice []string, item string) (bool, error) {for _, s := range slice {itemPath, err := filepath.Abs(item)if err != nil {return false, err}if s == itemPath {return true, nil}}return false, nil
}// moveFile 移动文件到新位置
func moveFile(srcPath, destPath string) error {// 使用 os.Rename 移动文件err := os.Rename(srcPath, destPath)if err != nil {return fmt.Errorf("无法移动文件: %s", err)}fmt.Printf("清理未引用图片 '%s' 到 '%s'\n", srcPath, destPath)return nil
}

结论

 这个Go语言程序提供了一个高效的方式来管理Markdown文件中的图片引用,帮助用户清理未使用的图片,从而节省存储空间并保持文件结构的整洁。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP如何实现登录认证和鉴权
  • 【Rust光年纪】解锁 Rust 库新姿势:抽象语法树、代码生成与宏处理全解析
  • Qt文件读写
  • 实战:ElasticSearch 索引操作命令(补充)
  • day18 Java流程控制——Scanner进阶使用
  • C++20三向比较运算符详解
  • 你的网站访客来自何方?GoAccess地理分析工具告诉你!
  • 图像生成中图像质量评估指标—FID介绍
  • C#的#define #if用法
  • 《C语言程序设计 第4版》笔记和代码 第十三章 文件操作
  • 二百五十四、OceanBase——Linux上安装OceanBase数据库(四):登录ocp-express,配置租户管理等信息
  • Swift-Extension
  • 【简单讲解下Symfony框架】
  • 给python初学者的一些建议
  • 线程创建的4种方式
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【刷算法】从上往下打印二叉树
  • 2017-09-12 前端日报
  • IP路由与转发
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Terraform入门 - 1. 安装Terraform
  • Vue.js-Day01
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 如何实现 font-size 的响应式
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 算法之不定期更新(一)(2018-04-12)
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 责任链模式的两种实现
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #微信小程序(布局、渲染层基础知识)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2.2w字)前端单元测试之Jest详解篇
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (python)数据结构---字典
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (六)DockerCompose安装与配置
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (区间dp) (经典例题) 石子合并
  • (十三)Flink SQL
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一一四)第九章编程练习
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)memcache、redis缓存
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)从 Java 代码到 Java 堆
  • ****三次握手和四次挥手
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 按比例显示图片的缩略图