我遇到一个简单的程序有关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()。
File.join(blobs_dir, "**", "*")
Run Code Online (Sandbox Code Playgroud)
这只是为全局构建路径模式。结果是/path/to/dir/**/*
**和*的含义:
*:匹配任何文件
**:递归匹配目录
因此,您的代码用于删除目录中的每个符号链接/path/to/dir。
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)。
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)
这是一种常见且非常方便的递归列出或遍历目录的方法
| 归档时间: |
|
| 查看次数: |
2532 次 |
| 最近记录: |