rbfind 2.3.1 → 2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rbfind +58 -20
  3. data/lib/rbfind.rb +132 -102
  4. data/lib/rbfind/humansiz.rb +16 -5
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28dcc78acea4b26243eb554d31b6df6e97e4ab0b382df6f0cc50382c5c6721cf
4
- data.tar.gz: 8711486e4e567c6581849ac029c2f7b887f4dc707759e17ca52d7e4f45ffafa0
3
+ metadata.gz: 530e1d61cf675c858a06f62e62cbfe5cfa7b1492ec1ef9c77e293f7f0bb0b83d
4
+ data.tar.gz: '004834c6e324c296e0b4185910c8a1a70179ef90fbaeee0b262a8816d8e762af'
5
5
  SHA512:
6
- metadata.gz: 928d4d2718225a08935c7590c40bd6e917cc0e520f44c657c8e9bf0d496a0b7712452408035f9355992dffb26011156cf81d5272a1e288b3f46d70bff8d8ddc2
7
- data.tar.gz: f47260d1510f30fe4e23c42e93364366be0ffeee930a5972362a370252108ade399c81e5ec2179ab5f31fd1bba093771213f112771d567d8a1c0672b45c4b785
6
+ metadata.gz: e6b7d8ce6bd4d81824705b4dd311383888ff6fa02dc0a6fc94c7b307432fd7cc1b17643b75a53e7917796def4c91fd6f7243424778c64ab9d1932b5575852e04
7
+ data.tar.gz: eb837f165e31d40ed2323bbcdf2344adf32a113d1520d6dbb83c844d17f4487b44adfe997189e17734b413c368a93a71e6053a0ae697212652bd2ab578e1a620
data/bin/rbfind CHANGED
@@ -32,14 +32,20 @@ module RbFind
32
32
  [ %w(--colored -c), nil, "force color on -p or default output"],
33
33
  [ %w(--depth -d), nil, "yield directory after its contents"],
34
34
  [ %w(--maxdepth -m), :num, "maxium step depth"],
35
+ [ %w(--anydepth -M), nil, "no maxium step depth"],
35
36
  [ %w(--follow -y), nil, "follow symbolic links"],
36
- [ %w(--nosort -S), nil, "unsorted"],
37
- [ %w(--sort-by -s), :str, "sort expression ('n' is name)"],
38
- [ %w(--reverse -R), :str, "reverse sort"],
37
+ [ %w(--nosort -U), nil, "unsorted"],
38
+ [ %w(--sort-by -s), :str, "sort expression"],
39
+ [ %w(--reverse -R), nil, "reverse the sort"],
40
+ [ %w(--time -t), nil, "sort by time, newest first"],
41
+ [ %w(--size -S), nil, "sort by size, largest first"],
42
+ [ %w(--dirs -F), nil, "sort directories before files"],
39
43
  [ %w(--require -r), :rb, "require library"],
40
44
  [ %w(--puts-path -p), nil, "do 'puts path/cpath' on true block"],
41
45
  [ %w(--ls-l -P), nil, "do 'ls -l' style output on true block"],
42
- [ %w(--wider -+), nil, "widen fields in long output format (--ls-l)"],
46
+ [ %w(--long -Q), nil, "alternate long format on true block"],
47
+ [ %w(--ino -J), nil, "show inodes and number of hard links"],
48
+ [ %w(--wider -+), nil, "widen fields in long output format"],
43
49
  [ %w(--slash -/), nil, "append a slash to directory names"],
44
50
  [ %w(--lines -l), :blk, "surround block by 'lines { |$_,$.| ... }'"],
45
51
  [ %w(--reallines -L), :blk, "same as -l but stop at any null character"],
@@ -48,14 +54,15 @@ module RbFind
48
54
  [ %w(--binary -b), nil, "grep even binary files"],
49
55
  [ %w(--no-vcs -C), nil, "prune version control dirs (CVS/.svn/.git)"],
50
56
  [ %w(--no-swap -W), nil, "ignore Vim swapfiles"],
51
- [ %w(--skip -k), :lst, "filenames to skip"],
52
- [ %w(--demand -D), :lst, "skip all filenames but these"],
57
+ [ %w(--skip -k), :rgx, "filenames to skip"],
58
+ [ %w(--demand -D), :rgx, "skip all filenames but these"],
53
59
  [ %w(--ext -e), :lst, "skip all filename extensions but these"],
54
60
  [ %w(--visible -I), nil, "skip all hidden (starting with .dot)"],
61
+ [ %w(--all -a), nil, "all, including hidden (starting with .dot)"],
55
62
  [ %w(--nodirs -N), nil, "skip directories"],
56
63
  [ %w(--begin -B), :blk, "eval block before begin"],
57
64
  [ %w(--end -E), :blk, "eval block after end"],
58
- [ %w(--file -f), :blk, "read block expression from file"],
65
+ [ %w(--file -f), :nam, "read block expression from file"],
59
66
  [ %w(--encoding -K), :str, "encoding extern[:intern] (same as ruby -E)"],
60
67
  ]
61
68
 
@@ -79,14 +86,20 @@ module RbFind
79
86
  when '--colored' then @color = true
80
87
  when '--depth' then @params[ :depth_first] = true
81
88
  when '--maxdepth' then @params[ :max_depth] = arg.to_i
89
+ when '--anydepth' then @params[ :max_depth] = nil
82
90
  when '--follow' then @params[ :follow] = true
83
91
  when '--nosort' then @params[ :sort] = false
84
- when '--sort-by' then @params[ :sort] = instance_eval "proc { |n| #{arg} }"
92
+ when '--sort-by' then @params[ :sort] = instance_eval "proc { #{arg} }"
93
+ when '--time' then @params[ :sort] = proc { mtime } ; @params[ :reverse] = true
94
+ when '--size' then @params[ :sort] = proc { size } ; @params[ :reverse] = true
95
+ when '--dirs' then @params[ :dirs] = true
85
96
  when '--reverse' then @params[ :reverse] = true
86
97
  when '--require' then require arg
87
98
  when '--puts-path' then @puts = true
88
- when '--ls-l' then @puts = true ; @wd = 6
89
- when '--wider' then @wd = @wd ? @wd.succ : 4
99
+ when '--ls-l' then @puts = :ls ; @wds = 6 ; @wd = 6
100
+ when '--long' then @puts = :alt ; @wds = 7 ; @wd = 4
101
+ when '--ino' then @puts = :ino ; @wds = 8 ; @wd = 2
102
+ when '--wider' then @wd and @wd += 2.succ ; @wds and @wds += @puts != :ls ? 4 : 3
90
103
  when '--slash' then @slash = true
91
104
  when '--lines' then @lines = :plain ; @block = arg
92
105
  when '--reallines' then @lines = :plain ; @real = true ; @block = arg
@@ -99,6 +112,7 @@ module RbFind
99
112
  when '--demand' then @demand = arg
100
113
  when '--ext' then @ext = arg
101
114
  when '--visible' then @visible = true
115
+ when '--all' then @visible = false
102
116
  when '--nodirs' then @nodirs = true
103
117
  when '--begin' then @blkbegin = arg
104
118
  when '--end' then @blkend = arg
@@ -142,7 +156,7 @@ module RbFind
142
156
  @binary or @block = "not binary? and (#@block)"
143
157
 
144
158
  else
145
- @block ||= if @args.last and not (File.exists? @args.last) then
159
+ @block ||= if @args.last and not (File.lstat @args.last rescue false) then
146
160
  @args.pop.dup
147
161
  else
148
162
  @puts ||= true
@@ -150,11 +164,17 @@ module RbFind
150
164
  end
151
165
  if @puts then
152
166
  @block = "( #@block ) and "
153
- @block << if @wd then
154
- "spcsep stype+modes, user.w#@wd, group.w#@wd, size.w#@wd, " +
155
- "mtime.lsish, #{opath} + #{co ? 'carrow' : 'arrow'}.to_s"
156
- else
157
- "puts #{opath}"
167
+ @block << case @puts
168
+ when :ls then
169
+ "spcsep stype+modes, user.w#@wd, group.w#@wd, size.w#@wds, " +
170
+ "mtime.lsish, #{opath} + #{co ? 'carrow' : 'arrow'}.to_s"
171
+ when :alt then
172
+ "spcsep stype+modes, user!.w#@wd, group!.w#@wd, size.w_#@wds, " +
173
+ "mtime.long, #{opath} + #{co ? 'carrow' : 'arrow'}.to_s"
174
+ when :ino then
175
+ "spcsep ino.w#@wds, nlink.w#@wd, #{opath}"
176
+ else
177
+ "puts #{opath}"
158
178
  end
159
179
  end
160
180
 
@@ -246,7 +266,7 @@ module RbFind
246
266
  $ rbfind -d -m3 -- /mnt/data
247
267
  $ rbfind 'filesize > 10.MiB and colsep size.to_hib, path'
248
268
 
249
- $ rbfind -S "name =~ /^\.*/ ; $'.downcase"
269
+ $ rbfind -U "name =~ /^\.*/ ; $'.downcase"
250
270
  $ rbfind -B '$s=0' -E 'puts $s.to_h' 'filesize {|s|$s+=s}'
251
271
  $ rbfind 'puts path if ext == ".rb"'
252
272
  $ rbfind -p 'ext == ".rb"'
@@ -338,6 +358,9 @@ module RbFind
338
358
  error_handle do
339
359
  eval @blkbegin if @blkbegin
340
360
  b = @block
361
+ if not @args.empty? and @params[ :max_depth] then
362
+ @params[ :max_depth] -= 1
363
+ end
341
364
  Walk.run *@args, **@params do instance_eval b end
342
365
  eval @blkend if @blkend
343
366
  end
@@ -345,7 +368,7 @@ module RbFind
345
368
 
346
369
  def show
347
370
  puts "arguments:"
348
- @args.each { |a| puts_val a }.any? or puts_val "(none)"
371
+ @args.each { |a| puts_val a }.any? or puts_val "(none)"
349
372
  puts "parameters:"
350
373
  @params.each { |k,v| puts_val k, "=", v }.any? or puts_val "(none)"
351
374
  puts "block:"
@@ -447,8 +470,9 @@ class Integer
447
470
  # convenient formatting, right justification
448
471
  def method_missing sym, *args
449
472
  case sym.to_s # .to_s for Ruby 1.8
450
- when /\Aw_?(\d+)/ then "%#{$1}d" % self
451
- else super
473
+ when /\Aw(\d+)/ then "%#{$1}d" % self
474
+ when /\Aw_(\d+)/ then to_g.rjust $1.to_i
475
+ else super
452
476
  end
453
477
  end
454
478
  end
@@ -483,6 +507,20 @@ class NilClass
483
507
  end
484
508
  end
485
509
 
510
+ class TrueClass
511
+ def <=> oth
512
+ oth == true ? 0 : oth == false ? 1 : nil
513
+ end
514
+ include Enumerable
515
+ end
516
+
517
+ class FalseClass
518
+ def <=> oth
519
+ oth == false ? 0 : oth == true ? -1 : nil
520
+ end
521
+ include Enumerable
522
+ end
523
+
486
524
  class Proc
487
525
  def to_s
488
526
  "#<%s:0x%08x>" % [ self.class, object_id]
data/lib/rbfind.rb CHANGED
@@ -8,7 +8,7 @@ require "rbfind/csv"
8
8
 
9
9
  module RbFind
10
10
 
11
- VERSION = "2.3.1".freeze
11
+ VERSION = "2.8".freeze
12
12
 
13
13
  =begin rdoc
14
14
 
@@ -241,7 +241,7 @@ Reverse sort:
241
241
 
242
242
  Sort without case sensitivity and preceding dot:
243
243
 
244
- s = proc { |x| x =~ /^\.?/ ; $'.downcase }
244
+ s = proc { name =~ /^\.?/ ; $'.downcase }
245
245
  RbFind.run sort: s do
246
246
  puts path
247
247
  end
@@ -270,141 +270,119 @@ Sort without case sensitivity and preceding dot:
270
270
 
271
271
  private
272
272
 
273
- def initialize max_depth: nil, depth_first: nil, follow: nil,
274
- sort: true, reverse: false, error: nil, &block
275
- @max_depth = max_depth
276
- @depth_first = depth_first
277
- @follow = follow
278
- @sort = sort_parser sort, reverse
279
- @error = error
280
- @block = block
281
-
282
- ostat = $stdout.stat
283
- @ostat = ostat if ostat.file?
284
-
285
- @wd, @start, @count = Dir.getwd, Time.now, 0
286
- end
273
+ Params = Struct.new :max_depth, :depth_first, :follow,
274
+ :sort, :dirs, :reverse, :error, :block
287
275
 
288
- def sort_parser st, rev
289
- r = case st
290
- when Proc then proc { |l| l.sort_by! &st }
291
- when nil, false, nil, "" then proc { }
292
- else proc { |l| l.sort! }
276
+ def initialize max_depth: nil, depth_first: nil, follow: nil,
277
+ sort: true, dirs: false, reverse: false, error: nil, &block
278
+ @params = Params.new max_depth, depth_first, follow,
279
+ (sort_parser sort), dirs, reverse, error, block
280
+ @start = Time.instance_eval { @start = Time.now }
281
+ Time.instance_eval { @start = Time.now }
282
+ @count, @depth = 0, 0
283
+ end
284
+
285
+ def sort_parser st
286
+ case st
287
+ when Proc then proc { |l| l.sort_by! { |e| e.instance_eval &st } }
288
+ when String then proc { |l| l.sort_by! { |e| e.instance_eval st } }
289
+ when nil, false then proc { }
290
+ else proc { |l| l.sort_by! { |e| e.name } }
293
291
  end
294
- rev ? proc { |l| r.call l ; l.reverse! } : r
295
292
  end
296
293
 
297
294
  public
298
295
 
299
- attr_reader :wd, :start, :count, :depth
300
-
301
296
  def run *args
302
- @levels, @depth = [], 0
303
297
  args.flatten!
304
298
  args.compact!
305
299
  if args.empty? then
306
300
  visit_dir Dir::CUR_DIR
307
301
  else
308
302
  args.each { |base|
309
- handle_error do
310
- File.exists? base or raise "`#{base}` doesn't exist."
311
- visit_depth base
312
- end
303
+ e = Entry.new base, self
304
+ enter e if handle_error do e.stat end
313
305
  }
314
306
  end
315
- ensure
316
- @levels = @depth = nil
317
307
  end
318
308
 
319
- private
309
+ attr_reader :start, :count
310
+ attr_reader :depth
311
+ attr_reader :current
320
312
 
321
- def join_path
322
- (File.join @levels).freeze
323
- end
313
+ private
324
314
 
325
- def visit filename
315
+ def step_depth
326
316
  @depth += 1
327
- visit_depth filename
317
+ yield
328
318
  ensure
329
319
  @depth -= 1
330
320
  end
331
321
 
332
- def visit_depth filename
333
- @levels.push filename.dup.freeze
334
- p_, @path = @path, join_path
335
- if @depth_first then
322
+ def enter elem
323
+ c_, @current = @current, elem
324
+ @count += 1
325
+ if @params.depth_first then
336
326
  enter_dir
337
- call_block or raise "#{self.class}: prune doesn't work with :depth_first."
327
+ begin
328
+ call_block
329
+ rescue Prune
330
+ handle_error do
331
+ raise "#{self.class}: prune with :depth_first is pointless."
332
+ end
333
+ end
338
334
  else
339
- call_block and enter_dir
335
+ begin
336
+ call_block
337
+ enter_dir if @current.path
338
+ rescue Prune
339
+ end
340
340
  end
341
- @count += 1
342
341
  ensure
343
- @path = p_
344
- @levels.pop
342
+ @current = c_
345
343
  end
346
344
 
347
- def enter_dir
348
- return unless File.directory? @path
349
- if File.symlink? @path then
350
- return unless @follow and handle_error do
351
- d = @path.dup
352
- while d != Dir::CUR_DIR do
353
- d, = File.split d
354
- raise "cyclic recursion in #@path" if File.identical? d, @path
355
- end
356
- true
357
- end
345
+ def visit_dir dir
346
+ return if @params.max_depth and @params.max_depth == @depth
347
+ list = (Dir.new dir).children.map { |f| Entry.new f, self }
348
+ @params.sort.call list
349
+ list.reverse! if @params.reverse
350
+ if @params.dirs then
351
+ list = list.partition { |e| e.rstat.directory? rescue nil }
352
+ list.reverse! if @params.depth_first
353
+ list.flatten!
358
354
  end
359
- handle_error do
360
- visit_dir @path
355
+ step_depth do
356
+ list.each { |e| enter e }
361
357
  end
362
358
  end
363
359
 
364
- def visit_dir dir
365
- return if @max_depth and @max_depth == @depth
366
- list = (Dir.new dir).children
367
- @sort.call list
368
- list.each { |f| visit f }
369
- ensure
360
+ def enter_dir
361
+ return unless @current.stat.directory? || (@params.follow &&
362
+ @current.symlink? && @current.rstat.directory?)
363
+ handle_error do
364
+ @current.cyclic? and
365
+ raise "Cyclic recursion in #{@current.path}"
366
+ visit_dir @current.path
367
+ end
370
368
  end
371
369
 
372
370
  def call_block
373
- e = Entry.new @levels.last, @path, self
374
371
  handle_error do
375
- $_, $. = e.name, count
376
372
  begin
377
- e.instance_eval &@block
373
+ $_, $. = @current.name, @count
374
+ @current.instance_eval &@params.block
378
375
  rescue Done
379
376
  end
380
- if !(e.name.equal? @levels.last) && e.name != @levels.last then
381
- if e.name then
382
- e.name == (File.basename e.name) or
383
- raise "#{self.class}: rename to `#{e.name}' may not be a path."
384
- e.name.freeze
385
- @levels.pop
386
- @levels.push e.name
387
- p, @path = @path, join_path
388
- File.rename p, @path
389
- else
390
- if e.dir? then
391
- Dir.rmdir @path
392
- else
393
- File.unlink @path
394
- end
395
- end
396
- end
397
- true
398
377
  end
399
- rescue Prune
400
378
  end
401
379
 
402
380
  def handle_error
403
381
  yield
404
382
  rescue
405
- case @error
406
- when Proc then @error.call
407
- when String then instance_eval @error
383
+ case @params.error
384
+ when Proc then @params.error.call
385
+ when String then instance_eval @params.error
408
386
  else raise
409
387
  end
410
388
  nil
@@ -417,21 +395,35 @@ Sort without case sensitivity and preceding dot:
417
395
 
418
396
  attr_reader :path, :name
419
397
 
420
- def initialize name, path, walk
421
- @name, @path, @walk = name, path, walk
398
+ def initialize filename, walk
399
+ @walk = walk
400
+ @prev, @name = walk.current, filename.dup.freeze
401
+ @path = join_path @name
422
402
  end
423
403
 
404
+ protected
405
+ attr_reader :prev
406
+ private
407
+ def join_path name
408
+ @prev ? (File.join @prev.path, name).freeze : name
409
+ end
410
+ def reset
411
+ @fullpath = @stat = @rstat = @ostat = @colors = nil
412
+ end
413
+ public
414
+
415
+ def count ; @walk.count ; end
424
416
  def depth ; @walk.depth ; end
425
417
  def now ; @walk.start ; end
426
418
 
427
- def fullpath ; @fullpath ||= File.absolute_path @path, @walk.wd ; end
419
+ def fullpath ; @fullpath ||= File.absolute_path @path ; end
428
420
 
429
421
  def stat ; @stat ||= File.lstat @path ; end
430
422
  def rstat ; @rstat ||= File.stat @path ; end
431
423
 
432
424
 
433
425
  private
434
- def append_slash s ; (File.directory? s) ? (File.join s, "") : s ; end
426
+ def append_slash s ; directory? ? (File.join s, "") : s ; end
435
427
  public
436
428
 
437
429
  def path! ; append_slash path ; end
@@ -461,7 +453,23 @@ Sort without case sensitivity and preceding dot:
461
453
  end
462
454
  public
463
455
 
464
- def dir? ; stat.directory? ; end
456
+ def directory? ; stat.directory? ; end
457
+ alias dir? directory?
458
+
459
+ def symlink? ; stat.symlink? ; end
460
+
461
+ def cyclic?
462
+ e = self
463
+ loop do
464
+ e = e.prev
465
+ e or break
466
+ if File.identical? e.path, @path then
467
+ return true
468
+ end
469
+ end
470
+ false
471
+ end
472
+
465
473
 
466
474
  def aage ; @walk.start - stat.atime ; end
467
475
  def mage ; @walk.start - stat.mtime ; end
@@ -516,10 +524,10 @@ Sort without case sensitivity and preceding dot:
516
524
  end
517
525
 
518
526
 
519
- def readlink ; File.readlink @path if stat.symlink? ; end
527
+ def readlink ; File.readlink @path if symlink? ; end
520
528
 
521
529
  def broken_link?
522
- return unless stat.symlink?
530
+ return unless symlink?
523
531
  rstat
524
532
  false
525
533
  rescue
@@ -529,7 +537,7 @@ Sort without case sensitivity and preceding dot:
529
537
 
530
538
  ARROW = " -> "
531
539
  def arrow
532
- ARROW + (File.readlink @path) if stat.symlink?
540
+ ARROW + (File.readlink @path) if symlink?
533
541
  end
534
542
 
535
543
 
@@ -552,7 +560,11 @@ Sort without case sensitivity and preceding dot:
552
560
  # Check whether a directory contains an entry.
553
561
  #
554
562
  def contains? name
555
- File.exists? File.join @path, name
563
+ p = File.join @path, name
564
+ File.lstat p
565
+ true
566
+ rescue
567
+ false
556
568
  end
557
569
 
558
570
  # :call-seq:
@@ -580,7 +592,8 @@ Sort without case sensitivity and preceding dot:
580
592
  # nothing will be done.
581
593
  #
582
594
  def open &block
583
- @ostat and @ostat.identical? @path and
595
+ @ostat ||= $stdout.stat
596
+ @ostat.identical? @path and
584
597
  raise "Refusing to open output file."
585
598
  File.open @path, &block if file?
586
599
  end
@@ -690,10 +703,27 @@ Sort without case sensitivity and preceding dot:
690
703
  include Csv
691
704
 
692
705
 
693
- def rename newname ; @name = newname ; end
706
+ def rename newname
707
+ @name = newname
708
+ newname == (File.basename newname) or
709
+ raise "Rename to `#{newname}' may not be a path."
710
+ p = join_path newname
711
+ (File.exist? p) and raise "Rename to `#{p}` would overwrite."
712
+ File.rename @path, p
713
+ @name, @path = newname.dup.freeze, p
714
+ reset
715
+ end
694
716
  alias mv rename
695
717
 
696
- def rm ; @name = nil ; end
718
+ def rm
719
+ if directory? then
720
+ Dir.rmdir @path
721
+ else
722
+ File.unlink @path
723
+ end
724
+ @name = @path = nil
725
+ reset
726
+ end
697
727
 
698
728
 
699
729
  def cname ; color name ; end
@@ -5,7 +5,7 @@
5
5
 
6
6
  =begin rdoc
7
7
 
8
- Human readable sizes, times, and modes.
8
+ Human readable sizes and times.
9
9
 
10
10
  Examples:
11
11
 
@@ -136,12 +136,23 @@ class Time
136
136
  # file.stat.mtime.lsish #=> " 1. Apr 2008 "
137
137
  #
138
138
  def lsish
139
- strftime "#{PERC_DAY}. %b " +
140
- (year == Time.now.year ? "%H:%M:%S" : "%Y ")
139
+ strftime "%e. %b " + (year == Time.start.year ? "%H:%M:%S" : "%Y ")
141
140
  end
142
141
 
143
- # Windows has no "%e".
144
- PERC_DAY = Time.now.strftime("%e") =~ /\d/ ? "%e" : "%d" # :nodoc:
142
+ def long
143
+ s = Time.start
144
+ if year == s.year && month == s.month && day == s.day then
145
+ strftime "==%H:%M:%S"
146
+ else
147
+ strftime "%Y-%m-%d"
148
+ end
149
+ end
150
+
151
+ class <<self
152
+ def start
153
+ @start ||= Time.now
154
+ end
155
+ end
145
156
 
146
157
  end
147
158
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbfind
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: '2.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bertram Scharpf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-24 00:00:00.000000000 Z
11
+ date: 2021-03-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  A replacement for the standard UNIX command find.