diff --git a/weed/shell/command_fs_rm.go b/weed/shell/command_fs_rm.go index 4ee96ecf0..b383366ca 100644 --- a/weed/shell/command_fs_rm.go +++ b/weed/shell/command_fs_rm.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "strings" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" @@ -21,47 +22,79 @@ func (c *commandFsRm) Name() string { } func (c *commandFsRm) Help() string { - return `remove a file or a folder, recursively delete all files and folders + return `remove file and directory entries - fs.rm + fs.rm [-rf] ... - fs.rm /dir/file_name + fs.rm /dir/file_name1 dir/file_name2 fs.rm /dir + + The option "-r" can be recursive. + The option "-f" can be ignored by recursive error. ` } func (c *commandFsRm) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { - - if len(args) != 1 { - return fmt.Errorf("need to have arguments") + isRecursive := false + ignoreRecursiveError := false + var entiries []string + for _, arg := range args { + if !strings.HasPrefix(arg, "-") { + entiries = append(entiries, arg) + continue + } + for _, t := range arg { + switch t { + case 'r': + isRecursive = true + case 'f': + ignoreRecursiveError = true + } + } } - - targetPath, err := commandEnv.parseUrl(args[0]) - if err != nil { - return err + if len(entiries) < 1 { + return fmt.Errorf("need to have arguments") } - targetDir, targetName := util.FullPath(targetPath).DirAndName() - - return commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - - request := &filer_pb.DeleteEntryRequest{ - Directory: targetDir, - Name: targetName, - IgnoreRecursiveError: true, - IsDeleteData: true, - IsRecursive: true, - IsFromOtherCluster: false, - Signatures: nil, - } - _, err = client.DeleteEntry(context.Background(), request) - - if err == nil { - fmt.Fprintf(writer, "remove: %s\n", targetPath) + commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + for _, entry := range entiries { + targetPath, err := commandEnv.parseUrl(entry) + if err != nil { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, err) + continue + } + + targetDir, targetName := util.FullPath(targetPath).DirAndName() + + lookupRequest := &filer_pb.LookupDirectoryEntryRequest{ + Directory: targetDir, + Name: targetName, + } + _, err = filer_pb.LookupEntry(client, lookupRequest) + if err != nil { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, err) + continue + } + + request := &filer_pb.DeleteEntryRequest{ + Directory: targetDir, + Name: targetName, + IgnoreRecursiveError: ignoreRecursiveError, + IsDeleteData: true, + IsRecursive: isRecursive, + IsFromOtherCluster: false, + Signatures: nil, + } + if resp, err := client.DeleteEntry(context.Background(), request); err != nil { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, err) + } else { + if resp.Error != "" { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, resp.Error) + } + } } - - return err - + return nil }) + return }