【问题标题】:Confusion about Dir[] and File.join() in Ruby关于 Ruby 中的 Dir[] 和 File.join() 的困惑
【发布时间】:2014-02-21 07:56:03
【问题描述】:

我在Ruby中遇到了一个关于Dir[]File.join()的简单程序,

blobs_dir = '/path/to/dir'
Dir[File.join(blobs_dir, "**", "*")].each do |file|
       FileUtils.rm_rf(file) if File.symlink?(file)

我有两个困惑:

首先,File.join(@blobs_dir, "**", "*")中的第二个和第三个参数是什么意思?

其次,Dir[] 在 Ruby 中的用途是什么?我只知道它等同于Dir.glob(),但是,我确实不清楚Dir.glob()

【问题讨论】:

    标签: ruby file dir


    【解决方案1】:
    File.join(blobs_dir, "**", "*")
    

    这只是为 glob 构建路径模式。结果是/path/to/dir/**/*

    ***的含义:

    *:匹配任何文件
    **:递归匹配目录

    因此,您的代码用于删除目录/path/to/dir 中的每个符号链接。

    【讨论】:

    • 你几乎完成了你的答案。只要提到Dir::[]Dir::glob工作相同。
    • 嗯……我明白了。实际上我正在寻找这行但是,我确实不清楚 Dir.glob()。 你得到了我的 +1。 :-)
    【解决方案2】:

    File.join() 只是用单独的斜杠连接它的所有参数。 例如,

    File.join("a", "b", "c")
    

    返回“a/b/c”。几乎等同于使用更频繁的Array的join方法,就像这样:

    ["hello", "ruby", "world"].join(", ")
    # => "hello, ruby, world"
    

    然而,使用 File.join() 还做了两件事:它阐明了您正在获取与文件路径相关的内容,并添加 '/' 作为参数(而不是在我的 Array 示例中的“,”)。由于 Ruby 都是关于更好地描述您的意图的别名,因此这种方法更适合该任务。

    Dir[] 方法接受字符串或字符串数​​组作为简单的搜索模式,“*”作为所有文件或目录,“**”作为其他目录中的目录。例如,

    Dir["/var/*"]
    # => ["/var/lock", "/var/backups", "/var/lib", "/var/tmp", "/var/opt", "/var/local", "/var/run", "/var/spool", "/var/log", "/var/cache", "/var/mail"]
    

    Dir["/var/**/*"]
    # => ["/var/lock", "/var/backups", "/var/backups/dpkg.status.3.gz", "/var/backups/passwd.bak" ... (all files in all dirs in '/var')]
    

    递归地列出或遍历目录是一种常用且非常方便的方式

    【讨论】:

      【解决方案3】:

      File::join 用于连接带有分隔符File::SEPARATOR(通常为/)的路径组件:

      File.join('a', 'b', 'c')
      # => "a/b/c"
      

      Dir::glob 返回与模式匹配的文件名。

      给定的模式/path/to/dir/**/* 递归匹配任何文件(低于/path/to/dir)。

      【讨论】:

        【解决方案4】:

        来自here

        glob -- Expands pattern, which is an Array of patterns or a pattern String, and returns the results as matches or as arguments given to the block.
        *    -- Matches any file
        **   -- Matches directories recursively
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-21
          • 2013-09-09
          • 2014-10-30
          • 2011-12-13
          • 2017-12-04
          • 2012-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多