package main
import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"os/user"
"path/filepath"
"regexp"
"strings"
"time"
)
const (
Ver = "2.0"
LastUpd = "Jan. 14, 2026"
Author = "Chenf"
)
var (
MyFileList []string
MyIgnoreList []string
NotGotoTrash = 0
HelpFlag = 0
)
func main() {
trashroot := "/home"
currentUser, err := user.Current()
if err != nil {
fmt.Println("Error getting current user:", err)
os.Exit(1)
}
username := currentUser.Username
trashpath := fmt.Sprintf("%s/%s/.Trash", trashroot, username)
if !pathExists(trashpath) {
os.MkdirAll(trashpath, 0755)
}
dateTimeDir := time.Now().Format("20060102150405")
args := os.Args[1:]
for _, arg := range args {
switch {
case arg == "-h" || arg == "-help" || arg == "--help":
printHelp()
os.Exit(0)
case arg == "--version":
fmt.Println("rm2mv v" + Ver)
os.Exit(0)
case arg == "--force":
runCommand("/bin/rm", "-rf", arg)
case strings.Contains(arg, "/.Trash/"):
runCommand("chmod", "777", "-R", arg)
runCommand("/bin/rm", "-rf", arg)
case arg == "--status":
if !pathExists(trashpath) {
os.Exit(0)
}
runCommand("du", "-sh", trashpath)
os.Exit(0)
case arg == "--clean":
cleanTrash(trashpath, dateTimeDir)
os.Exit(0)
case !strings.HasPrefix(arg, "-"):
if isDangerousPath(arg) {
fmt.Println("[Warning] deleting dangerous files: " + arg)
os.Exit(0)
} else {
if pathExists(arg) {
MyFileList = append(MyFileList, arg)
} else if isSymlink(arg) {
MyFileList = append(MyFileList, arg)
} else {
MyIgnoreList = append(MyIgnoreList, arg)
}
}
default:
MyIgnoreList = append(MyIgnoreList, arg)
}
}
trashtimestamp := trashpath + "/clean.timestamp"
if !pathExists(trashtimestamp) {
runCommand("rm", "--clean")
} else {
content, err := ioutil.ReadFile(trashtimestamp)
if err == nil && len(content) >= 8 {
lastDatetime := string(content)
if len(lastDatetime) >= 8 {
y := lastDatetime[0:4]
m := lastDatetime[4:6]
d := lastDatetime[6:8]
lastTime, err := time.Parse("20060102", y+m+d)
if err == nil {
if time.Since(lastTime).Hours() > 7*24 {
runCommand("rm", "--clean")
}
}
}
}
}
if len(MyFileList) != 0 {
target := fmt.Sprintf("%s/%s", trashpath, dateTimeDir)
if !pathExists(target) {
os.MkdirAll(target, 0755)
}
for _, f := range MyFileList {
targetFile := target + "/" + filepath.Base(f)
if pathExists(targetFile) {
runCommand("/bin/rm", "-rf", targetFile)
moveFile(f, target)
} else if isPipeFile(f) {
os.Remove(f)
} else if isSymlink(f) && !pathExists(f) {
runCommand("/bin/rm", "-rf", f)
} else if shouldDeleteDirectly(f) {
runCommand("/bin/rm", "-rf", f)
} else {
if pathExists(targetFile) {
runCommand("/bin/rm", "-rf", targetFile)
}
moveFile(f, target)
}
}
}
}