ソースを参照

HADOOP-665. Extend many DFSShell commands to accept multiple arguments. Contributed by Dhruba.

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@471023 13f79535-47bb-0310-9956-ffa450edef68
Doug Cutting 18 年 前
コミット
30d2a9a7d9
2 ファイル変更90 行追加15 行削除
  1. 6 2
      CHANGES.txt
  2. 84 13
      src/java/org/apache/hadoop/dfs/DFSShell.java

+ 6 - 2
CHANGES.txt

@@ -137,8 +137,12 @@ Trunk (unreleased changes)
 38. HADOOP-647.  Permit map outputs to use a different compression
     type than the job output.  (omalley via cutting)
 
-39. HADOOP-671.  File cache should not create symlinks when they
-    already exist.  (Mahadev Konar via cutting)
+39. HADOOP-671.  Fix file cache to check for pre-existence before
+    creating .  (Mahadev Konar via cutting)
+
+40. HADOOP-665.  Extend many DFSShell commands to accept multiple
+    arguments.  Now commands like "ls", "rm", etc. will operate on
+    multiple files.  (Dhruba Borthakur via cutting)
 
 
 Release 0.7.2 - 2006-10-18

+ 84 - 13
src/java/org/apache/hadoop/dfs/DFSShell.java

@@ -607,6 +607,64 @@ public class DFSShell extends ToolBase {
       System.out.println( "Safe mode is " + ( mode ? "ON" : "OFF" ));
     }
 
+    /**
+     * Apply operation specified by 'cmd' on all parameters
+     * starting from argv[startindex].
+     */
+    private int doall(String cmd, String argv[], Configuration conf, 
+                      int startindex) {
+      int exitCode = 0;
+      int i = startindex;
+      //
+      // for each source file, issue the command
+      //
+      for (; i < argv.length; i++) {
+        try {
+          //
+          // issue the command to the remote dfs server
+          //
+          if ("-cat".equals(cmd)) {
+              cat(argv[i]);
+          } else if ("-mkdir".equals(cmd)) {
+              mkdir(argv[i]);
+          } else if ("-rm".equals(cmd)) {
+              delete(argv[i], false);
+          } else if ("-rmr".equals(cmd)) {
+              delete(argv[i], true);
+          } else if ("-du".equals(cmd)) {
+              du(argv[i]);
+          } else if ("-ls".equals(cmd)) {
+              ls(argv[i], false);
+          } else if ("-lsr".equals(cmd)) {
+              ls(argv[i], true);
+          }
+        } catch (RemoteException e) {
+          //
+          // This is a error returned by hadoop server. Print
+          // out the first line of the error mesage.
+          //
+          exitCode = -1;
+          try {
+            String[] content;
+            content = e.getLocalizedMessage().split("\n");
+            System.err.println(cmd.substring(1) + ": " +
+                               content[0]);
+          } catch (Exception ex) {
+            System.err.println(cmd.substring(1) + ": " +
+                               ex.getLocalizedMessage());
+          }
+        } catch (IOException e) {
+          //
+          // IO exception encountered locally.
+          //
+          exitCode = -1;
+          System.err.println(cmd.substring(1) + ": " +
+                             e.getLocalizedMessage());
+        }
+      }
+      return exitCode;
+    }
+
     /**
      * Displays format of commands.
      * 
@@ -703,9 +761,7 @@ public class DFSShell extends ToolBase {
                   printUsage(cmd);
                   return exitCode;
                 }
-        } else if ("-rm".equals(cmd) || "-rmr".equals(cmd) ||
-                 "-cat".equals(cmd) || "-mkdir".equals(cmd) ||
-                 "-safemode".equals(cmd)) {
+        } else if ("-safemode".equals(cmd)) {
                 if (argv.length != 2) {
                   printUsage(cmd);
                   return exitCode;
@@ -720,6 +776,12 @@ public class DFSShell extends ToolBase {
                   printUsage(cmd);
                   return exitCode;
                 }
+        } else if ("-rm".equals(cmd) || "-rmr".equals(cmd) ||
+                   "-cat".equals(cmd) || "-mkdir".equals(cmd)) {
+                if (argv.length < 2) {
+                  printUsage(cmd);
+                  return exitCode;
+                }
         }
 
         // initialize DFSShell
@@ -748,30 +810,39 @@ public class DFSShell extends ToolBase {
                 else
                     copyMergeToLocal(argv[i++], new Path(argv[i++]));
             } else if ("-cat".equals(cmd)) {
-                cat(argv[i++]);
+                doall(cmd, argv, conf, i);
             } else if ("-moveToLocal".equals(cmd)) {
                 moveToLocal(argv[i++], new Path(argv[i++]));
             } else if ("-setrep".equals(cmd)) {
             	setReplication(argv, i);           
             } else if ("-ls".equals(cmd)) {
-                String arg = i < argv.length ? argv[i++] : "";
-                ls(arg, false);
+                if (i < argv.length) {
+                    doall(cmd, argv, conf, i);
+                } else {
+                    ls("", false);
+                } 
             } else if ("-lsr".equals(cmd)) {
-                String arg = i < argv.length ? argv[i++] : "";
-                ls(arg, true);
+                if (i < argv.length) {
+                    doall(cmd, argv, conf, i);
+                } else {
+                    ls("", true);
+                } 
             } else if ("-mv".equals(cmd)) {
                 exitCode = rename(argv, conf);
             } else if ("-cp".equals(cmd)) {
                 exitCode = copy(argv, conf);
             } else if ("-rm".equals(cmd)) {
-                delete(argv[i++], false);
+                doall(cmd, argv, conf, i);
             } else if ("-rmr".equals(cmd)) {
-                delete(argv[i++], true);
+                doall(cmd, argv, conf, i);
             } else if ("-du".equals(cmd)) {
-                String arg = i < argv.length ? argv[i++] : "";
-                du(arg);
+                if (i < argv.length) {
+                    doall(cmd, argv, conf, i);
+                } else {
+                    du("");
+                }
             } else if ("-mkdir".equals(cmd)) {
-                mkdir(argv[i++]);
+                doall(cmd, argv, conf, i);
             } else if ("-report".equals(cmd)) {
                 report();
             } else if ("-safemode".equals(cmd)) {