我的桌面上有以下目录结构:
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"]
以下是我的问题:
**
如何递归搜索所有文件夹?我认为*
可以匹配任何长度的东西。 **
是否被解释为完全不同的东西(如方法)?
还有其他方法可以在Ruby中递归遍历吗?似乎/**/*
是Ruby中“glob”的'标准'方式,但语法对我来说有点混乱。希望当我弄清楚**
正在做什么时,我会更加熟悉它。
感谢。
答案 0 :(得分:1)
说Dir['path/**/*.rb']
或多或少,就像说:
find path -name '*.rb'
来自shell的因此,对于Ruby的Dir
,**
glob搜索指定的path
以及path
下的所有目录。显然bash的**
只查看path
下的目录,而不查看path
中的文件。