package main import ( "errors" "flag" "io" "io/ioutil" "log" "os" "path/filepath" "strings" "github.com/gabriel-vasile/mimetype" ) // FileSignature 定义了文件签名的结构 type FileSignature struct { Signature []byte Extension string } var ( dir = flag.String("dir", "/Users/taozhang/Downloads/docs2", "要处理的文件目录") ) // detectFileType 通过文件的签名来识别文件类型 func detectFileType(filePath string) (string, string, error) { f, err := os.Open(filePath) if err != nil { return "", "", err } defer f.Close() // 读取文件的前16字节,这应该足以检测大多数文件的类型 signature := make([]byte, 64) if _, err := io.ReadFull(f, signature); err != nil { return "", "", err } // 查找匹配的签名 mtype := mimetype.Detect(signature) // 如果没有匹配的签名,返回未知类型 extension := mtype.Extension() mime := mtype.String() if extension == "" { return "", "", errors.New("unknow extension") } else { return extension, mime, nil } } // init func init() { flag.Parse() } // main func main() { fs, err := ioutil.ReadDir(*dir) if err != nil { log.Fatal(err) } for _, f := range fs { ext := strings.ToLower(filepath.Ext(f.Name())) newExt, mime, err := detectFileType(filepath.Join(*dir, f.Name())) if err == nil && ext != newExt { newFileName := f.Name()[:len(f.Name())-len(ext)] + newExt log.Println(f.Name(), mime, ext, newExt, newFileName) //os.Rename(filepath.Join(*dir, f.Name()), filepath.Join(*dir, newFileName)) } } }