Hi,
i want to count the occurence of a searchstring in all files
below a directory and all its subdirectories
i have =
matches=0
Dir.glob(“E:/test/foobar/scripts//.xml”).each do |f|
matches += File.new(f).read.scan(’’).size
puts f
end
puts "Matchcount == " + matches.to_s
puts "Scanned Files == " +
Dir.glob(“E:/test/foobar/scripts//.xml”).size.to_s
Is there a better way ?
Regards,
Gilbert
On 24.08.2007 16:19, Rebhan, Gilbert wrote:
puts "Matchcount == " + matches.to_s
puts "Scanned Files == " +
Dir.glob(“E:/test/foobar/scripts//.xml”).size.to_s
Is there a better way ?
Yes, you should at least avoid globbing twice. This is really slow.
Also, you do not need two stars for the file name.
Then, you do not close files properly when reading. A simplified
version looks like this
files = Dir[“E:/test/foobar/scripts/**/*.xml”]
matches = files.inject(0) {|sum,f| sum + File.read(f).scan(’’).size}
printf “%10d matches\n%10d files\n”, matches, files.size
If you have a lot of files it may pay off to use Find.find instead of
Dir[].
Kind regards
robert
2007/8/27, Rebhan, Gilbert [email protected]:
matches = files.inject(0) {|sum,f| sum +
/*
I think that’s the reason you mentioned to use Find.find yor large
dirtrees ?!
Not exactly. My reasoning was that the Dir[] returns a large array
while Find invokes the block once per file found.
But your problem is related to error handling. Dunno what Find does
here but the root cause of your issue is that you seem to not have
permissions for one of the directories.
Kind regards
robert
2007/8/27, Rebhan, Gilbert [email protected]:
files = Dir[“E:/test/foobar/scripts/**/*.xml”]
matches = files.inject(0) {|sum,f| sum + File.read(f).scan(‘’).size}
printf “%10d matches\n%10d files\n”, matches, files.size
If you have a lot of files it may pay off to use Find.find instead of
Dir[].
*/
thanks, works like a charm 
Never used the inject method until now, i’m still on newbie level.
Took me a while, too. But if you get the hang of it you’ll see it’s a
really cool utility. At one point I rewrote all the Enumerable
methods via #inject just for the learning experience. 
Kind regards
robert