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

dj1*_*008 5 ruby file dir

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

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

我有两个困惑:

首先,第二和第三参数的含义是File.join(@blobs_dir, "**", "*")什么?

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

xda*_*azz 5

File.join(blobs_dir, "**", "*")
Run Code Online (Sandbox Code Playgroud)

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

***的含义:

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

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


fal*_*tru 5

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

File.join('a', 'b', 'c')
# => "a/b/c"
Run Code Online (Sandbox Code Playgroud)

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

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


lob*_*dik 5

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

File.join("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)

返回“a/b/c”。也和比较常用的Array的join方法差不多,就像这样:

["hello", "ruby", "world"].join(", ")
# => "hello, ruby, world"
Run Code Online (Sandbox Code Playgroud)

但是,使用 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"]
Run Code Online (Sandbox Code Playgroud)

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

这是一种常见且非常方便的递归列出或遍历目录的方法