Rubyでディレクトリ(ファイルを除く)の配列を取得するための、最速で最も最適化された1行の方法は何ですか?
ファイルを含めるのはどうですか?
_Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
_
Dir.glob(foo)
の代わりに_Dir[foo]
_を書くこともできます(ただし、_Dir.glob
_はブロックを取ることもできます。その場合、配列を作成する代わりに各パスを生成します)。
私はここでの解決策のどれも隠しディレクトリ(例: '.test')を扱っていないと思います:
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
ディレクトリのリストについては、試してください
Dir['**/']
Unixディレクトリではファイルでもあるため、ファイルのリストはより難しくなります。したがって、タイプをテストするか、他のエントリの親である返されたリストからエントリを削除する必要があります。
Dir['**/*'].reject {|fn| File.directory?(fn) }
そして、すべてのファイルとディレクトリのリストを簡単に
Dir['**/*']
ディレクトリのみ
`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)
ここの他の回答に記載されているように、Dir.glob
。フォルダには多くの奇妙な文字が含まれることがあり、glob引数はパターンであるため、一部の文字には特別な意味があることに注意してください。そのため、次のようなことは安全ではありません。
Dir.glob("#{folder}/**/*")
代わりに:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
PHPまたは他の言語でディレクトリおよびそのすべてのサブディレクトリのコンテンツを取得するには、コードを数行記述する必要がありますが、Ruby行:
require 'find'
Find.find('./') do |f| p f end
これにより、現在のディレクトリとそのすべてのサブディレクトリのコンテンツが印刷されます。
または、より短く、’**’
表記を使用できます:
p Dir['**/*.*']
同じ結果を得るには、PHPまたはJavaで何行を書きますか?
Railsプロジェクトディレクトリの動的検出とDir.globを組み合わせた例は次のとおりです。
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
1行のソリューションではありませんが、これはRuby呼び出しを使用して行う最善の方法だと思います。
最初にすべてのファイルを再帰的に削除します
2番目に空のディレクトリをすべて削除します
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }