web-dev-qa-db-ja.com

ディレクトリ内のフォルダーのリストを取得する

Rubyを使用して特定のディレクトリに存在するフォルダーのリストを取得するにはどうすればよいですか?

Dir.entries()はよく見えますが、フォルダのみに制限する方法がわかりません。

86
0xC0DEFACE

ヨルダンは近いが、Dir.entriesは、File.directory?期待しています。これを試して:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
69
scottd

私はこれがより便利で使いやすいことがわかりました:

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
100
Emiliano Poggi

私の意見では、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は絶対でしたが、これらの文字列も絶対です。

45
johannes

特定のディレクトリの下にあるすべてのフォルダーを再帰的に検索します。

Dir.glob 'certain_directory/**/*/'

非再帰バージョン:

Dir.glob 'certain_directory/*/'

注意: Dir.[]Dir.glob

20
Bohr
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
4
Markus

FileTestモジュールのFile.directory?を使用して、ファイルがディレクトリかどうかを確認できます。これをDir.entriesと組み合わせると、素敵な1行(ライナー)になります。

directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}

編集: ScottDの修正ごとに更新。

4
Jordan Running

これにより、ディレクトリサブディレクトリへのフルパスの配列を取得できます。 サブサブディレクトリ再帰的方法。このコードを使用して、これらのファイルをconfig/applicationファイル内に積極的にロードしました。

Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }

さらに、退屈な...に対処する必要はもうありません。受け入れられた答えはそれらに対処するために必要でした。

2
Victor

フォルダーのみ(「。」および「..」は除外されます):

Dir.glob(File.join(path, "*", File::SEPARATOR))

フォルダーとファイル:

Dir.glob(File.join(path, "*"))

1
Iwan B.

一般的なソリューションの場合は、おそらく使用する必要があります

Dir.glob(File.expand_path(path))

これは、~/*/(ホームディレクトリ内のすべてのフォルダー)などのパスで機​​能します。

1
thisismydesign
$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
1
David Douglas
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
1
msangui

各ファイルをテストして、FileTest.directory? (file_name)を含むディレクトリであるかどうかを確認できると思います。詳細については、 FileTestのドキュメント を参照してください。

0
matekm

Borh's answerjohannes '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 }
0
br3nt