批量重命名markdown本地图片
批量重命名markdown本地图片
问题
之前在使用markdown记录时,习惯将所有markdown文件中的图片保存到当前目录下的img文件夹中,就像这样:
当我想要提取出一个md文件和他对应的附件时,就会无从下手(不想导出pdf),因为:
- 因为img文件夹内图片太多,全导出img会有多余的图片也在其中。
- 前期命名图片时也非常随意,导致图片是哪个文件的也无法区分。没法一个一个复制出来
思路
基于上述问题,我希望能够批量修改文件夹内的图片和md文件中的链接,将图片命名为如下格式:
[md文件名]-1
[md文件名]-2
...
这样后续就可以手动复制所有和该md文件相关的图片出来。
不考虑图片多个md中重复使用
也不太想修改图片到单独的assets文件这种方式
实现
通过python脚本来实现,可能会有不少bug,仅供参考,我是一个一个文件夹慢慢改 + 人工核实的
最终效果
主要功能
- 输入要修改的markdown文件夹绝对路径
- 遍历该目录中所有.md结尾的文件,并且通过正则获取其中的链接形式
- 根据该链接找到图片,重命名图片为[md文件名]-1,序号递增
- 修改md文件中的该链接
注意事项:
- 需要loguru库
pip install loguru
- 需要是标准的markdown link形式
- 需要是标准的markdown link形式
- 因为本身是只放在img文件夹中的,如果是其他文件名可能还要看情况写一下脚本
- 应该还是有不少问题的,仅供参考(要用的话最好还是一点一点改比较好,最好复制一份副本来测试使用)
已知问题:
- 最好不要有已经是这个格式的命名图片,可能会导致不能重命名,异常退出
- 最好不要有空格,不管是文件名还是图片。(也许可以正常运行...为此做了不少努力...能力有限...)
- 我是windows下运行,所以/和\,md文件中的链接是正斜杠/,脚本中找文件什么的有些会换成\
import os
import re
import sys
import urllib.parse
from loguru import logger
## 配置图片存放的文件夹,是同目录下的文件夹
img_directory = 'img'
def check_img_name(directory):
flag = 0
for root, _, files in os.walk(os.path.join(directory)):
for file in files:
if file.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp')):
base_name, file_extension = os.path.splitext(file)
if base_name.find("-"):
flag += 1
logger.warning(f"请确认该图片命令方式是否已经是对应的方式: {root}/{file}")
if flag:
r = input("确认命名方式正确(Y/n):")
if r == "y" or r == "Y":
pass
else:
sys.exit(1)
def process_markdown_directory(directory):
# 图片保存在相同目录下的img文件夹中 不用加/
for root, _, files in os.walk(directory):
for file in files:
if file.endswith('.md'):
logger.info("======================" + file + "开始修改======================")
markdown_file_path = os.path.join(root, file)
with open(markdown_file_path, 'r', encoding='utf-8') as markdown_file:
markdown_content = markdown_file.read()
# 获取Markdown文件的基本文件名(不包括扩展名),后续用来修改图片文件
markdown_file_base = os.path.splitext(file)[0]
# 查找Markdown内容中的图片链接
img_links = re.findall(r'!\[.*?\]\((.*?)\)', markdown_content)
logger.debug(img_links)
# 遍历图片链接并检查图片是否存在并重命名图片文件
for i, img_link in enumerate(img_links):
logger.debug("img_link = " + img_link)
img_extension = os.path.splitext(img_link)[1]
# 命名成 md文件名-1 md文件名-2的形式
new_img_name = f'{markdown_file_base}-{i + 1}{img_extension}'
logger.debug("new_img_name = " + new_img_name)
# 检查文件是否存在
try:
# md文件中的链接可能存在%20等符号,所以加了解析,其他文件不知道会不会出问题
img_file_path = os.path.join(urllib.parse.unquote(img_link))
logger.debug(img_file_path)
new_img_file_path = os.path.join(img_directory, new_img_name)
# 若存在该文件就不改名
# !!!这里可能有问题,如果有图片命名方式已经和这个一样的话会导致图片重命名出错 退出!!!
if img_file_path != new_img_file_path:
os.rename(img_file_path, new_img_file_path)
logger.success("重命名图片:" + img_file_path + "--->" + new_img_file_path)
else:
logger.warning("该文件已存在:" + img_file_path)
# 更新Markdown中的图片链接
new_img_name = new_img_name.replace(" ","%20")
logger.debug(new_img_name)
markdown_content = markdown_content.replace(img_link, img_directory + "/" + new_img_name)
logger.success("更新图片链接:" + img_link + "--->" + img_directory + "/" + new_img_name)
with open(markdown_file_path, 'w', encoding='utf-8') as markdown_file:
markdown_file.write(markdown_content)
except Exception as e:
logger.error(e)
sys.exit(1)
# 保存更新后的Markdown内容
if __name__ == "__main__":
logger.remove()
logger.add(sys.stderr, level='INFO')
# logger.add(sys.stderr, level='DEBUG')
markdown_directory = input("请输入目录绝对路径:")
os.chdir(markdown_directory)
logger.info(markdown_directory)
check_img_name(markdown_directory)
process_markdown_directory(markdown_directory)
本文作者:d3solate
本文链接:https://www.cnblogs.com/d3solate/p/17802003.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix