取得のリストをフォルダのディレクトリ
-
19-09-2019 - |
質問
どうやっていけばいいですか?一覧のフォルダに存在する一定のディレクトリをルビー?
Dir.entries()
見ありがわからないのに限定するフォルダのみです。
解決
ヨルダンは近いですが、を期待しDir.entries
フルパスをFile.directory?
返しません。これを試してください:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
他のヒント
私はこれをより便利で使いやすいことがわかりました。
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
これは、現在のディレクトリ内のすべてのフォルダ、除外.
と..
を取得します。
フォルダを再帰的にするには、単に**
の代わりに*
を使用します。
Dir.glob
線もブロックとしてDir.chdir
に渡すことができます:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
私の意見のPathname
ではあまり適していファイル名の文字列平野よります。
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
このは、あなたのパス名オブジェクトとしてそのディレクトリ内のすべてのディレクトリの配列を与えるます。
あなたは、文字列を持っているしたい場合は、
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
directory_name
が絶対的だった場合、、これらの文字列は、あまりにも絶対的です。
再帰的に特定のディレクトリの下にあるすべてのフォルダを見つけます:
Dir.glob 'certain_directory/**/*/'
非再帰バージョン:
Dir.glob 'certain_directory/*/'
注意:Dir.[]
はDir.glob
のように動作します。
あなたは、ファイルがディレクトリであるかどうかを調べるためにFile.directory?
モジュールからFileTest
を使用することができます。 Dir.entries
でこれを組み合わせること素敵な1(ISH)-linerになります:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}
の編集のScottDの補正ごとに更新
。directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
この1で、あなたはあなたののディレクトリの、のサブディレクトリの、のsubsubdirectories のを完全なパスの配列を取得することができます>再帰的な方法インチ
私はconfig/application
ファイル内の熱心な負荷にこれらのファイルをそのコードを使用します。
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
また、私たちはもう退屈.
と..
との契約は必要ありません。受け入れ答えはそれらに対処する必要がありました。
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media"
Dir.glob("#{$dir_target}/**/*").each do |f|
if File.directory?(f)
puts "#{f}\n"
end
end
あなたはおそらく使用する一般的な解決のために、
Dir.glob(File.expand_path(path))
このは~/*/
のようなパス(ホームディレクトリ内のすべてのフォルダ)で動作します。
フォルダのみ(と '..' 除外されている ''):
Dir.glob(File.join(path, "*", File::SEPARATOR))
フォルダとファイルます:
Dir.glob(File.join(path, "*"))
私はあなたがそれが できませ Borhの回答 や ヨハネス-'回答 に非常にエレガントな解決方法を、ディレクトリの名前です。FileTest.directory? (file_name)
のディレクトリがあるかどうかを確認するために、各ファイルをテストすることができると思います。詳細はファイルテストのドキュメントnoreferrer">
# user globbing to get a list of directories for a path
base_dir_path = ''
directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
# or recursive version:
directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', ''))
# cast to Pathname
directories = directory_paths.collect {|path| Pathname.new(path) }
# return the basename of the directories
directory_names = directories.collect {|dir| dir.basename.to_s }