dir_sizer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/dir_sizer +4 -0
- data/lib/dir_sizer.rb +91 -0
- 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
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: []
|