Advertisement
usamimi2323

重複ファイル確認作業補助用HTMLファイル作成.js

Nov 10th, 2023 (edited)
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 8.12 KB | Source Code | 0 0
  1. //////////////////////////////////////////////////////////////////
  2. //
  3. // 重複ファイル確認作業補助用HTMLファイル作成JScript (Windows)
  4. //
  5. // [使い方]
  6. //
  7. // wscript.exe <スクリプトファイル名>
  8. // cscript.exe <スクリプトファイル名>
  9. //
  10. // ・確認作業はスクリプト起動→HTMLファイル出力→ブラウザ→EveryThingで検索という流れで行うため
  11. //  EveryThingのES:プロトコルハンドラーを有効にしておく
  12. //
  13. //  EveryThing - https://www.voidtools.com/
  14. //
  15. // ・下の「入力フォルダリスト」に重複を検出したい対象フォルダをセット
  16. //  (\は\\に変換しておく)
  17. // ・wscript.exe <このスクリプトファイル名> で実行
  18. // ・処理後に結果が「ブラウザで表示」される
  19. // ・リンクからEveryThingの検索
  20. // ・目視で重複確認、必要ならファイルの中身チェック、不要ファイルを削除
  21. //
  22. //
  23. // [注意点]
  24. // ・"(カテゴリ) [作者名] タイトル ...第01巻" or "[作者名] タイトル ...第01巻"
  25. //  という書式の日本語ファイル名を想定
  26. //
  27. // ・「判定がガバガバ」なので同一作者でタイトルが少し違っていても重複と判定。
  28. //  EveryThing上での目視判断必須。
  29. //
  30. ////////////////////////////////////////////////////////////////////////////////////
  31.  
  32. // 「入力フォルダリスト」
  33. var arg_dirs =[
  34.  
  35. "C:\\download1",
  36. "C:\\download2",
  37. "C:\\download3",
  38. "C:\\download4",
  39.  
  40. ""];
  41.  
  42.  
  43.  
  44.  
  45. //出力ファイルパス (指定がなければテンポラリフォルダに一時ファイルを作成して使用)
  46. //var output_html_file = "C:\\dup_check_test.html";
  47. var output_html_file = "";
  48. var delete_output_html_file = true;
  49. //var delete_output_html_file = false;
  50.  
  51. ////////////////////////////////////////////////////////////////////////////////////
  52.  
  53. var FILES = {};
  54. var FILES_2 = {};
  55. var limit = 0;
  56. var fs = new ActiveXObject( "Scripting.FileSystemObject" );
  57. var dup_count = 0;
  58. var dup_size = 0;
  59.  
  60. if (!output_html_file)
  61. {
  62.     output_html_file = fs.GetSpecialFolder(2) + "\\$" + Math.random().toString(36).slice(-8) + ".html";
  63. }
  64.  
  65. for (var i=0; i < arg_dirs.length; i++)
  66. {
  67.     if (!arg_dirs[i]) continue;
  68.     var folder = fs.GetFolder(arg_dirs[i]);
  69.     var items = [null,null];
  70.     items[0] = new Enumerator(folder.SubFolders);
  71.     items[1] = new Enumerator(folder.Files);
  72.     for (var j=0; j<items.length; j++)
  73.     {
  74.         for (; !items[j].atEnd(); items[j].moveNext())
  75.         {
  76.             var filename = items[j].item().Name;
  77.            
  78.             var title = "";
  79.             var is_completed = false;
  80.             var number_1 = 1;
  81.             var number_2 = 0;
  82.             var r = null;
  83.            
  84. //          if ( r = filename.match(/^(?:\([^\)]+?\) *)?(\[[^\]]+?\] +.+?)(?:(?: |!|?|。|、).*?)? (全|第)?(\d+)(?:-(\d+))?巻/) )
  85.             if ( r = filename.match(/^(?:\([^\)]+?\) *)?(\[[^\]]+?\] +.+?)(?:(?: |\uFF01|\uFF1F|\u3002|\u3001).*?)? (\u7B2C|\u5168)?(\d+)(?:-(\d+))?\u5DFB/) )
  86.             {
  87.                 title = r[1];
  88.                 is_completed = (r[2] && (r[2] == "\u5168"));
  89. //              is_completed = (r[2] && (r[2] == "全"));
  90.                 number_1 = Number(r[3]);
  91.                 number_2 = r[4]?Number(r[4]):0;
  92.             }
  93.             else if (
  94. //              (r = filename.match(/^(?:\([^\)]+?\) *)?(\[[^\]]+?\] +.+?)(?:(?: |!|?|。|、).*?)? v(\d+)(?:\-(\d+))?/))
  95. //              && (r = filename.match(/^(?:\([^\)]+?\) *)?(\[[^\]]+?\] +.+?)(?:(?: |!|?|。|、).*?)? (\d+)(?:\-(\d+))?/))
  96.                 (r = filename.match(/^(?:\([^\)]+?\) *)?(\[[^\]]+?\] +.+?)(?:(?: |\uFF01|\uFF1F|\u3002|\u3001).*?)? v(\d+)(?:\-(\d+))?/))
  97.                 && (r = filename.match(/^(?:\([^\)]+?\) *)?(\[[^\]]+?\] +.+?)(?:(?: |\uFF01|\uFF1F|\u3002|\u3001).*?)? (\d+)(?:\-(\d+))?/))
  98.                 )
  99.             {
  100.                 title = r[1];
  101.                 number_1 = Number(r[2]);
  102.                 number_2 = r[3]?Number(r[3]):0;
  103.             }
  104.             else
  105.                 continue;
  106.            
  107. //          if (r = title.match(/^(\[[^\]]+?\] .+)(~|-|ー|-|―).+\2/))
  108. //          if (r = title.match(/^(\[[^\]]+?\] .+)(\uFF5E|\-|\uFF70|\uFF0D|\u2015).+\2/))
  109. //              title = r[1];
  110.             title = title.replace(/^(\[[^\]]+?\] .+?) *(\uFF5E|\-|\uFF70|\uFF0D|\u2015).+\2/, "$1");
  111.            
  112.             var size = items[j].item().Size;
  113.             if (size == 0)
  114.             {
  115. //              if (j==0)
  116. //                  WScript.echo("Size=0 error. "+filename);
  117.                 continue;
  118.             }
  119.  
  120.             if (is_completed)
  121.             {
  122.                 number_2 = number_1;
  123.                 number_1 = 1;
  124.             }
  125.            
  126.             var numbers = [];
  127.             if (number_2 != 0)
  128.             {
  129.                 if (number_2 <= number_1) continue;
  130.                
  131.                 for (var k=number_1;k<=number_2;k++)
  132.                     numbers.push(k);
  133.             }
  134.             else
  135.             {
  136.                 numbers = [number_1];
  137.             }
  138.            
  139.             for (var k=0;k<numbers.length;k++)
  140.             {
  141.                 var x = title + "<>" + numbers[k];
  142.                
  143.                 if (x in FILES)
  144.                 {
  145.                     // 重複検出
  146.                     FILES[x] += 1;
  147.                    
  148.                     if (title in FILES_2)
  149.                         FILES_2[title] += 1;
  150.                     else
  151.                         FILES_2[title] =  1;
  152.                     dup_count++;
  153.                     dup_size+=size;
  154.                 }
  155.                 else
  156.                     // 未だ重複無し
  157.                     FILES[x] = 1;
  158.                
  159. //              WScript.echo(FILES[x] +"\t"+ x);
  160.             }
  161.         }
  162.        
  163.         items[j]=null;
  164.     }
  165. }
  166.  
  167. // ソート
  168. var FILES_3 = [];
  169. for (x in FILES_2) FILES_3.push(x);
  170. FILES_3 = FILES_3.sort();
  171.  
  172. // Object FILES = {"[BOOK_AUTHOR] BOOK_TITLE_WORD<>NUMBER":COUNT, ...};
  173.  
  174. // COUNT2以上の重複した"[BOOK_AUTHOR] BOOK_TITLE_WORD<>NUMBER"から"<>NUMBER"を除去して
  175. // 表示/検索ワード用の"[BOOK_AUTHOR] BOOK_TITLE_WORD"をkeyにする
  176. // Object FILES2 = {"[BOOK_AUTHOR] BOOK_TITLE_WORD":COUNT, ...};
  177.  
  178. // Object FILES3 = ["[BOOK_AUTHOR] BOOK_TITLE_WORD", ...];
  179.  
  180. // 重複ファイルリストをHTMLファイルへ出力
  181. var fout = fs.OpenTextFile( output_html_file, 2, true );
  182. fout.Write("<div>重複ファイル数:"+dup_count+", 合計サイズ:"+dup_size.toLocaleString().replace(/\.00$/,"")+" bytes ("+ sizeStr(dup_size) +")</div>\n");
  183. fout.Write("<div>ソート:<button onclick=\"sortElemByCount()\">ファイル数</button><button onclick=\"sortElemByTitle()\">タイトル</button></div><br>\n");
  184. fout.Write("<div id=dup_list>\n");
  185. for (var i=0; i<FILES_3.length; i++)
  186. {
  187.     if (r = FILES_3[i].match(/^\[(.+)\] (.+)/))
  188.     {
  189.         var base = r[2];
  190. //      var authors = r[1].split(/(\&|&|×|\,|、|,|/)/g);
  191.         var authors = r[1].split(/(\&|\uFF06|\u00D7|\,|\u3001|\uFF0C|\uFF0F)/g);
  192.         authors.push(base);
  193.        
  194.         fout.Write("<div class=\"item\"><span class=count>"+FILES_2[FILES_3[i]]+"</span> <a href=\"es:" + authors.join("%20") + "\"><span class=disp_title>" + FILES_3[i] + "</span></a></div>\n");
  195.     }
  196. }
  197. fout.Write("</div>\n");
  198. // ソート用JavaScript
  199. fout.Write(
  200.     "<script>\n"+
  201.     "var sortElem = f => {\n"+
  202.     "   let d=document.getElementById('dup_list');\n"+
  203.     "   let a=Array.prototype.slice.call(document.querySelectorAll('div.item'));\n"+
  204.     "   a.sort(f);\n"+
  205.     "   for (let i=0;i<a.length;i++)d.appendChild(d.removeChild(a[i]));\n"+
  206.     "};\n"+
  207.     "var countSortFnA = (a,b)=>Number(a.querySelector('span.count').textContent)-Number(b.querySelector('span.count').textContent);\n"+
  208.     "var titleSortFnA = (a,b)=>a.querySelector('span.disp_title').textContent.localeCompare(b.querySelector('span.disp_title').textContent);\n"+
  209.     "var countSortFnB = (a,b)=>countSortFnA(b,a);\n"+
  210.     "var titleSortFnB = (a,b)=>titleSortFnA(b,a);\n"+
  211.     "window.sortElemByCount = ()=>sortElem((window.sort_title_f=true,window.sort_count_f=window.sort_count_f?false:true)?countSortFnB:countSortFnA);\n"+
  212.     "window.sortElemByTitle = ()=>sortElem((window.sort_count_f=false,window.sort_title_f=window.sort_title_f?false:true)?titleSortFnB:titleSortFnA);\n"+
  213.     "</script>\n"
  214. );
  215.  
  216. fout.Close();
  217. fout = null;
  218.  
  219. // 出力したHTMLファイルを関連づけられたアプリで起動
  220. var command = "\"" + output_html_file + "\"";
  221. var shell = WScript.CreateObject('WScript.Shell');
  222. //shell.Run(command, 1, true);
  223. shell.Run(command);
  224. shell=null;
  225.  
  226. // ブラウザに読ませた後、HTMLファイルを削除
  227. if (delete_output_html_file)
  228. {
  229.     WScript.Sleep(10 * 1000);
  230.     fs.DeleteFile(output_html_file);
  231. }
  232.  
  233. fs = null;
  234.  
  235.  
  236. function sizeStr(d)
  237. {
  238.     var current = Math.floor(d);
  239.     var basic = 1000;
  240.     var units = ['bytes','KB','MB','GB','TB','PB'];
  241.     var i=0;
  242.     while (i < units.length)
  243.     {
  244.         var tmp = Math.floor(current/basic);
  245.         if (0==tmp) break;
  246.         current = tmp;
  247.         i++;
  248.     }
  249.     return current.toLocaleString().replace(/\.00$/,"")+units[i];
  250. }
  251.  
  252.  
  253.  
  254.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement