我正在尝试将目录中的文件与其他目录中的其他文件以及使用ruby的子目录进行匹配。
我尝试使用此文件架构进行小型测试:
tree .
.
├── src
│ ├── lol
│ │ └── toto
│ └── lolilolpouet
│ └── tutu
│ └── tata
├── test
│ ├── tata
│ └── toto
└── test.rb
我的红宝石代码是:
require 'find'
src_dir_files = []
Find.find('./src') do |file|
src_dir_files << file
puts "found #{file}"
end
Dir.foreach('./test') do |file|
next if file == '.' or file == '..'
puts "search for /#{file}"
res = src_dir_files.bsearch{|s| s.end_with? "/#{file}"}
puts "Found :#{res}"
end
输出结果为:
found ./src
found ./src/lol
found ./src/lol/toto
found ./src/lolilolpouet
found ./src/lolilolpouet/tutu
found ./src/lolilolpouet/tutu/tata
search for /tata
Found :./src/lolilolpouet/tutu/tata
search for /toto
Found :
搜索toto不会返回结果。 知道为什么,以及如何解决它?
编辑:如果我用find替换bsearch,上面的代码就会按预期运行。 任何人都可以向我解释这两种方法之间的区别吗?
如果您想尝试,我上传了一个tgz:
答案 0 :(得分:1)
我会这样做:
src = Dir["./src/**/*"]
#=> ["./src/lol", "./src/lol/toto", "./src/lolilolpouet", "./src/lolilolpouet/tutu", "./src/lolilolpouet/tutu/tata"]
Dir["./test/**/*"].each do |test_file|
file = src.find { |x| x.include? test_file.gsub(/.*\//, "") }
puts "Found #{file}"
end
# >> Found ./src/lolilolpouet/tutu/tata
# >> Found ./src/lol/toto
答案 1 :(得分:0)
我猜测src_dir_files
没有排序。