ルビーを使用して特定のディレクトリに存在するフォルダのリストを取得するにはどうすればよいですか?
Dir.entries()
よく似ていますが、フォルダのみに制限する方法がわかりません。
ルビーを使用して特定のディレクトリに存在するフォルダのリストを取得するにはどうすればよいですか?
Dir.entries()
よく似ていますが、フォルダのみに制限する方法がわかりません。
回答:
ジョーダンは近いですがDir.entries
、File.directory?
期待する完全なパスを返しません。これを試して:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
。
Dir.glob()
他の回答で見られるよりも客観的に悪いです-これの代わりにそれを行うことを強くお勧めします
私はこれがより便利で使いやすいことがわかりました:
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
絶対だった場合、これらの文字列も絶対です。
Pathname
それが自動的に削除されることで.
、..
などproprieteryファイル.DS_Store
モジュールFile.directory?
からを使用してFileTest
、ファイルがディレクトリかどうかを確認できます。これと組み合わせるとDir.entries
、素敵なライナーになります:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
編集: ScottDの修正に従って更新されました。
おそらく使用したい一般的なソリューション
Dir.glob(File.expand_path(path))
これは~/*/
(ホームディレクトリ内のすべてのフォルダー)などのパスで機能します。
Borhの回答とjohannesの回答を組み合わせて、フォルダー内のディレクトリ名を取得するための非常に洗練されたソリューションを取得できます。
# 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 }
各ファイルをテストして、それがのディレクトリであるかどうかを確認できると思いますFileTest.directory? (file_name)
。詳細については、FileTestのドキュメントを参照してください。
'.'
'..'