// Package command ... // // Description : command ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2022-05-20 22:34 package command import ( "strings" "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"}, } } type ls struct { workDir string paramList []string isRecursive bool // 是否递归查询 } // 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 } 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 { fileInfoArr := strings.Split(fileLine, " ") fileInfo := define.LsFileInfo{} // 是否链接 / 是否目录 / 文件权限解析 fileInfo.IsLink, fileInfo.IsDir, fileInfo.Permission = l.getFilePermission(fileInfoArr[0]) 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", }, } }