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


90

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

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

回答:


71

ジョーダンは近いですがDir.entriesFile.directory?期待する完全なパスを返しません。これを試して:

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

3
これにより、非表示のディレクトリ、(現在のディレクトリ)および(現在のディレクトリの親)を含むすべてのディレクトリが取得されます。ほとんどの場合、少なくともこれら2つを削除する必要があります。'.''..'
テレマコス

私はこれを好む... Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
ビクター

しかし、私はを使用して、はるかに明確で簡潔な解決策を提案しましたDir.glob
ビクター

これはDir.glob()他の回答で見られるよりも客観的に悪いです-これの代わりにそれを行うことを強くお勧めします
Dasmowenator

106

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

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

17
フォルダを再帰するには**/*、の代わりにを使用する必要があります*
mkmurray

1
シンプルで最高。ありがとう
Biswajit Das

すばらしい答えです。
レトロリフ

47

私の意見で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
rweng

3
より簡潔に:Pathname.new(somepath).children.select(&:directory?)
ablarg

19

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

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

非再帰的なバージョン:

Dir.glob 'certain_directory/*/'

注:のDir.[]ように機能しDir.globます。


同じロジックを使用して、再帰的ファイル検索と非再帰的ファイル検索をどのように行いますか?そして、どのように再帰的および非再帰的なファイルとフォルダーですか?
ピクセル

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

4

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

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

編集: ScottDの修正に従って更新されました。


3

これを使用すると、の配列を取得することができフルパスあなたへのディレクトリサブディレクトリsubsubdirectories再帰的な方法では。私はそのコードを使用して、これらのファイルをconfig/applicationfile 内に積極的にロードしました。

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

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



1
$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

おそらく使用したい一般的なソリューション

Dir.glob(File.expand_path(path))

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


ありがとう!これは非常に役立ちます。
レトロリフ

1

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 }

1

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

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

フォルダーとファイル:

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.