dir_sizer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/dir_sizer +4 -0
  3. data/lib/dir_sizer.rb +91 -0
  4. metadata +102 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9e5845f745aa54f550cc52158d2b9c3d7ec3fbe78526bc445a069388add0275b
4
+ data.tar.gz: d17646d2098426c4d6168eb372dec5fc2175db62a25738c4d5bb7748504d8dd2
5
+ SHA512:
6
+ metadata.gz: 54c6c8bd853830d28fc968824f24a2450676f4d41855ceee8f9d456884c636c76026f9e29e304b0d4764490b572468b80988b72707fc904cc50c6e08b48d8ddf
7
+ data.tar.gz: 7037c6a69de736cad5696446c8d802a3cb3621f5d95d938a21ddddaf39ea74e4bb479171bca2464a1a4b9e1f447cfd05797349e57eb3db46258e45c9a85c818d
data/bin/dir_sizer ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'dir_sizer'
4
+ puts DirSizer.execute(ARGV[0])
data/lib/dir_sizer.rb ADDED
@@ -0,0 +1,91 @@
1
+ require 'filesize'
2
+ require 'terminal-table'
3
+ require 'highline'
4
+ require 'sys/filesystem'
5
+
6
+ class DirSizer
7
+ def self.execute(dir)
8
+ unless Dir.exist?(dir) && File.directory?(dir)
9
+ puts "not a directory: #{dir}"
10
+ exit(3)
11
+ end
12
+ init_dirs_to_ignore(dir)
13
+
14
+ puts "Calculating size of directory #{dir}"
15
+ size_hash = calculate_size_hash(dir)
16
+ contents = calculate_size(size_hash)
17
+ puts 'done'
18
+
19
+ browse_contents(contents)
20
+ end
21
+
22
+ def self.init_dirs_to_ignore(dir)
23
+ @dirs_to_ignore = ['/dev', '/private/var/db/ConfigurationProfiles/Store', '/private/var/folders', '/Volumes/com.apple.TimeMachine.localsnapshots']
24
+ Sys::Filesystem.mounts{ |mount|
25
+ @dirs_to_ignore << mount.mount_point unless mount.mount_point == dir
26
+ }
27
+ end
28
+
29
+ def self.calculate_size_hash(dir)
30
+ print '.' if dir.count('/') < 6
31
+ print dir if dir.count('/') < 4
32
+ r = { :dirs => {}, :files => {}, :dir => dir}
33
+ Dir.entries(dir).each { |e|
34
+ next if ['.', '..'].include? e
35
+ t = File.join(dir, e)
36
+ next if File.symlink? t
37
+ next if @dirs_to_ignore.include? t
38
+ if File.directory?(t)
39
+ r[:dirs][t] = calculate_size_hash(t)
40
+ else
41
+ r[:files][t] = File.stat(t).size
42
+ end
43
+ }
44
+ r
45
+ end
46
+
47
+ def self.calculate_size(hash)
48
+ t = {}
49
+ hash[:dirs].each { |d,h|
50
+ size_d = calculate_size(h)
51
+ t[d] = size_d
52
+ }
53
+ size_dirs = t.values.map{ |v|
54
+ v[:total]
55
+ }.inject { |sum, n| sum + n } || 0
56
+ size_files = hash[:files].values.inject { |sum, n| sum + n } || 0
57
+ { :dirs => t, :total => size_files + size_dirs, :dirs_by_size => t.sort_by{|d,h| h[:total] }.reverse, :dir => hash[:dir] }
58
+ end
59
+
60
+ def self.browse_contents(content)
61
+ cli = HighLine.new
62
+ contents = content
63
+ back_stack = []
64
+
65
+ loop do
66
+ print_table contents
67
+ a = cli.ask("Type number of directory? ('..' for parent directory, 'e' to exit)")
68
+ case a
69
+ when 'e'
70
+ break
71
+ when '..'
72
+ contents = back_stack.pop
73
+ else
74
+ back_stack.push contents
75
+ next_dir = contents[:dirs_by_size][a.to_i][0]
76
+ contents = contents[:dirs][next_dir]
77
+ end
78
+ end
79
+ end
80
+
81
+ def self.print_table(contents)
82
+ output = []
83
+ output << ['', Filesize.from("#{contents[:total]} B").pretty, contents[:dir]]
84
+ contents[:dirs_by_size].each_with_index{ |t,i|
85
+ s = Filesize.from("#{t[1][:total]} B").pretty
86
+ output << [i, s, t[0]]
87
+ }
88
+ puts Terminal::Table.new :headings => ['Cmd', 'Dir', 'Size'], :rows => output
89
+ end
90
+
91
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dir_sizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Marc Doerflinger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sys-filesystem
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.9
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.9
27
+ - !ruby/object:Gem::Dependency
28
+ name: filesize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: highline
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: terminal-table
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.8.0
69
+ description: 'Directory sizing tool '
70
+ email: mdoerflinger@gmail.com
71
+ executables:
72
+ - dir_sizer
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - bin/dir_sizer
77
+ - lib/dir_sizer.rb
78
+ homepage: http://rubygems.org/gems/dir_sizer
79
+ licenses:
80
+ - MIT
81
+ metadata: {}
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubyforge_project:
98
+ rubygems_version: 2.7.3
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: calculate size of a given directory
102
+ test_files: []