seaweedfs/weed/shell/command_fs_ls.go

116 lines
2.5 KiB
Go
Raw Normal View History

2019-03-26 19:43:51 +00:00
package shell
import (
"fmt"
"io"
"os"
"os/user"
"strconv"
"strings"
2019-12-13 08:22:37 +00:00
"github.com/chrislusf/seaweedfs/weed/filer2"
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
2020-03-23 07:01:34 +00:00
"github.com/chrislusf/seaweedfs/weed/util"
2019-03-26 19:43:51 +00:00
)
func init() {
Commands = append(Commands, &commandFsLs{})
2019-03-26 19:43:51 +00:00
}
type commandFsLs struct {
}
func (c *commandFsLs) Name() string {
return "fs.ls"
}
func (c *commandFsLs) Help() string {
2019-03-28 07:05:04 +00:00
return `list all files under a directory
2019-03-26 19:43:51 +00:00
2019-04-21 22:43:43 +00:00
fs.ls [-l] [-a] /dir/
fs.ls [-l] [-a] /dir/file_name
fs.ls [-l] [-a] /dir/file_prefix
2019-03-28 07:05:04 +00:00
fs.ls [-l] [-a] http://<filer_server>:<port>/dir/
fs.ls [-l] [-a] http://<filer_server>:<port>/dir/file_name
fs.ls [-l] [-a] http://<filer_server>:<port>/dir/file_prefix
2019-03-26 19:43:51 +00:00
`
}
func (c *commandFsLs) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
2019-03-26 19:43:51 +00:00
var isLongFormat, showHidden bool
for _, arg := range args {
if !strings.HasPrefix(arg, "-") {
break
2019-03-26 19:43:51 +00:00
}
for _, t := range arg {
switch t {
case 'a':
showHidden = true
case 'l':
isLongFormat = true
}
}
}
input := findInputDirectory(args)
filerServer, filerPort, path, err := commandEnv.parseUrl(input)
2019-03-26 19:43:51 +00:00
if err != nil {
return err
}
if commandEnv.isDirectory(filerServer, filerPort, path) {
path = path + "/"
}
2019-03-26 19:43:51 +00:00
2020-03-23 07:01:34 +00:00
dir, name := util.FullPath(path).DirAndName()
2019-12-13 08:22:37 +00:00
entryCount := 0
2019-03-26 19:43:51 +00:00
2020-03-23 07:01:34 +00:00
err = filer_pb.ReadDirAllEntries(commandEnv.getFilerClient(filerServer, filerPort), util.FullPath(dir), name, func(entry *filer_pb.Entry, isLast bool) {
2019-03-26 19:43:51 +00:00
2019-12-13 08:22:37 +00:00
if !showHidden && strings.HasPrefix(entry.Name, ".") {
2019-03-26 19:43:51 +00:00
return
}
2019-12-13 08:22:37 +00:00
entryCount++
2019-03-26 19:43:51 +00:00
2019-12-13 08:22:37 +00:00
if isLongFormat {
fileMode := os.FileMode(entry.Attributes.FileMode)
userName, groupNames := entry.Attributes.UserName, entry.Attributes.GroupName
if userName == "" {
if user, userErr := user.LookupId(strconv.Itoa(int(entry.Attributes.Uid))); userErr == nil {
userName = user.Username
2019-03-26 19:43:51 +00:00
}
2019-12-13 08:22:37 +00:00
}
groupName := ""
if len(groupNames) > 0 {
groupName = groupNames[0]
}
if groupName == "" {
if group, groupErr := user.LookupGroupId(strconv.Itoa(int(entry.Attributes.Gid))); groupErr == nil {
groupName = group.Name
2019-03-26 19:43:51 +00:00
}
}
2019-12-13 08:22:37 +00:00
if dir == "/" {
// just for printing
dir = ""
}
fmt.Fprintf(writer, "%s %3d %s %s %6d %s/%s\n",
fileMode, len(entry.Chunks),
userName, groupName,
filer2.TotalSize(entry.Chunks), dir, entry.Name)
} else {
fmt.Fprintf(writer, "%s\n", entry.Name)
2019-03-26 19:43:51 +00:00
}
2019-12-13 08:22:37 +00:00
})
if isLongFormat && err == nil {
2019-03-26 19:43:51 +00:00
fmt.Fprintf(writer, "total %d\n", entryCount)
}
return
}