2011-02-20 24 views
27

Rubyでディレクトリが空であるかどうかを確認する方法を教えてください。以下のようなものがあります:(。私はその関数が存在しないことを知っている) ​​ Rubyでディレクトリが空であることを確認してください

+2

がある "Dir.emptyは?" –

+0

@BenFlynn 5年後、あなたの希望は実現しました(http://stackoverflow.com/a/41344613/2021397) – Janosch

+0

@Janoschこれは、重力波の存在を証明するものでも、2016年に起こる最良のものです –

答えて

46

あなただけのエントリのリストを取得し、(それが空だかどうかを自分自身のためだけでなく、あなたを見ることができます。 "と" .. "を考慮する必要があります)。 the docsを参照してください。

(Dir.entries('your_directory') - %w{ . .. }).empty? 

# or using glob, which doesn't match hidden files (like . and ..) 
Dir['your_directory/*'].empty? 

更新:正規表現を使用するための上記の最初の方法。今は(明らかに)そうではありません。以下のコメントは、以前の(正規表現)バージョンにほとんど適用されます。あなたは、ディレクトリ内のすべてのファイルとフォルダを参照するためにエントリを使用することができます

+0

最初のものは私にエラーを与えましたが、2番目のものは完璧に働いていました。ありがとう! –

+0

@マーク・シマンスキー:ああ、私はカッコ内にブロックをラップしました。一定。 – coreyward

+0

最初のコマンドは.gitのような隠しファイルも無視します。 –

9

Dir.entries('directory') 
=> ['.', '..', 'file.rb', '.git'] 
Dir.entries('directory').size <= 2 # Check if empty with no files or folders. 

あなたはまた、唯一のグロブを使用してファイルを検索することができます。

Dir.glob('directory/{*,.*}') 
=> ['file.rb', '.git'] 
Dir.glob('directory/{*,.*}').empty? # Check if empty with no files. 
+2

しかし、 'Dir.glob( 'directory/*')'は '.'で始まるファイル、例えば'を除外します。プロファイル 'または' .git'です。 –

+0

@(muが短すぎます) - あなたは正しいです。隠しファイルも含めて正規表現を更新しました。 –

+3

Dir.glob( 'directory /{*,.*}')は "。"をキャプチャします。と ".."は空ですか?常にfalseを返します。 –

3

空のディレクトリが2つだけを持っている必要がありますリンク(。と..)。 OSXではこれが動作します:

File.stat('directory').nlink == 2 

... LinuxやCygwinでは動作しません。 (ありがとう@DamianNowak)パンの答えを適応:

Dir.entries('directory').size == 2 

は動作するはずです。

+1

'nlink'は、間違っているサブディレクトリの数をチェックします。 'size'をチェックする必要があります。 – Nowaker

+0

@DamianNowakそうではなく、irb File.stat( '。')を試してください。nlink http://www.ruby-doc.org/core-1.9.3/File/Stat.html#method-i-nlink –

+0

試しました、および... http://pastie.org/4128736 – Nowaker

1

単純ではありませんが、* nix系のシステムでは機能します。

Dir.entries(directory_path) == ['.', '..'] 
0

これは私のテンプレートです。このファイルは、ソース内の特定のファイルを検索しています。

mydir = "/home/to/mydir" 

Dir.chdir(mydir) 

if Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size > 0 


     do_something 

elsif Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size < 0 

     do_something_else 

else 

     puts "some warning message" 
end 

どちらかといえば、私に知らせ:)のRuby 2.4.0のよう

6

、私はと呼ばれる方法で見てみたいDir.empty?

Dir.empty?('/') # => false 
関連する問題