// Package command ... // // Description : command ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2022-05-20 22:34 package command import ( "path/filepath" "strings" "git.zhangdeman.cn/zhangdeman/util" "git.zhangdeman.cn/zhangdeman/command/define" ) // NewLs ls命令 // // Author : go_developer@163.com<白茶清欢> // // Date : 22:36 2022/5/20 func NewLs(workDir string) *ls { return &ls{ workDir: workDir, paramList: []string{"-l"}, relativeDir: "." + string(filepath.Separator), } } type ls struct { workDir string paramList []string isRecursive bool // 是否递归查询 relativeDir string // 相对目录 } // ShowHideFile 显示隐藏文件 // // Author : go_developer@163.com<白茶清欢> // // Date : 22:38 2022/5/20 func (l *ls) ShowHideFile() *ls { l.paramList = append(l.paramList, "-a") return l } // Recursive 递归查看所有目录下的文件 // // Author : go_developer@163.com<白茶清欢> // // Date : 22:38 2022/5/20 func (l *ls) Recursive() *ls { l.paramList = append(l.paramList, "-R") return l } // Run 执行命令 // // Author : go_developer@163.com<白茶清欢> // // Date : 22:59 2022/5/20 func (l *ls) Run() (*define.Result, []define.LsFileInfo) { result := Execute(l.workDir, "ls", l.paramList) if nil != result.Error { return result, make([]define.LsFileInfo, 0) } resultStr := string(result.Output) fileList := strings.Split(resultStr, "\n") fileListResult := make([]define.LsFileInfo, 0) for _, item := range fileList { if item == "." || item == ".." || len(item) == 0 { // 忽略 . 和 .. continue } itemArr := strings.Split(item, " ") if strings.ToLower(itemArr[0]) == "total" { // 过滤掉对于文件总数的输出 continue } if len(itemArr) < 9 { // 设置目录 if strings.HasPrefix(item, "."+string(filepath.Separator)) && strings.HasSuffix(item, ":") { l.relativeDir = strings.TrimRight(item, ":") } continue } fileListResult = append(fileListResult, l.parseFileInfo(item)) } return result, fileListResult } // parseFileInfo 解析文件信息 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:35 2022/6/27 func (l *ls) parseFileInfo(fileLine string) define.LsFileInfo { fileInfoArrSource := strings.Split(fileLine, " ") fileInfoArr := make([]string, 0) for _, item := range fileInfoArrSource { if len(item) > 0 { fileInfoArr = append(fileInfoArr, item) } } fileInfo := define.LsFileInfo{} fileInfo.IsLink, fileInfo.IsDir, fileInfo.Permission = l.getFilePermission(fileInfoArr[0]) // 是否链接 / 是否目录 / 文件权限解析 fileInfo.Name = fileInfoArr[8] fileInfo.User = fileInfoArr[2] fileInfo.Group = fileInfoArr[3] fileInfo.ModifyTime = strings.Join(fileInfoArr[5:8], " ") _ = util.ConvertAssign(&fileInfo.Size, fileInfoArr[4]) _ = util.ConvertAssign(&fileInfo.ReferenceCnt, fileInfoArr[1]) if fileInfo.IsDir { fileInfo.Type = "-" } else { nameArr := strings.Split(fileInfo.Name, ".") if len(nameArr) < 2 { fileInfo.Type = "unknown" } else { fileInfo.Type = nameArr[len(nameArr)-1] } } if fileInfo.IsLink { fileInfo.SourcePath = fileInfoArr[10] } fileInfo.RelativePath = l.relativeDir fileInfo.FullPath = strings.ReplaceAll(l.workDir+string(filepath.Separator)+l.relativeDir, string(filepath.Separator)+"."+string(filepath.Separator), string(filepath.Separator)) return fileInfo } // getFilePermission 解析文件权限信息 , 根据 drwxrwxrwx 这个规范解析 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:37 2022/6/27 func (l *ls) getFilePermission(permissionLayout string) (bool, bool, *define.FullPermission) { permissionArr := strings.Split(permissionLayout, "") if len(permissionArr) < 10 { return false, false, nil } return permissionArr[0] == "l", permissionArr[0] == "d", &define.FullPermission{ User: define.FilePermission{ Read: permissionArr[1] == "r", Write: permissionArr[2] == "w", Exec: permissionArr[3] == "x", }, Group: define.FilePermission{ Read: permissionArr[4] == "r", Write: permissionArr[5] == "w", Exec: permissionArr[6] == "x", }, Other: define.FilePermission{ Read: permissionArr[7] == "r", Write: permissionArr[8] == "w", Exec: permissionArr[9] == "x", }, } }