Ruby和Unix中的文件通配

时间:2013-08-01 02:09:48

标签: ruby

我的桌面上有以下目录结构:

sample/
  a.rb
  b.rb
  c.rb
  sub_sample/
    blah.rb
  whatever/
    meow.rb

Unix globbing在bash中表现得如预期:

Desktop $ ls sample/*.rb
sample/a.rb sample/b.rb sample/c.rb

Desktop $ ls sample/*/*.rb
sample/sub_sample/blah.rb   sample/whatever/meow.rb

Desktop $ ls sample/**/*.rb
sample/sub_sample/blah.rb   sample/whatever/meow.rb

显然,最后一个例子将递归地为glob,类似于Ruby,如果是globstar is enabled

以下是Ruby中的globbing如何工作(最后一个例子产生不同的输出):

>> Dir[Dir.home + "/Desktop/sample/*.rb"]
=> ["/Users/powers/Desktop/sample/a.rb", "/Users/powers/Desktop/sample/b.rb", "/Users/powers/Desktop/sample/c.rb"]

>> Dir[Dir.home + "/Desktop/sample/*/*.rb"]
=> ["/Users/powers/Desktop/sample/sub_sample/blah.rb", "/Users/powers/Desktop/sample/whatever/meow.rb"]

# This is the recursive output that I don't understand
>> Dir[Dir.home + "/Desktop/sample/**/*.rb"]
=> ["/Users/powers/Desktop/sample/a.rb", "/Users/powers/Desktop/sample/b.rb", "/Users/powers/Desktop/sample/c.rb", "/Users/powers/Desktop/sample/sub_sample/blah.rb", "/Users/powers/Desktop/sample/whatever/meow.rb"]

当使用多个星形时,它的行为与单个星形相同:

>> Dir[Dir.home + "/Desktop/sample/***************/*.rb"]
=> ["/Users/powers/Desktop/sample/sub_sample/blah.rb", "/Users/powers/Desktop/sample/whatever/meow.rb"]

以下是我的问题:

  1. **如何递归搜索所有文件夹?我认为*可以匹配任何长度的东西。 **是否被解释为完全不同的东西(如方法)?

  2. 还有其他方法可以在Ruby中递归遍历吗?似乎/**/*是Ruby中“glob”的'标准'方式,但语法对我来说有点混乱。希望当我弄清楚**正在做什么时,我会更加熟悉它。

  3. 感谢。

1 个答案:

答案 0 :(得分:1)

Dir['path/**/*.rb']或多或少,就像说:

find path -name '*.rb'
来自shell的

因此,对于Ruby的Dir** glob搜索指定的path以及path下的所有目录。显然bash的**只查看path下的目录,而不查看path中的文件。