commit e2856f1074769028383692251883f33f58be7853 Author: licsber Date: Sat Mar 15 11:19:19 2025 +0800 init commit. diff --git a/README.md b/README.md new file mode 100644 index 0000000..786036c --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# empty-dir + +clean empty dirs. + +## Install + +```bash +go env -w GOPROXY=https://proxy.golang.com.cn,direct +go env -w GOPRIVATE=git.licsber.site +git config --global url."ssh://git@git.m.licsber.site/".insteadOf "https://git.licsber.site/" + +go install git.licsber.site/go/empty-dir@latest +``` diff --git a/empty-dir.go b/empty-dir.go new file mode 100644 index 0000000..6448797 --- /dev/null +++ b/empty-dir.go @@ -0,0 +1,44 @@ +package main + +import ( + "os" + "path/filepath" + "strings" +) + +func emptyDir(p string) { + files, err := os.ReadDir(p) + if err != nil && strings.Contains(err.Error(), "Access is denied") { + remindErr(err) + return + } + + PanicErr(err) + + defer func() { + remainFiles, e := os.ReadDir(p) + PanicErr(e) + + if len(remainFiles) == 0 { + e = Rm(p) + remindErr(e) + } + }() + + for _, file := range files { + filePath := filepath.Join(p, file.Name()) + if !file.IsDir() { + if strings.HasPrefix(file.Name(), "._") && IsMacMetaFile(filePath) { + err = Rm(filePath) + remindErr(err) + } else if file.Name() == ".DS_Store" { + err = Rm(filePath) + remindErr(err) + } + + continue + } + + emptyDir(filePath) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b61212f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.licsber.site/go/empty-dir + +go 1.24.1 diff --git a/main.go b/main.go new file mode 100644 index 0000000..7d060de --- /dev/null +++ b/main.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + "time" +) + +func main() { + _startTime := time.Now() + defer func() { + fmt.Print("Time cost: ") + fmt.Println(time.Now().Sub(_startTime)) + }() + + p, fi := PathOrPWD() + if !fi.IsDir() { + fmt.Println(p) + fmt.Println("empty-dir: Arg must be dir path.") + return + } + + emptyDir(p) +} diff --git a/util_cli_path.go b/util_cli_path.go new file mode 100644 index 0000000..4a62c76 --- /dev/null +++ b/util_cli_path.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "strings" +) + +func PathOrPWD() (p string, fi os.FileInfo) { + if len(os.Args) != 1 { + p = strings.Join(os.Args[1:], " ") + } else { + pwd, err := os.Getwd() + if err != nil { + panic("Check if $PWD exist?") + } + p = pwd + } + + p, err := filepath.Abs(p) + if err != nil { + panic("Path not exist: " + p) + } + + fi, err = os.Stat(p) + if err != nil { + panic(err) + } + + fmt.Println("Working path: " + p) + return +} diff --git a/util_err.go b/util_err.go new file mode 100644 index 0000000..2434d28 --- /dev/null +++ b/util_err.go @@ -0,0 +1,16 @@ +package main + +import "fmt" + +func remindErr(err error) { + if err != nil { + fmt.Print("Error: ") + fmt.Println(err) + } +} + +func PanicErr(err error) { + if err != nil { + panic(err) + } +} diff --git a/util_macos.go b/util_macos.go new file mode 100644 index 0000000..58ddfd8 --- /dev/null +++ b/util_macos.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + "strings" +) + +const macMetaStr1 = "com.apple.quarantine" +const macMetaStr2 = "This resource fork intentionally left blank" + +func IsMacMetaFile(p string) bool { + b, err := os.ReadFile(p) + if err != nil { + return false + } + + if strings.Contains(string(b), macMetaStr1) { + return true + } + + return strings.Contains(string(b), macMetaStr2) +} diff --git a/util_rm.go b/util_rm.go new file mode 100644 index 0000000..2a79e1e --- /dev/null +++ b/util_rm.go @@ -0,0 +1,11 @@ +package main + +import ( + "fmt" + "os" +) + +func Rm(p string) error { + fmt.Println("Remove: " + p) + return os.Remove(p) +}