一个自动将 markdown 的本地图片上传至 minio 的脚本

我写 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

核心命令为这两个:

image-20230823174756304

  • 将文件夹改为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)

image-20230823174756304


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

Windows 中禁止 gVim 生成备份文件 如何在 tmux 中 kill 掉一个 windows?