回答:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
代わりにDir.glob(foo)
書き込むこともできますDir[foo]
(ただしDir.glob
、ブロックを取得することもできます。その場合、配列を作成する代わりに各パスが生成されます)。
Dir.glob("**/")
シンボリックリンクも必要でない限り使用してください
File::FNM_DOTMATCH
フラグを使用します。
Dir.glob("**/*", File::FNM_DOTMATCH)
私はここでのソリューションのどれも隠しディレクトリ(例えば '.test')を扱っていないと思います:
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
役に立ちました
ディレクトリのリストについては、
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)
end.select {}.flatten()
部分を説明できますか?全体的に機能が好きです。それは配列の配列を作成するように見えますか?あなたがそれを配列に割り当てて文字列の配列を得ることができるようにelseif
:rec_path(child, file) << child.to_s
ありがとう!
PHPやその他の言語では、ディレクトリとそのすべてのサブディレクトリのコンテンツを取得するには、コードを数行記述する必要がありますが、Rubyでは2行かかります。
require 'find'
Find.find('./') do |f| p f end
これにより、現在のディレクトリとそのすべてのサブディレクトリの内容が出力されます。
または短く、以下の’**’
表記を使用できます。
p Dir['**/*.*']
同じ結果を得るために、PHPまたはJavaで何行書くでしょうか。
1行の解決策ではありませんが、これがルビ呼び出しを使用して行う最善の方法だと思います。
最初にすべてのファイルを再帰的に削除します
2番目にすべての空のディレクトリを削除します
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }