当顶层目录的名称可能包含全局字符时,递归列出所有路径

时间:2019-01-07 02:13:24

标签: ruby glob

在Ruby中,我们可以递归列出目录的所有内容,如下所示:

dir = '/tmp'
Dir.glob("#{dir}/**/*") # Works

但是,如果目录名称中包含glob字符,则此操作将失败

dir = '/tmp/test[folder]ing'
Dir.glob("#{dir}/**/*") # Does not work

当我们不知道将传递给脚本的目录名称时(例如,当将其作为参数给出时),一种解决方案是先从其名称中转义有问题的字符

dir = '/tmp/test[folder]ing'
escaped_dir = dir.gsub(/([\*\?\[\]{}\\])/, '\\\\\1')
Dir.glob("#{escaped_dir}/**/*") # Works

这有效,但是有点丑陋,让人感觉很笨拙,并且需要跟踪两个变量来处理稍有不同的事物(未转义的名称对于其他操作很有用)。

是否有其他解决此问题的方法(理想情况下,运行起来不会太慢)?

1 个答案:

答案 0 :(得分:0)

Pathname可以做到:

require 'pathname'

dir = '/tmp/test[folder]ing'
Pathname(dir).glob('**/*')