tags:

views:

486

answers:

3

Does anyone know if there's an existing module/function inside Ruby to traverse file system directories and files? I'm looking for something similar to Python's os.walk. The closest module I've found is Find but requires some extra work to do the traversal.

The Python code looks like the following:

for root, dirs, files in os.walk('.'):
    for name in files:
        print name
    for name in dirs:
        print name
+4  A: 

The following will print all files recursively. Then you can use File.directory? to see if the it is a directory or a file.

Dir['**/*'].each { |f| print f }
ACoolie
Instead of `Dir[foo].each { bar }`, you can use `Dir.glob(foo) { bar }` which will iterate over all the files matching the block without creating a temporary array first.
sepp2k
Is `Dir.foreach('.') { |f| print f } ` the same? It looks more expressive than the [] version.
Thierry Lam
@Thierry: No. Dir.foreach does not enter subdirectories.
sepp2k
I like the glob, you can cherry pick the files you want
Thierry Lam
+1  A: 

Find seems pretty simple to me:

Find.find('mydir'){|f| puts f}
Ken Liu
A: 
require 'pathname'

def os_walk(dir)
  root = Pathname(dir)
  files, dirs = [], []
  Pathname(root).find do |path|
    unless path == root
      dirs << path if path.directory?
      files << path if path.file?
    end
  end
  [root, files, dirs]
end

root, files, dirs = os_walk('.')
tig