我在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()
。
答案 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