找出hugo站内未引用文件

ddatsh

dev #dev

3年乞丐阿里云这周到期,换到 新人第一年 59 的 ucloud(当年公司离 ucloud所在的城市概念非常近)

把图片迁移到赛博菩萨 cloudflare R2后,治下今日洁癖,清理下未引用的图片

用 GPT,生成 GO colly 爬本地 <img 地址的代码,小改下,再 filepath.Walk 加map过滤下,几分钟的事

打印了 50多个没引用的文件

package main

import (
	"fmt"
	"log"
	"net/url"
	"os"
	"path/filepath"
	"strings"

	"github.com/gocolly/colly"
)

func main() {
	dir := "d:/www/static/img"
	var files = make(map[string]struct{})
	filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if !info.IsDir() {
			path = strings.ReplaceAll(path, "\\", "/")
			path = path[len(dir):]
			path = "img" + path
			files[path] = struct{}{}
			if strings.Contains(path, "apm") {
				println()
			}

		}
		return nil
	})

	c := colly.NewCollector()

	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		link := e.Attr("href")
		// 过滤掉外部链接,仅限于本站
		if strings.HasPrefix(link, "/") || strings.HasPrefix(link, "http://localhost") {
			// 把相对链接转换为绝对链接
			e.Request.Visit(e.Request.AbsoluteURL(link))
		}
	})
	// 处理 <img> 标签
	c.OnHTML("img", func(e *colly.HTMLElement) {
		imgSrc := e.Attr("src")
		if strings.HasPrefix(imgSrc, "http") {
			parsedURL, err := url.Parse(imgSrc)
			if err != nil {
				fmt.Println("Error parsing URL:", err)
				return
			}
			// 获取路径部分
			path := parsedURL.Path

			// 去掉开头的斜杠(如果需要)
			trimmedPath := strings.TrimPrefix(path, "/")

			_, exists := files[trimmedPath]
			if exists {
				delete(files, trimmedPath)
			}

		} else {

			_, exists := files[imgSrc]
			if exists {
				delete(files, imgSrc)
			}
		}
	})

	// 处理请求错误
	c.OnRequest(func(r *colly.Request) {
		//	fmt.Println("Visiting", r.URL)
	})

	c.OnError(func(_ *colly.Response, err error) {
		log.Println("Request error:", err)
	})

	// 启动爬虫
	err := c.Visit("http://localhost:1313/")
	if err != nil {
		log.Fatal(err)
	}

	for v := range files {

		fmt.Println(v)
	}

}