web-dev-qa-db-ja.com

Rubyのディレクトリを再帰的にリストするワンライナー?

Rubyでディレクトリ(ファイルを除く)の配列を取得するための、最速で最も最適化された1行の方法は何ですか?

ファイルを含めるのはどうですか?

92
Lance Pollard
_Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
_

Dir.glob(foo)の代わりに_Dir[foo]_を書くこともできます(ただし、_Dir.glob_はブロックを取ることもできます。その場合、配列を作成する代わりに各パスを生成します)。

Ruby Glob Docs

166
sepp2k

私はここでの解決策のどれも隠しディレクトリ(例: '.test')を扱っていないと思います:

require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
53
FelipeC

ディレクトリのリストについては、試してください

Dir['**/']

Unixディレクトリではファイルでもあるため、ファイルのリストはより難しくなります。したがって、タイプをテストするか、他のエントリの親である返されたリストからエントリを削除する必要があります。

Dir['**/*'].reject {|fn| File.directory?(fn) }

そして、すべてのファイルとディレクトリのリストを簡単に

Dir['**/*']
28
MBO

高速ワンライナー

ディレクトリのみ

`find -type d`.split("\n")

ディレクトリと通常のファイル

`find -type d -or -type f`.split("\n")`

純粋で美しいルビー

require "pathname"

def rec_path(path, file= false)
  puts path
  path.children.collect do |child|
    if file and child.file?
      child
    elsif child.directory?
      rec_path(child, file) + [child]
    end
  end.select { |x| x }.flatten(1)
end

# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
7
johannes

ここの他の回答に記載されているように、Dir.glob。フォルダには多くの奇妙な文字が含まれることがあり、glob引数はパターンであるため、一部の文字には特別な意味があることに注意してください。そのため、次のようなことは安全ではありません。

Dir.glob("#{folder}/**/*")

代わりに:

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
6
troelskn

PHPまたは他の言語でディレクトリおよびそのすべてのサブディレクトリのコンテンツを取得するには、コードを数行記述する必要がありますが、Ruby行:

require 'find'
Find.find('./') do |f| p f end

これにより、現在のディレクトリとそのすべてのサブディレクトリのコンテンツが印刷されます。

または、より短く、’**’表記を使用できます:

p Dir['**/*.*']

同じ結果を得るには、PHPまたはJavaで何行を書きますか?

2
Ramesh

Railsプロジェクトディレクトリの動的検出とDir.globを組み合わせた例は次のとおりです。

dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
0
shacker

1行のソリューションではありませんが、これはRuby呼び出しを使用して行う最善の方法だと思います。

最初にすべてのファイルを再帰的に削除します
2番目に空のディレクトリをすべて削除します

Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
0
HomeTurf