2009-08-15 5 views
21

Rubyの内部に既存のモジュール/機能があり、ファイルシステムのディレクトリとファイルを通過するかどうか知りませんか?私はPythonのos.walkに似た何かを探しています。私が見つけた最も近いモジュールはFindですが、トラバーサルを行うには余分な作業が必要です。Pythonのos.walkのRubyに相当するものは何ですか?

ザ・Pythonのコードは次のようになります。

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

答えて

22

以下を再帰的にすべてのファイルを印刷します。次に、File.directoryを使用できますか?そのファイルがディレクトリかファイルかを確認します。

Dir['**/*'].each { |f| print f } 
+9

の 'dir [FOO] .each {バー}'、あなたが 'Dir.glob(FOO){バー}を使用することができます'これは、一時的な配列を最初に作成せずに、ブロックに一致するすべてのファイルを反復処理します。 – sepp2k

+0

'Dir.foreach( '。'){| f | print f} '同じですか? []バージョンよりも表現力があります。 –

+1

@Thierry:いいえ.Dir.foreachはサブディレクトリに入りません。 – sepp2k

8

Findは私には非常に簡単そうです:

代わりの
require "find" 
Find.find('mydir'){|f| puts f} 
+0

そして、 'Find'はどこに定義されていますか? 'require" find "' ここにはドキュメントがあります:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/find/rdoc/Find.html – Sukima

3
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('.') 
関連する問題