7

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

 10 months ago
source link: https://blog.kelu.org/tech/2023/08/21/automatically-uploads-local-markdown-images-to-minio-script.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

2023-08-21     tech typora markdown shell jekyll
markdown.jpg

我写 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-20230816103829510.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 的命令参考 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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK