Ascend a directory path.
Dir.ascend("/var/log") do |path| p path end
produces
/var/log /var /
CREDIT: Daniel Berger, Jeffrey Schwab
TODO: make it work with windows too use FileTest.root?
# File lib/core/facets/dir/ascend.rb, line 22 22: def self.ascend(dir, inclusive=true, &blk) 23: dir = dir.dup 24: blk.call(dir) if inclusive 25: ri = dir.rindex('/') 26: while ri 27: dir = dir.slice(0...ri) 28: if dir == "" 29: blk.call('/') ; break 30: end 31: blk.call( dir ) 32: ri = dir.rindex('/') 33: end 34: end
Descend a directory path.
Dir.descend("/var/log") do |path| p path end
produces
/ /var /var/log
CREDIT: Daniel Berger, Jeffrey Schwab
# File lib/core/facets/dir/ascend.rb, line 50 50: def self.descend(path) #:yield: 51: paths = path.split('/') 52: paths.size.times do |n| 53: pth = File.join(*paths[0..n]) 54: pth = "/" if pth == "" 55: yield(pth) 56: end 57: end
Same as Dir#recurse.
# File lib/core/facets/dir/recurse.rb, line 27 27: def self.ls_r(path='.', &block) 28: recurse(path, &block) 29: end
Like glob but can take multiple patterns.
Dir.multiglob( '*.rb', '*.py' )
Rather then constants for options multiglob accepts a trailing options hash of symbol keys.
:noescape File::FNM_NOESCAPE :casefold File::FNM_CASEFOLD :pathname File::FNM_PATHNAME :dotmatch File::FNM_DOTMATCH :strict File::FNM_PATHNAME && File::FNM_DOTMATCH
It also has an option for recurse.
:recurse Recurively include contents of directories.
For example
Dir.multiglob( '*', :recurse => true )
would have the same result as
Dir.multiglob('**/*')
# File lib/core/facets/dir/multiglob.rb, line 40 40: def self.multiglob(*patterns) 41: options = (Hash === patterns.last ? patterns.pop : {}) 42: 43: if options.delete(:recurse) 44: #patterns += patterns.collect{ |f| File.join(f, '**', '**') } 45: multiglob_r(*patterns) 46: end 47: 48: bitflags = 0 49: bitflags |= File::FNM_NOESCAPE if options[:noescape] 50: bitflags |= File::FNM_CASEFOLD if options[:casefold] 51: bitflags |= File::FNM_PATHNAME if options[:pathname] or options[:strict] 52: bitflags |= File::FNM_DOTMATCH if options[:dotmatch] or options[:strict] 53: 54: patterns = [patterns].flatten.compact 55: 56: if options[:recurse] 57: patterns += patterns.collect{ |f| File.join(f, '**', '**') } 58: end 59: 60: files = [] 61: files += patterns.collect{ |pattern| Dir.glob(pattern, bitflags) }.flatten.uniq 62: 63: return files 64: end
The same as multiglob, but recusively includes directories.
Dir.multiglob_r( 'folder' )
is equivalent to
Dir.multiglob( 'folder', :recurse=>true )
The effect of which is
Dir.multiglob( 'folder', 'folder/**/**' )
# File lib/core/facets/dir/multiglob.rb, line 78 78: def self.multiglob_r(*patterns) 79: options = (Hash === patterns.last ? patterns.pop : {}) 80: matches = multiglob(*patterns) 81: directories = matches.select{ |m| File.directory?(m) } 82: matches += directories.collect{ |d| multiglob_r(File.join(d, '**'), options) }.flatten 83: matches.uniq 84: #options = (Hash === patterns.last ? patterns.pop : {}) 85: #options[:recurse] = true 86: #patterns << options 87: #multiglob(*patterns) 88: end
Is a path parental to another?
TODO: Needs improvement. TODO: Instance version?
# File lib/core/facets/dir/parent.rb, line 8 8: def self.parent?(parent_path, child_path) 9: %^#{Regexp.escape(parent_path)}| =~ child_path 10: end
Recursively scan a directory and pass each file to the given block.
CREDIT: George Moschovitis
TODO: If fully compatible, reimplement as alias of Find.find, or just copy and paste Find.find code here if it looks more robust.
# File lib/core/facets/dir/recurse.rb, line 11 11: def self.recurse(path='.', &block) 12: list = [] 13: stoplist = ['.', '..'] 14: Dir.foreach(path) do |f| 15: next if stoplist.include?(f) 16: filename = (path == '.' ? f : path + '/' + f) 17: list << filename 18: block.call(filename) if block 19: if FileTest.directory?(filename) and not FileTest.symlink?(filename) 20: list.concat( Dir.recurse(filename, &block) ) 21: end 22: end 23: list 24: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.