【问题标题】:Check if directory is empty in Ruby检查Ruby中的目录是否为空
【发布时间】:2011-02-20 18:48:32
【问题描述】:

如何在 Ruby 中检查目录是否为空?有没有类似的东西:

Dir.exists?("directory")

(我知道那个函数不存在。)

【问题讨论】:

  • 我想看一个名为“Dir.empty?”的方法
  • @BenFlynn 5 年后,你的愿望has come true
  • @Janosch 无论是这个还是引力波存在的证据都是 2016 年最好的事情。

标签: ruby directory


【解决方案1】:

Ruby 现在有了Dir.empty?,让这变得非常简单:

Dir.empty?('your_directory') # => (true|false)

在 2.4.0 之前的 Rubies 中,您可以获取条目列表并自己查看它是否为空(考虑“.”和“..”)。见the docs

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

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

更新:上面的第一个方法用于使用正则表达式;现在它没有(显然)。下面的评论主要适用于以前的(正则表达式)版本。

【讨论】:

  • 第一个给了我错误,但第二个工作得很好。谢谢!
  • @Mark Szymanski:啊,是的,我将块包裹在括号中。固定。
  • 第一个命令也会忽略隐藏文件,例如 .git。
  • @Pan Thomakos:不会。第二个将,但第一个只拒绝仅由点组成的文件名。
  • 但是... 是一个有效的文件名(就像....,...),我认为你最好使用明确的x == '.' || x == '..' 检查而不是你的正则表达式。没错,... 是一个病态的案例,但准确地说出你的意思是个好主意。
【解决方案2】:

从 Ruby 2.4.0 开始,有 Dir.empty?

Dir.empty?('/') # => false

【讨论】:

    【解决方案3】:

    您可以使用条目来查看目录中的所有文件和文件夹:

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

    您也可以仅使用 glob 搜索文件:

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

    【讨论】:

    • Dir.glob('directory/*') 会忽略以. 开头的文件,例如.profile.git
    • @(mu 太短) - 你是对的。我更新了我的正则表达式以包含隐藏文件。
    • Dir.glob('directory/{,.}') 捕获“.”和“..”这么空?将始终返回 false。
    【解决方案4】:

    一个空目录应该只有两个链接(. 和 ..)。在 OSX 上这有效:

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

    ...但不适用于 Linux 或 Cygwin。 (感谢@DamianNowak)改编潘的回答:

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

    应该可以。

    【讨论】:

    • nlink 检查子目录的数量,这是错误的。 size 应该被检查。
    • @DamianNowak 不是这样,试试 irb File.stat('.').nlink ruby-doc.org/core-1.9.3/File/Stat.html#method-i-nlink
    • 必须特定于操作系统? pastie.org/4128791我正在使用 OSX Lion (11.4.0 Darwin)
    • 注意到我使用的是 ruby​​ 1.8.7。 “大小”返回我相信的字节数,因此在 OSX 上不起作用。如果您可以确认您的操作系统和 Ruby 版本,我建议您将其添加到现有答案中。
    【解决方案5】:

    不简单,但在 *nix 类型的系统中可以完美运行。

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

    【讨论】:

      【解决方案6】:

      这是我的模板。仅供参考,我正在寻找源中文件的某个匹配项。

      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
      

      如果有任何事情请告诉我:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 2019-11-01
        相关资源
        最近更新 更多