一个自动将 markdown 的本地图片上传至 minio 的脚本
2023-08-21 tech typora markdown shell jekyll minio 6 mins 8 图 2295 字
我写 blog 基本都是用 typora 这个markdown 编辑器。插入图片时它会在本地自动生成图片备份。这篇文章里我将自动替换文章里的图片路径,更改为云端的路径,并自动把图片上传到云端。我上传云端的服务为 minio。另外,这个脚本是在 Mac 下运行的。如果是其他系统可能需要做一些微调。
需求如下:
比如我8月4日完成了这篇文章:2023-08-04-displaying-images-in-the-linux-command-line.md
我需要将文件里的
- (2023-08-04-displaying-images-in-the-linux-command-line.assets/image-20230816103829510.jpg)
- (2023-08-04-displaying-images-in-the-linux-command-line.assets/image-20230816103916037.jpg)
这两个内容改为:
- (https://cdn.kelu.org/blog/2023/08/image-20230816103829510.jpg)
- (https://cdn.kelu.org/blog/2023/08/image-20230816103916037.jpg)
以下是replace.sh
,执行如下命令就行:
./replace.sh 2023-08-04-displaying-images-in-the-linux-command-line.md
核心命令为这两个:
- 将文件夹改为url
- 将png改为jpg
另外我额外完成了一个功能,删除连续的空行为一个空行:
sed '/^$/N;/\n$/D' "${FILE}" > $temp_file
mv $temp_file "${FILE}"
上传至 minio 的命令参考 《Mac 配置 minio 客户端 mc 命令行》 或者 minio 官方文档 MinIO Client:
mc cp "$IMAGE" "myminio/blog/${DATE_PART}/${IMAGE_NAME}"
另外,我还登陆到服务器上,将上传的png图片转换成jpg,其中 png2jpg 的具体实现如下,在脚本中没有体现,可以参考我这篇文章《批量转换图片格式 png to jpg》:
png2jpg () {
if ls --color=tty *.png > /dev/null 2>&1
then
ls --color=tty -1 *.png | xargs -n 1 bash -c 'echo $0 && convert "$0" -background white -flatten -alpha off "${0%.png}.jpg"'
rm -rf *.png
fi
if ls --color=tty *.PNG > /dev/null 2>&1
then
ls --color=tty -1 *.PNG | xargs -n 1 bash -c 'echo $0 && convert "$0" -background white -flatten -alpha off "${0%.PNG}.jpg"'
rm -rf *.PNG
fi
}
最终完整的脚本如下:
#!/bin/bash
if [[ $# -ne 1 ]]; then
echo "用法: $0 <文件名>"
exit 1
fi
FILE="$1"
ASSETS_DIR=$(echo "$FILE" | sed 's/\.md$/.assets/')
DATE_PART=$(echo "$FILE" | cut -d'-' -f1-2 | tr '-' '/')
NEW_URL="https://cdn.kelu.org/blog/${DATE_PART}"
rand_name="$(openssl rand -hex 8)"
temp_file=$(mktemp -t rand_name)
sed '/^$/N;/\n$/D' "${FILE}" > $temp_file
mv $temp_file "${FILE}"
if [ -d "$ASSETS_DIR" ]; then
for IMAGE in "$ASSETS_DIR"/*; do
IMAGE_NAME=$(basename "$IMAGE")
mc cp "$IMAGE" "myminio/blog/${DATE_PART}/${IMAGE_NAME}"
done
echo "图片拷贝完成!"
ssh sh1 << EOF
source .sh.alias
cd cdn/blog/${DATE_PART}
png2jpg
EOF
fi
此外,我还写了一个脚本batch_replace.sh
,用来批量执行这个 replace.sh
:
#!/bin/bash
for FILE in *.md; do {
if [ -f "$FILE" ]; then
./replace.sh "$FILE"
fi
} &
done
wait