dir_sizer 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|