【发布时间】:2019-01-07 02:13:23
【问题描述】:
在 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
这可行,但有点难看,感觉很hacky,并且需要跟踪两个变量来处理稍微不同的事情(未转义的名称对其他操作很有用)。
对于同样的问题还有其他解决方案吗(理想情况下运行起来不会太慢)?
【问题讨论】:
-
猜猜在 ruby 中仍然缺少这个功能:bugs.ruby-lang.org/issues/8258stackoverflow.com/questions/14127343/…
-
如果你不介意使用 Unix
find工具 ...%x{find "#{dir}"}.split("\n")... 你可以在#{dir}之后添加-type f以仅返回文件