Guest User

Untitled

a guest
Oct 27th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 1.69 KB | None | 0 0
  1. module main;
  2.  
  3. import std.stdio, std.file, std.path, std.algorithm;
  4.  
  5. enum EqualBy {
  6.     Size, Name
  7. }
  8.  
  9. int main(string[] argv)
  10. {
  11.     string[] dirs;
  12.     EqualBy equality = EqualBy.Size;
  13.    
  14.     foreach(int i, string arg; argv) {
  15.         if (i == 0) continue;// skip program name
  16.         switch(arg)
  17.         {
  18.         case `-s`: equality = EqualBy.Size; break;
  19.         case `-n`: equality = EqualBy.Name; break;
  20.         case `?`: PrintUsage(argv[0]); return 0;
  21.         default: dirs ~= arg; break;
  22.         }
  23.     }
  24.    
  25.     FileInfo[][] files; files.length = dirs.length;
  26.     // assemble all files in all specified directories
  27.     foreach(int i, string dir; dirs) {
  28.         foreach (string name; dirEntries(dir, SpanMode.breadth))
  29.         {
  30.             if (isDir(name)) continue;
  31.             files[i] ~= FileInfo(basename(name), name, getSize(name));
  32.         }
  33.     }
  34.     // find similar files from the first dir in another dirs
  35.     foreach(FileInfo fi; files[0]) {
  36.         for(int i=1; i < files.length; i++) {
  37.             foreach(FileInfo fi2; files[i]) {
  38.                 if (fi.fullName == fi2.fullName) continue;
  39.                 if (endsWith(fi.name, ".db") || endsWith(fi.name, ".BUP") || endsWith(fi.name, ".IFO") || endsWith(fi.name, ".VOB")) continue;// skip DVD files
  40.                
  41.                 if((equality == EqualBy.Size && (fi.size == fi2.size)) ||
  42.                    (equality == EqualBy.Name && (fi.name == fi2.name)))
  43.                 {
  44.                     writeln(`EQ1: ` ~ fi.fullName);
  45.                     writeln(`EQ2: ` ~ fi2.fullName);
  46.                     writeln();
  47.                 }
  48.             }
  49.         }
  50.     }
  51.    
  52.     return 0;
  53. }
  54.  
  55. void PrintUsage(string programName)
  56. {
  57.     writeln("Find duplicates utility. Usage:\n" ~ programName ~ ` [options] Dir1 Dir2 ...` ~
  58. `
  59. Options:
  60. -s : treat equality by size (default)
  61. -n : -//- by name
  62. `);
  63. }
  64.  
  65. struct FileInfo
  66. {
  67.     string name;
  68.     string fullName;
  69.     ulong size;
  70. }
Add Comment
Please, Sign In to add comment