【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文件中的图片引用,帮助用户清理未使用的图片,从而节省存储空间并保持文件结构的整洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果电脑怎么使用Windows软件 苹果笔记本怎么安装Windows mac怎么安装windows

最早的苹果电脑的概念是在1976年的时候由乔布斯提出来的,在1977年的时候发行的第一款个人电脑,也就是苹果笔记本电脑。苹果笔记本的操作系统是MAC OSmac OS是基于unix内核的系统,这个系统是专门为苹果电脑开发的。macOS比windows的视觉冲击大…

Synchronized的锁升级过程是怎样的?

文章目录 一、Synchronized的使用1、修饰实例方法2、修饰静态方法3、修饰代码块4、总结: 二、Monitor1、Java对象头1.1 32 位虚拟机的对象头1.2 64位虚拟机的对象头 2、Mark Word 结构3、Moniter4、Synchronized 字节码5、轻量级锁6、锁膨胀7、自旋优化8、偏向锁9、…

Laravel Sanctum:简化无状态API认证的新纪元

Laravel Sanctum:简化无状态API认证的新纪元 在现代Web应用中,API的安全认证是一个核心需求。Laravel Sanctum是一个轻量级的认证解决方案,专为Laravel开发的单页应用(SPA)、移动应用和API而生。它提供了一种简单而灵…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一:项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下,进行C网络开发的基本概念:TCP/IP socket通信&#xff0…

【diffusers极速入门(五)】扩散模型中的 Scheduler(noise_scheduler)的作用是什么?

系列文章目录 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

Vue中!.和?.是什么意思

在Vue(或更广泛地说,在JavaScript和TypeScript中),!. 和 ?. 是两个与可选链(Optional Chaining)和断言非空(Non-null Assertion)相关的操作符,它们分别用于处理可能为nu…

Java集合之HashMap的数据结构分析

总所周知,Java中键值对集合,我们最常用的就是HashMap,那么它的数据结构,以及如何存储键值对,包括为什么使用红黑树,链表等许多数据结构,下面我们一起学习交流 1.HashMap的数据结构:…

scratch二次开发:如何修改toolbox宽度

大家好,我是小黄。 使用场景:有时候我们开发图形化编程时,我们的积木块很长,导致一部分无法显示,我们想要把目录区域位置放大,比如下面红色方框区域位置,那么改如何实现这个过程呢?…

代码随想录 Day27 || 455分发饼干 376摆动序列 53最大子数组和

关于贪心算法(摘自hello算法) 贪心算法(greedy algorithm)是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策&#x…

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如,通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息,并通过print打印出来。将其打包成.exe,通过Qt来调用,并获取到.exe程序运行的结果 简单示例代码: // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…

【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例

一、机器学习的基本概念 定义: 机器学习是人工智能的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律,从而能够对未知数据做出预测或决策。 主要类型: 监…

嵌入式学习Day14---C语言进阶

目录 一、构造类型 1.1.结构体 1.存储 2.输入输出(传参) 3.结构体数组 1.2.共同体(联合体) 1.格式 2.存储 3.测试一个平台是打端还是小端 1.3.枚举 1.格式 2.特点 二、位运算(操作二进制) 2.1.&a…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12,开发者工具,网络 1、web基本概念 web服务器(web server):也称HTTP服务器(HTTP server)&am…

android移动开发基础期末看这一篇就ok了

android编程题 界面布局 使用TableLayout布局实现一个简单的计算器界面。 常见控件 开发一个整数加法的程序,实现将计算结果显示到界面上的功能。 开发一个自定义对话框,其界面中显示标题、提示内容、确定和取消按钮。当点击回退健时,用于…

如何获取文件缩略图(C#和C++实现)

在C中,可以有以下两种办法 使用COM接口IThumbnailCache 文档链接:IThumbnailCache (thumbcache.h) - Win32 apps | Microsoft Learn 示例代码如下: VOID GetFileThumbnail(PCWSTR path) {HRESULT hr CoInitialize(nullptr);IShellItem* i…

翻译: 可视化深度学习神经网络一

这是一个随意书写的28*28像素、分辨率很低的数字 3 但你的大脑一看见就能轻松辨识出来 ,我想要你好好欣赏这点 人脑能够毫无障碍地辨识是非常厉害的 我的意思是,这个、这个、还有这个,都能被识别为 3 即使前后图像的图形组成有很大差异 当你…

懂个锤子Vue 项目工程化扩展:

Vue项目工程化扩展📶: 前言:当然既然学习框架的了,HTMLCSSJS三件套必须的就不说了: JavaScript 快速入门 紧跟前文,目标学习Vue2.0——3.0: 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的…

SpringBoot 禁用RabbitMQ自启动

1.背景 在实际开发中,项目中使用了mq,但是在测试的时候用不到mq,或者测试环境的mq挂了, 希望能正常启动项目 2.步骤 这很简单在配置文件中增加一个配置就可以了 spring:autoconfigure:exclude: org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration 表示启…

WEB前端开发中如何实现大文件上传?

大文件上传是个非常普遍的场景,在面试中也会经常被问到,大文件上传的实现思路和流程。在日常开发中,无论是云存储、视频分享平台还是企业级应用,大文件上传都是用户与服务器之间交互的重要环节。随着现代网络应用的日益复杂化&…

康师傅JAVA核心内容

链接:康师傅JAVA核心内容 (qq.com)