150 lines
3.7 KiB
Go
150 lines
3.7 KiB
Go
// Package command ...
|
|
//
|
|
// Description : command ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 2022-05-20 22:34
|
|
package command
|
|
|
|
import (
|
|
"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"},
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
if len(itemArr) < 9 {
|
|
// 设置目录 TODO
|
|
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.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])
|
|
nameArr := strings.Split(fileInfo.Name, ".")
|
|
if len(nameArr) < 2 {
|
|
fileInfo.Type = "unknown"
|
|
} else {
|
|
fileInfo.Type = nameArr[len(nameArr)-1]
|
|
}
|
|
fileInfo.IsLink, fileInfo.IsDir, fileInfo.Permission = l.getFilePermission(fileInfoArr[0])
|
|
if fileInfo.IsLink {
|
|
fileInfo.SourcePath = 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",
|
|
},
|
|
}
|
|
}
|