anchor.diff:      return rel == '.' ? replacer(to) : join(to, replacer(rel));
     }
   
  -  Future runCommand(String command, File file) async {
  +  Future runCommand(String command, List<File> files) async {
       final args = command.split(' ');
  -    final result = await Process.run(
  -        args.first,
  -        []
  -          ..addAll(args.skip(1))
  -          ..add(file.path));
  +    final result = await Process.run(args.first,
  +        []..addAll(args.skip(1))..addAll(files.map((file) => file.path)));
       if (result.exitCode == 0) {
         stdout.write(result.stdout);
       } else {
  -      stderr.writeln(
  -          'Command `$command` failed on ${file.path}:\n${result.stderr}');
  +      stderr
  +          .writeln('Command `$command` failed on ${files}:\n${result.stderr}');
       }
     }
   
  
positive.code:   if (dryRun) return;
  
    await Future.wait(clones.map((c) => c.perform()));
  }
  
  printClones(List<FileClone> clones) {
  
negative.code:   ..addOption('edit-command',
        help:
            'Command to run on existing files. The path of the file is appended to the command')
    ..addOption('copy-command',
        help:
            'Command to run on each old/new file pair, to initiate a copy. The path of the files is appended to the command')
    ..addOption('add-command',
        help:
            'Command to run on added files. The path of the file is appended to the command')
    ..addOption('final-command',
        help:
            'Command to run on all output files at the end. The path of the all the files is appended to the command')
    ..addFlag('inflections',
        negatable: true,
        defaultsTo: true,
  