Rubyを使用して特定のディレクトリに存在するフォルダーのリストを取得するにはどうすればよいですか?
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オブジェクトとして提供されます。
文字列を持ちたい場合
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
。
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
FileTest
モジュールのFile.directory?
を使用して、ファイルがディレクトリかどうかを確認できます。これをDir.entries
と組み合わせると、素敵な1行(ライナー)になります。
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}
編集: ScottDの修正ごとに更新。
これにより、ディレクトリ、サブディレクトリへのフルパスの配列を取得できます。 サブサブディレクトリ再帰的方法。このコードを使用して、これらのファイルをconfig/application
ファイル内に積極的にロードしました。
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
さらに、退屈な.
と..
に対処する必要はもうありません。受け入れられた答えはそれらに対処するために必要でした。
フォルダーのみ(「。」および「..」は除外されます):
Dir.glob(File.join(path, "*", File::SEPARATOR))
フォルダーとファイル:
Dir.glob(File.join(path, "*"))
一般的なソリューションの場合は、おそらく使用する必要があります
Dir.glob(File.expand_path(path))
これは、~/*/
(ホームディレクトリ内のすべてのフォルダー)などのパスで機能します。
$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('/your_dir').reject {|e| !File.directory?(e)}
各ファイルをテストして、FileTest.directory? (file_name)
を含むディレクトリであるかどうかを確認できると思います。詳細については、 FileTestのドキュメント を参照してください。
Borh's answer と johannes 'answer を組み合わせて、フォルダ内のディレクトリ名を取得するための非常にエレガントなソリューションを取得できます。
# 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 }