找出hugo站内未引用文件
ddatsh
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)
}
}