关于Ruby中的Dir []和File.join()的困惑

时间:2014-02-21 07:56:03

标签: ruby file dir

我在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, "**", "*")中的第二个和第三个参数是什么意思?

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

4 个答案:

答案 0 :(得分:5)

File.join(blobs_dir, "**", "*")

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

***的意思是:

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

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

答案 1 :(得分:4)

File::join用于将路径组件与分隔符File::SEPARATOR(通常为/)联接:

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

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

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

答案 2 :(得分:4)

File.join()只是使用单独的斜杠将其所有参数连接起来。 例如,

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

返回“a / b / c”。它几乎等同于更常用的Array的连接方法,就像这样:

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

然而,使用File.join(),另外做了两件事:它澄清了你正在获得与文件路径相关的东西,并添加'/'作为参数(而不是在我的数组示例中的“,”)。由于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 :(得分:1)

来自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