Guest User

Untitled

a guest
Jan 18th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. # -*- coding:utf-8 -*-
  3.  
  4. # TODO: Check same file with soft link
  5. # TODO: Trim same file by apfs clone
  6.  
  7. require 'set'
  8. require 'find'
  9. require 'digest'
  10. require 'fileutils'
  11.  
  12. TRASH = "#{ENV["HOME"]}/.Trash/Office/"
  13.  
  14. WORD_PATH = '/Applications/Microsoft Word.app'
  15. EXCEL_PATH = '/Applications/Microsoft Excel.app'
  16. ONENOTE_PATH = '/Applications/Microsoft OneNote.app'
  17. OUTLOOK_PATH = '/Applications/Microsoft Outlook.app'
  18. POWERPOINT_PATH = '/Applications/Microsoft PowerPoint.app'
  19.  
  20. PATHS = [WORD_PATH, EXCEL_PATH, ONENOTE_PATH, OUTLOOK_PATH, POWERPOINT_PATH]
  21. @target_path = nil
  22. @trim_paths = []
  23.  
  24. def find_all_files_without_prefix(dir)
  25. set = Set.new
  26. Find.find(dir) do |filename|
  27. unless File.directory? filename or File.symlink? filename
  28. set << filename[dir.length, filename.length] if filename != dir
  29. end
  30. end
  31. return set
  32. end
  33.  
  34. def find_same_files(dir1, dir2)
  35. set1 = find_all_files_without_prefix(dir1)
  36. set2 = find_all_files_without_prefix(dir2)
  37. set = set1 & set2
  38. same_files = set.select do |filename|
  39. File.lstat(dir1+filename).ino != File.lstat(dir2+filename).ino \
  40. and FileUtils.compare_file(dir1+filename, dir2+filename)
  41. end
  42. return same_files
  43. end
  44.  
  45. def backup_file(filename)
  46. dest_filename = TRASH + filename
  47. FileUtils.mkdir_p File.dirname(dest_filename)
  48. puts "Move #{filename} to #{dest_filename}"
  49. FileUtils.mv filename, dest_filename
  50. end
  51.  
  52. def trim_all_same_files(target_dir, dir)
  53. same_files = find_same_files(target_dir, dir)
  54. same_files.each do |filename|
  55. backup_file dir+filename
  56. FileUtils.ln(target_dir+filename, dir+filename)
  57. end
  58. end
  59.  
  60.  
  61. def main
  62. if Process.euid != 0
  63. puts "Need root privilege, Please run: sudo ruby #{__FILE__}"
  64. exit 1
  65. end
  66.  
  67. PATHS.each do |pathname|
  68. if Dir.exist?(pathname)
  69. if @target_path
  70. @trim_paths << pathname
  71. else
  72. @target_path = pathname
  73. end
  74. end
  75. end
  76.  
  77. unless @target_path
  78. puts "Don't exist path in #{PATHS}"
  79. exit 1
  80. end
  81.  
  82. puts "Trim #{@trim_paths} with #{@target_path}"
  83. @trim_paths.each do |pathname|
  84. puts "#{@target_path}, #{pathname}"
  85. trim_all_same_files(@target_path, pathname)
  86. end
  87.  
  88. puts "Office thinning completed!"
  89. puts "Backup files in #{TRASH}, you view or delete the files later by Finder Trash."
  90. end
  91.  
  92. if __FILE__ == $0
  93. main
  94. end
Add Comment
Please, Sign In to add comment