code: public int run(String[] args) {
      try {
        copy(conf, Arguments.valueOf(args, conf));
        return 0;
      } catch (IllegalArgumentException e) {
        System.err.println(StringUtils.stringifyException(e) + "\n" + usage);
        ToolRunner.printGenericCommandUsage(System.err);
        return -1;
      } catch (InvalidInputException e) {
        System.err.println(StringUtils.stringifyException(e) + "\n");
        return -1;
      } catch (DuplicationException e) {
        System.err.println(StringUtils.stringifyException(e));
        return DuplicationException.ERROR_CODE;
      } catch (RemoteException e) {
        final IOException unwrapped = e.unwrapRemoteException(
            FileNotFoundException.class, 
            AccessControlException.class,
            QuotaExceededException.class);
        System.err.println(StringUtils.stringifyException(unwrapped));
        return -3;
      } catch (Exception e) {
        System.err.println("With failures, global counters are inaccurate; " +
            "consider running with -i");
        System.err.println("Copy failed: " + StringUtils.stringifyException(e));
        return -999;
      }
    }
docs: This is the main driver for recursively copying directories
  across file systems. It takes at least two cmdline parameters. A source
  URL and a destination URL. It then essentially does an "ls -lR" on the
  source URL, and writes the output in a round-robin manner to all the map
  input files. The mapper actually copies the files allotted to it. The
  reduce is empty.