rbfind 1.3.1
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 +15 -0
- data/LICENSE +34 -0
- data/Rakefile +18 -0
- data/bin/rbfind +474 -0
- data/lib/humansiz.rb +129 -0
- data/lib/rbfind.rb +895 -0
- metadata +65 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
OWM0NTUwYWZjYTk3NGNmNDQ4ZmZmZDA5Zjk4MDI1ZWVlMWYxOTliNA==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
OGFjM2UxYjQwNjFmMmI2ZGI2ZDkyNDE0MDJlOTBmNzA2ZTJlMTdhYw==
|
|
7
|
+
!binary "U0hBNTEy":
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
ODdhNDUxNjRiYjlhYTE1ZDFlYzA2ODRiNDJmNGIwZDhkNTE5MDU2ZDEzZGVm
|
|
10
|
+
ZWNhZTJmODI0ZDczZGE3MDEyOTUyZDY5YWJmNGYxZGY5NTQ4YzA4MmY4ZGY2
|
|
11
|
+
MTczYWYyODYwMzBjMTE3N2JhNTRjYWZhZWExYzY1OWM0Yzc0NmU=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
NGQ0OTg5N2UyYmQ5ODlmMmNiYTJiMjc5ZmNkMjRjNjFmYjVmNjYxZjU4MWY1
|
|
14
|
+
MTJkMTk2OTQxYmRmMmNjOTAyZWEyYTkyYzBjMTRjNWE4Mzg0NmE3ZWQ2N2Zm
|
|
15
|
+
MmRhODE1OTQ3ODAzYzQ2ODRhZjZlMmJiZmU5NzM2Y2UxNzQwODk=
|
data/LICENSE
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
____ _ _____ _ _
|
|
2
|
+
| _ \| |__ | ___(_)_ __ __| |
|
|
3
|
+
| |_) | '_ \| |_ | | '_ \ / _` |
|
|
4
|
+
| _ <| |_) | _| | | | | | (_| |
|
|
5
|
+
|_| \_\_.__/|_| |_|_| |_|\__,_|
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2008-2013, Bertram Scharpf <software@bertram-scharpf.de>.
|
|
9
|
+
All rights reserved.
|
|
10
|
+
|
|
11
|
+
Redistribution and use in source and binary forms, with or without
|
|
12
|
+
modification, are permitted provided that the following conditions are
|
|
13
|
+
met:
|
|
14
|
+
|
|
15
|
+
* Redistributions of source code must retain the above copyright
|
|
16
|
+
notice, this list of conditions and the following disclaimer.
|
|
17
|
+
|
|
18
|
+
* Redistributions in binary form must reproduce the above copyright
|
|
19
|
+
notice, this list of conditions and the following disclaimer in
|
|
20
|
+
the documentation and/or other materials provided with the
|
|
21
|
+
distribution.
|
|
22
|
+
|
|
23
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
24
|
+
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
25
|
+
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
26
|
+
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
27
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
28
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
29
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
30
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
31
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
32
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
33
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
34
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Rakefile -- build RbFind project
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
task "README" do |t|
|
|
6
|
+
File.open t.name, "w" do |readme|
|
|
7
|
+
readme.puts `ruby -I lib bin/rbfind --version`
|
|
8
|
+
readme.puts
|
|
9
|
+
readme.puts `ruby -I lib bin/rbfind --examples`
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
task :default => "README"
|
|
14
|
+
|
|
15
|
+
task :clean do |t|
|
|
16
|
+
sh "rm", "-fv", "README"
|
|
17
|
+
end
|
|
18
|
+
|
data/bin/rbfind
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
#!/usr/bin/ruby
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# rbfind -- Ruby Find with many features
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "rbfind"
|
|
8
|
+
|
|
9
|
+
PROGRAM = <<EOT
|
|
10
|
+
rbfind #{RbFind::VERSION} -- A find tool using Ruby
|
|
11
|
+
|
|
12
|
+
Author: Bertram Scharpf <software@bertram-scharpf.de>
|
|
13
|
+
License: BSD
|
|
14
|
+
EOT
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
require 'getoptlong'
|
|
18
|
+
|
|
19
|
+
OPTIONS = [
|
|
20
|
+
# options arg description
|
|
21
|
+
[ %w(--help -h), nil, "print this help"],
|
|
22
|
+
[ %w(--examples -X), nil, "print this help and examples"],
|
|
23
|
+
[ %w(--version -V), nil, "print version information"],
|
|
24
|
+
[ %w(--verbose -v), nil, "standard Ruby error reports"],
|
|
25
|
+
[ %w(--show -o), nil, "just show Ruby block built from options"],
|
|
26
|
+
[ %w(--bw -w), nil, "black and white on -p or default output"],
|
|
27
|
+
[ %w(--colored -c), nil, "force color on -p or default output"],
|
|
28
|
+
[ %w(--depth -d), nil, "yield directory after its contents"],
|
|
29
|
+
[ %w(--maxdepth -m), :num, "maxium step depth"],
|
|
30
|
+
[ %w(--follow -y), nil, "follow symbolic links"],
|
|
31
|
+
[ %w(--sort -s), :str, "=reverse/desc/-1,unsorted; default is sorted"],
|
|
32
|
+
[ %w(--sort-by -S), :str, "sort expression ('name' is name)"],
|
|
33
|
+
[ %w(--require -r), :rb, "require library"],
|
|
34
|
+
[ %w(--fileutils -U), nil, "include FileUtils module"],
|
|
35
|
+
[ %w(--puts-path -p), nil, "do 'puts path/cpath' on true block"],
|
|
36
|
+
[ %w(--ls-l -P), nil, "do 'ls -l' style output on true block"],
|
|
37
|
+
[ %w(--wider -+), nil, "widen fields in long output format (--ls-l)"],
|
|
38
|
+
[ %w(--lines -l), :blk, "surround block by 'lines { |$_,$.| ... }'"],
|
|
39
|
+
[ %w(--reallines -L), :blk, "same as -l but stop at any null character"],
|
|
40
|
+
[ %w(--grep -g), :blk, "grep files (implies -pL)"],
|
|
41
|
+
[ %w(--igrep -G), :blk, "case insensitive grep"],
|
|
42
|
+
[ %w(--binary -b), nil, "grep even binary files"],
|
|
43
|
+
[ %w(--no-vcs -C), nil, "prune version control dirs (CVS/.svn/.git)"],
|
|
44
|
+
[ %w(--no-swap -W), nil, "ignore Vim swapfiles"],
|
|
45
|
+
[ %w(--skip -k), :lst, "filenames to skip"],
|
|
46
|
+
[ %w(--demand -D), :lst, "skip all filenames but these"],
|
|
47
|
+
[ %w(--ext -e), :lst, "skip all filename extensions but these"],
|
|
48
|
+
[ %w(--visible -I), nil, "skip all hidden (starting with .dot)"],
|
|
49
|
+
[ %w(--begin -B), :blk, "eval block before begin"],
|
|
50
|
+
[ %w(--end -E), :blk, "eval block after end"],
|
|
51
|
+
[ %w(--file -f), :blk, "read block expression from file"],
|
|
52
|
+
[ %w(--encoding -K), :str, "encoding extern[:intern] (same as ruby -E)"],
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
def usage
|
|
56
|
+
puts <<EOT
|
|
57
|
+
Usage:
|
|
58
|
+
|
|
59
|
+
rbfind [options] path... 'block'
|
|
60
|
+
|
|
61
|
+
EOT
|
|
62
|
+
OPTIONS.each { |(long,short),arg,desc|
|
|
63
|
+
puts " %-12s %2s %-5s %s" % [long,short,arg.to_s.upcase,desc]
|
|
64
|
+
}
|
|
65
|
+
puts <<'EOT'
|
|
66
|
+
|
|
67
|
+
"--" stops option processing.
|
|
68
|
+
|
|
69
|
+
The last argument is a block that will be executed on every found
|
|
70
|
+
file object. It may be omitted; then "puts path" is assumed or "cpath"
|
|
71
|
+
in case the output is a terminal.
|
|
72
|
+
|
|
73
|
+
Default sort order is alphabetical.
|
|
74
|
+
|
|
75
|
+
EOT
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def usage_examples
|
|
79
|
+
usage
|
|
80
|
+
puts <<'EOT'
|
|
81
|
+
Examples:
|
|
82
|
+
$ rbfind -p 'file and age < 5.m'
|
|
83
|
+
$ rbfind -p 'file and age > 1.d'
|
|
84
|
+
$ rbfind -p '(90.d .. 183.d) === age'
|
|
85
|
+
|
|
86
|
+
$ rbfind -Cg require
|
|
87
|
+
$ rbfind -Cp
|
|
88
|
+
$ rbfind 'filesize < 100.kB and grep /require/'
|
|
89
|
+
$ rbfind -g 'define\s*ALLOC_N'
|
|
90
|
+
$ rbfind myproject -e rb -l '~/require/ and puts $_'
|
|
91
|
+
|
|
92
|
+
$ rbfind -pe '.rb c h'
|
|
93
|
+
$ rbfind /usr/include -e .h -g EACCES
|
|
94
|
+
$ rbfind -d -m3 -- /mnt/data
|
|
95
|
+
$ rbfind 'filesize > 10.MiB and colsep size.to_hib, path'
|
|
96
|
+
|
|
97
|
+
$ rbfind -S "name =~ /^\.*/ ; $'.downcase"
|
|
98
|
+
$ rbfind -B '$s=0' -E 'puts $s.to_h' 'filesize {|s|$s+=s}'
|
|
99
|
+
$ rbfind 'puts path if ext == ".rb"'
|
|
100
|
+
$ rbfind -p 'ext == ".rb"'
|
|
101
|
+
$ rbfind /usr/include -p -D '\.h$' -l '~/EACCES/'
|
|
102
|
+
$ rbfind /usr/include -pD 'pg|pq|postgres' dir
|
|
103
|
+
$ rbfind 'no_svn ; puts path'
|
|
104
|
+
$ rbfind 'prune if name == ".svn" ; puts path'
|
|
105
|
+
$ rbfind -p 'prune if name == ".svn"'
|
|
106
|
+
$ rbfind myproject 'name[/\.rb$/] and lines { |l,i| l=~/require/ and puts l }'
|
|
107
|
+
# rbfind /etc 'lines { |l,| l["192.168."] and (puts path ; break) }'
|
|
108
|
+
$ rbfind /etc 'readable? or raise "Access denied: #{path}" ;
|
|
109
|
+
> lines { |l,| l["192.168."] and (puts path ; break) }'
|
|
110
|
+
|
|
111
|
+
$ rbfind 'col_sep stype+modes, size[10], path'
|
|
112
|
+
$ rbfind 'tab_sep stype+modes, size[10], path'
|
|
113
|
+
$ rbfind 'spc_sep stype+modes, size.to_h, user, group, mtime.lsish, path'
|
|
114
|
+
$ rbfind 'spacesep stype+modes, size.to_h, user, group, mtime.lsish, path'
|
|
115
|
+
$ rbfind 'spacesep stype+modes, size.to_h, user, group, mtime!, path'
|
|
116
|
+
$ rbfind 'spacesep stype+modes, size.to_h, user, group, mtime.i, path'
|
|
117
|
+
$ rbfind 'spacesep mtime.u, path'
|
|
118
|
+
$ rbfind 'spacesep modes, user|8, group|8, size[8], cpath + carrow.to_s'
|
|
119
|
+
|
|
120
|
+
$ rbfind 'spacesep digest_md5, size[8], path'
|
|
121
|
+
$ rbfind 'spacesep digest_sha256, size[8], path'
|
|
122
|
+
|
|
123
|
+
$ rbfind 'rename name.downcase'
|
|
124
|
+
$ rbfind 'ext == ".tgz" and rename without_ext+".tar.gz"'
|
|
125
|
+
|
|
126
|
+
See the RbFind class documentation or the "rbfind.rb" source file for more
|
|
127
|
+
sophisticated examples and for a full list of file examination methods.
|
|
128
|
+
|
|
129
|
+
Valid units are 1.s, 1.m, 1.h, 1.d, 1.w for time values and
|
|
130
|
+
1.kB == 1000, 1.kiB == 1024, 1.MB, 1.MiB for file sizes.
|
|
131
|
+
EOT
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
require "humansiz"
|
|
136
|
+
require "English"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class Time
|
|
140
|
+
|
|
141
|
+
# autoload several formating methods
|
|
142
|
+
def method_missing sym, *args, &block
|
|
143
|
+
if require "time" then
|
|
144
|
+
send sym, *args, &block
|
|
145
|
+
else
|
|
146
|
+
super
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# several common schemes
|
|
151
|
+
def i ; iso8601 ; end
|
|
152
|
+
def x ; xmlschema ; end
|
|
153
|
+
def r ; rfc822 ; end
|
|
154
|
+
def u ; utc.strftime "%Y-%m-%d %H:%M:%S" ; end
|
|
155
|
+
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class Integer
|
|
160
|
+
# convenient formatting, right justification
|
|
161
|
+
def method_missing sym, *args
|
|
162
|
+
case sym.to_s # .to_s for Ruby 1.8
|
|
163
|
+
when /\Aw_?(\d+)/ then "%#{$1}d" % self
|
|
164
|
+
else super
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
class String
|
|
170
|
+
# convenient formatting, left justification
|
|
171
|
+
def method_missing sym, *args
|
|
172
|
+
case sym.to_s # .to_s for Ruby 1.8
|
|
173
|
+
when /\Aw_?(\d+)/ then ljust $1.to_i
|
|
174
|
+
else super
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
def | width
|
|
178
|
+
ljust width
|
|
179
|
+
end
|
|
180
|
+
# conventient date/time construction
|
|
181
|
+
def time
|
|
182
|
+
Time.parse self
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
class NilClass
|
|
187
|
+
# This makes it very easy to compare the return value of `filesize'.
|
|
188
|
+
def < oth ; false ; end
|
|
189
|
+
def <= oth ; false ; end
|
|
190
|
+
def > oth ; false ; end
|
|
191
|
+
def >= oth ; false ; end
|
|
192
|
+
def between? min, max ; false ; end
|
|
193
|
+
|
|
194
|
+
def [] width ; " "*width ; end
|
|
195
|
+
def | width ; " "*width ; end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def set_encoding extern, intern = nil
|
|
200
|
+
Encoding.default_external = extern if extern and not extern.empty?
|
|
201
|
+
Encoding.default_internal = intern if intern and not intern.empty?
|
|
202
|
+
[ $stdin, $stdout, $stderr].each do |io|
|
|
203
|
+
io.set_encoding extern, intern
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
class RbFindX < RbFind
|
|
209
|
+
|
|
210
|
+
# Alias the question marks away from all method names because
|
|
211
|
+
# they're a nuisance on the command line.
|
|
212
|
+
alias hidden hidden?
|
|
213
|
+
alias visible visible?
|
|
214
|
+
alias broken_link broken_link?
|
|
215
|
+
alias dir dir?
|
|
216
|
+
alias binary binary?
|
|
217
|
+
alias bin bin?
|
|
218
|
+
alias vimswap vimswap?
|
|
219
|
+
|
|
220
|
+
def blockdev ; blockdev? ; end
|
|
221
|
+
def chardev ; chardev? ; end
|
|
222
|
+
def directory ; directory? ; end
|
|
223
|
+
def executable ; executable? ; end
|
|
224
|
+
def executable_real ; executable_real? ; end
|
|
225
|
+
def file ; file? ; end
|
|
226
|
+
def grpowned ; grpowned? ; end
|
|
227
|
+
def owned ; owned? ; end
|
|
228
|
+
def pipe ; pipe? ; end
|
|
229
|
+
def readable ; readable? ; end
|
|
230
|
+
def readable_real ; readable_real? ; end
|
|
231
|
+
def setgid ; setgid? ; end
|
|
232
|
+
def setuid ; setuid? ; end
|
|
233
|
+
def socket ; socket? ; end
|
|
234
|
+
def sticky ; sticky? ; end
|
|
235
|
+
def symlink ; symlink? ; end
|
|
236
|
+
def writable ; writable? ; end
|
|
237
|
+
def writable_real ; writable_real? ; end
|
|
238
|
+
def zero ; zero? ; end
|
|
239
|
+
|
|
240
|
+
# convenient digest and time format methods
|
|
241
|
+
def method_missing sym, *args, &block
|
|
242
|
+
case sym.to_s
|
|
243
|
+
when /\Adigest_(.*)/, /\A([a-z]+[0-9]+)\z/ then
|
|
244
|
+
m = $1
|
|
245
|
+
c = m.upcase
|
|
246
|
+
begin
|
|
247
|
+
(Digest.const_get c).hexdigest read
|
|
248
|
+
rescue NameError
|
|
249
|
+
if m =~ /sha\d\d\d/ then m = "sha2" end
|
|
250
|
+
require "digest/#{m}" and retry
|
|
251
|
+
raise
|
|
252
|
+
end
|
|
253
|
+
when /\A([amc]time)!\z/ then
|
|
254
|
+
(send $1).strftime "%Y-%m-%d %H:%M:%S %z"
|
|
255
|
+
else
|
|
256
|
+
super
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
@params = {}
|
|
264
|
+
|
|
265
|
+
opts = GetoptLong.new *OPTIONS.map { |(long,short),arg,|
|
|
266
|
+
[long,short,(arg ? GetoptLong::REQUIRED_ARGUMENT : GetoptLong::NO_ARGUMENT)]
|
|
267
|
+
}
|
|
268
|
+
opts.ordering = GetoptLong::PERMUTE
|
|
269
|
+
opts.quiet = true
|
|
270
|
+
begin
|
|
271
|
+
opts.each do |opt,arg|
|
|
272
|
+
case opt
|
|
273
|
+
when '--help' then usage ; exit
|
|
274
|
+
when '--version' then puts PROGRAM ; exit
|
|
275
|
+
when '--examples' then usage_examples ; exit
|
|
276
|
+
when '--verbose' then @verbose = true
|
|
277
|
+
when '--show' then @show = true
|
|
278
|
+
when '--bw' then @color = false
|
|
279
|
+
when '--colored' then @color = true
|
|
280
|
+
when '--depth' then @params[ :depth] = true
|
|
281
|
+
when '--maxdepth' then @params[ :max_depth] = arg
|
|
282
|
+
when '--follow' then @params[ :follow] = true
|
|
283
|
+
when '--sort' then @params[ :sort] = arg
|
|
284
|
+
when '--sort-by' then
|
|
285
|
+
@params[ :sort] = instance_eval "proc { |name| #{arg} }"
|
|
286
|
+
when '--require' then require arg
|
|
287
|
+
when '--fileutils' then require "fileutils" ; include FileUtils
|
|
288
|
+
when '--puts-path' then @puts = true
|
|
289
|
+
when '--ls-l' then @puts = true ; @wd = 6
|
|
290
|
+
when '--wider' then @wd = @wd ? @wd.succ : 4
|
|
291
|
+
when '--lines' then @lines = :plain ; @block = arg
|
|
292
|
+
when '--reallines' then @lines = :plain ; @real = true ; @block = arg
|
|
293
|
+
when '--grep' then @lines = :grep ; @block = arg
|
|
294
|
+
when '--igrep' then @lines = :grep ; @icase = true ; @block = arg
|
|
295
|
+
when '--binary' then @binary = true
|
|
296
|
+
when '--no-vcs' then @vcs = true
|
|
297
|
+
when '--no-swap' then @vim = true
|
|
298
|
+
when '--skip' then @skip = arg
|
|
299
|
+
when '--demand' then @demand = arg
|
|
300
|
+
when '--ext' then @ext = arg
|
|
301
|
+
when '--visible' then @visible = true
|
|
302
|
+
when '--begin' then @blkbegin = arg
|
|
303
|
+
when '--end' then @blkend = arg
|
|
304
|
+
when '--file' then @block = File.read arg
|
|
305
|
+
when '--encoding' then e, i = arg.split ":" ; set_encoding e, i
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
rescue GetoptLong::InvalidOption
|
|
309
|
+
$stderr.puts $!
|
|
310
|
+
$stderr.puts
|
|
311
|
+
usage
|
|
312
|
+
exit 9
|
|
313
|
+
rescue
|
|
314
|
+
$stderr.puts $!
|
|
315
|
+
exit 8
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def color_on stream
|
|
319
|
+
unless @color.nil? then
|
|
320
|
+
@color
|
|
321
|
+
else
|
|
322
|
+
!File::ALT_SEPARATOR && stream.tty?
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
if color_on $stderr then
|
|
327
|
+
def show_error e
|
|
328
|
+
$stderr.puts "\e[31m#{e.class}: \e[1m#{e}\e[m"
|
|
329
|
+
end
|
|
330
|
+
else
|
|
331
|
+
def show_error e
|
|
332
|
+
$stderr.puts "#{e.class}: #{e}"
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def error_handle
|
|
337
|
+
if @verbose then
|
|
338
|
+
yield
|
|
339
|
+
else
|
|
340
|
+
begin
|
|
341
|
+
yield
|
|
342
|
+
rescue ArgumentError
|
|
343
|
+
show_error $!
|
|
344
|
+
if $!.message[ "invalid byte sequence"] then
|
|
345
|
+
$stderr.puts <<-EOT
|
|
346
|
+
Hint: Try to give me a different default encoding by explicitly giving one or
|
|
347
|
+
by changing the locale.
|
|
348
|
+
|
|
349
|
+
$ rbfind -K ascii-8bit ...
|
|
350
|
+
$ LC_ALL="C" rbfind ...
|
|
351
|
+
|
|
352
|
+
EOT
|
|
353
|
+
end
|
|
354
|
+
exit 1
|
|
355
|
+
rescue
|
|
356
|
+
show_error $!
|
|
357
|
+
exit 1
|
|
358
|
+
rescue NoMemoryError, ScriptError, SignalException
|
|
359
|
+
show_error $!
|
|
360
|
+
exit 2
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
error_handle do
|
|
367
|
+
|
|
368
|
+
co = color_on $stdout
|
|
369
|
+
opath = co ? "cpath" : "path"
|
|
370
|
+
case @lines
|
|
371
|
+
when :plain then
|
|
372
|
+
@puts and @block = "( #@block ) and colsep #{opath}, $., $_"
|
|
373
|
+
@real and @block = "break if ~/\0/o ; #@block"
|
|
374
|
+
@block = "lines { |line,num| $_, $. = line, num ; #@block }"
|
|
375
|
+
|
|
376
|
+
when :grep then
|
|
377
|
+
RE = Regexp.new @block, @icase && Regexp::IGNORECASE
|
|
378
|
+
@block = "grep RE"
|
|
379
|
+
@block << ", true" if co
|
|
380
|
+
@binary or @block = "not binary? and #@block"
|
|
381
|
+
|
|
382
|
+
else
|
|
383
|
+
@block ||= if $*.last and not (File.exists? $*.last) then
|
|
384
|
+
$*.pop.dup
|
|
385
|
+
else
|
|
386
|
+
@puts ||= true
|
|
387
|
+
"true"
|
|
388
|
+
end
|
|
389
|
+
if @puts then
|
|
390
|
+
@block = "( #@block ) and "
|
|
391
|
+
@block << if @wd then
|
|
392
|
+
"spcsep stype+modes, user|#@wd, group|#@wd, size.w#@wd, " +
|
|
393
|
+
"mtime.lsish, #{opath} + #{co ? 'carrow' : 'arrow'}.to_s"
|
|
394
|
+
else
|
|
395
|
+
"puts #{opath}"
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
if @skip then
|
|
402
|
+
RE_SKIP = Regexp.new @skip, File::ALT_SEPARATOR&&Regexp::IGNORECASE
|
|
403
|
+
@block.insert 0, "next if name =~ RE_SKIP ; "
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
if @demand then
|
|
407
|
+
RE_DEMAND = Regexp.new @demand, File::ALT_SEPARATOR&&Regexp::IGNORECASE
|
|
408
|
+
@block.insert 0, "next unless name =~ RE_DEMAND ; "
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
if @ext then
|
|
412
|
+
RE_EXT = Regexp.new '\A\.(' +
|
|
413
|
+
@ext.split(/ +|,/).map { |e| e[ /\A\.?(.*)\z/, 1] }.join('|') + ')\z',
|
|
414
|
+
File::ALT_SEPARATOR&&Regexp::IGNORECASE
|
|
415
|
+
@block.insert 0, "ext =~ RE_EXT or next ; "
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
@visible and @block.insert 0, "visible? or prune ; "
|
|
419
|
+
|
|
420
|
+
@vcs and @block.insert 0, "no_vcs ; "
|
|
421
|
+
@vim and @block.insert 0, "vimswap? and next ; "
|
|
422
|
+
|
|
423
|
+
args = $*.dup
|
|
424
|
+
if args.empty? and not $stdin.tty? then
|
|
425
|
+
$stdin.each_line { |l|
|
|
426
|
+
l.chomp!
|
|
427
|
+
args.push l
|
|
428
|
+
}
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
if @show then
|
|
432
|
+
class Proc
|
|
433
|
+
def to_s
|
|
434
|
+
"#<%s:0x%08x>" % [ self.class, object_id]
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
INDENT = " "*2
|
|
438
|
+
def puts_val *args
|
|
439
|
+
l = [ INDENT, *args].join ""
|
|
440
|
+
puts l
|
|
441
|
+
end
|
|
442
|
+
puts "arguments:"
|
|
443
|
+
args.each { |a| puts_val a }.any? or puts_val "(none)"
|
|
444
|
+
puts "parameters:"
|
|
445
|
+
@params.each { |k,v| puts_val k, "=", v }.any? or puts_val "(none)"
|
|
446
|
+
puts "block:"
|
|
447
|
+
self.class.constants.grep( /^RE(_[A-Z]+)?$/).each { |re|
|
|
448
|
+
v = self.class.const_get re
|
|
449
|
+
puts_val re, "=", v
|
|
450
|
+
}
|
|
451
|
+
puts_val @block
|
|
452
|
+
exit
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
@params[ :error] = proc do
|
|
456
|
+
case $!
|
|
457
|
+
when Errno::EPIPE then raise
|
|
458
|
+
when NameError, TypeError then raise
|
|
459
|
+
when ArgumentError then raise
|
|
460
|
+
else show_error $!
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
@block = <<-EOT
|
|
465
|
+
handle_error do
|
|
466
|
+
#@block
|
|
467
|
+
end
|
|
468
|
+
EOT
|
|
469
|
+
|
|
470
|
+
eval @blkbegin if @blkbegin
|
|
471
|
+
RbFindX.open args, @params do |f| f.instance_eval @block end
|
|
472
|
+
eval @blkend if @blkend
|
|
473
|
+
end
|
|
474
|
+
|
data/lib/humansiz.rb
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#
|
|
2
|
+
# humansiz.rb -- human readable sizes
|
|
3
|
+
#
|
|
4
|
+
# Numeric class extensions for human readable sizes.
|
|
5
|
+
|
|
6
|
+
=begin rdoc
|
|
7
|
+
|
|
8
|
+
Human readable sizes, times, and modes.
|
|
9
|
+
|
|
10
|
+
Examples:
|
|
11
|
+
|
|
12
|
+
4096.to_h # => " 4.1kB"
|
|
13
|
+
4096.to_hib # => " 4.0kiB"
|
|
14
|
+
1.MB # => 1000000
|
|
15
|
+
1.MiB # => 1048576
|
|
16
|
+
1.5.kiB # => 1536.0
|
|
17
|
+
|
|
18
|
+
1.h # => 3600
|
|
19
|
+
1.w # => 604800
|
|
20
|
+
|
|
21
|
+
=end
|
|
22
|
+
|
|
23
|
+
class Numeric # sizes in bytes
|
|
24
|
+
|
|
25
|
+
# :stopdoc:
|
|
26
|
+
K = 1000
|
|
27
|
+
M = K * K
|
|
28
|
+
G = K * M
|
|
29
|
+
T = K * G
|
|
30
|
+
# :startdoc:
|
|
31
|
+
|
|
32
|
+
def kB ; self * K ; end
|
|
33
|
+
def MB ; self * M ; end
|
|
34
|
+
def GB ; self * G ; end
|
|
35
|
+
def TB ; self * T ; end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# :stopdoc:
|
|
39
|
+
Kb = 1024
|
|
40
|
+
Mb = Kb * Kb
|
|
41
|
+
Gb = Kb * Mb
|
|
42
|
+
Tb = Kb * Gb
|
|
43
|
+
# :startdoc:
|
|
44
|
+
|
|
45
|
+
def kiB ; self * Kb ; end
|
|
46
|
+
def MiB ; self * Mb ; end
|
|
47
|
+
def GiB ; self * Gb ; end
|
|
48
|
+
def TiB ; self * Tb ; end
|
|
49
|
+
|
|
50
|
+
PREFIXES = " kMGTPEZY".scan /./ # :nodoc:
|
|
51
|
+
|
|
52
|
+
# :call-seq:
|
|
53
|
+
# num.to_h() -> str
|
|
54
|
+
#
|
|
55
|
+
# To human readable with decimal prefixes.
|
|
56
|
+
#
|
|
57
|
+
# 4096.to_h #=> " 4.1kB"
|
|
58
|
+
#
|
|
59
|
+
def to_h
|
|
60
|
+
n = 0
|
|
61
|
+
s = to_f
|
|
62
|
+
while s >= K do s /= K ; n += 1 end
|
|
63
|
+
format = n.zero? ? "%3d " : "%5.1f"
|
|
64
|
+
(format % s) + (PREFIXES[ n]||"?") + "B"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# :call-seq:
|
|
68
|
+
# num.to_hib() -> str
|
|
69
|
+
#
|
|
70
|
+
# To human readable with binary prefixes.
|
|
71
|
+
#
|
|
72
|
+
# 4096.to_hib #=> " 4.0kiB"
|
|
73
|
+
#
|
|
74
|
+
def to_hib
|
|
75
|
+
n = 0
|
|
76
|
+
s = to_f
|
|
77
|
+
while s >= Kb do s /= Kb ; n += 1 end
|
|
78
|
+
format = n.zero? ? "%4d " : "%6.1f"
|
|
79
|
+
(format % s) + (PREFIXES[ n]||"?") + "iB"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Numeric # time values
|
|
86
|
+
def s ; self ; end
|
|
87
|
+
def m ; s * 60 ; end
|
|
88
|
+
def h ; m * 60 ; end
|
|
89
|
+
def d ; h * 24 ; end
|
|
90
|
+
def w ; d * 7 ; end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class Time
|
|
96
|
+
|
|
97
|
+
# :call-seq:
|
|
98
|
+
# time.lsish() -> str
|
|
99
|
+
#
|
|
100
|
+
# Build a time string like in <code>ls -l</code>. When the year is
|
|
101
|
+
# the current, show the time. While <code>ls</code> doesn't show
|
|
102
|
+
# the seconds, this will allways include them.
|
|
103
|
+
#
|
|
104
|
+
# Time.now.lsish #=> " 8. Oct 15:15:19"
|
|
105
|
+
# file.stat.mtime.lsish #=> " 1. Apr 2008 "
|
|
106
|
+
#
|
|
107
|
+
def lsish
|
|
108
|
+
strftime "#{PERC_DAY}. %b " +
|
|
109
|
+
(year == Time.now.year ? "%H:%M:%S" : "%Y ")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Windows has no "%e".
|
|
113
|
+
PERC_DAY = Time.now.strftime("%e") =~ /\d/ ? "%e" : "%d" # :nodoc:
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class Integer
|
|
119
|
+
def hex
|
|
120
|
+
to_s 0x10
|
|
121
|
+
end
|
|
122
|
+
def oct
|
|
123
|
+
to_s 010
|
|
124
|
+
end
|
|
125
|
+
def bin
|
|
126
|
+
to_s 0b10
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|