# Help on a script

**URL:** <https://www.ruby-forum.com/t/help-on-a-script/181920>\
**Category:** Ruby\
**Created:** [January 20, 2010, 9:20am UTC](https://www.ruby-forum.com/t/help-on-a-script/181920 "2010-01-20T09:20:04Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![rubynut](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/8e8cbc/32.png) [@rubynut](https://www.ruby-forum.com/u/rubynut)\
**Post date:** [January 20, 2010, 9:20am UTC](https://www.ruby-forum.com/t/help-on-a-script/181920/1 "2010-01-20T09:20:04Z")

</div>

Hi,

I just wrote a small script to find the files in current directory and  
its child directories which include the word “ruby”.  
But it can’t work, please help point out my error, thanks.

def myfind(path=".")  
Dir.foreach(path) do |f|  
if File.file? f  
open(f) do |c|  
puts “#{path}/#{f}” if c.read.scan(/ruby/)  
end  
elsif File.directory? f  
newpath = File.join path,f  
myfind(newpath)  
end  
end  
end

myfind

---

<div class="post-metadata">

**Author:** ![rubynut](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/8e8cbc/32.png) [@rubynut](https://www.ruby-forum.com/u/rubynut)\
**Post date:** [January 20, 2010, 10:24am UTC](https://www.ruby-forum.com/t/help-on-a-script/181920/2 "2010-01-20T10:24:27Z")

</div>

exclude . and … in directories

---

<div class="post-metadata">

**Author:** ![rubynut](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/8e8cbc/32.png) [@rubynut](https://www.ruby-forum.com/u/rubynut)\
**Post date:** [January 20, 2010, 10:26am UTC](https://www.ruby-forum.com/t/help-on-a-script/181920/3 "2010-01-20T10:26:13Z")

</div>

elsif File.directory?(f) && File.basename(f) != ‘…’ && File.basename(f)  
!=  
‘.’

Maybe like this? ☹

---

<div class="post-metadata">

**Author:** ![rubynut](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/8e8cbc/32.png) [@rubynut](https://www.ruby-forum.com/u/rubynut)\
**Post date:** [January 20, 2010, 10:39am UTC](https://www.ruby-forum.com/t/help-on-a-script/181920/4 "2010-01-20T10:39:06Z")

</div>

Ruby N. wrote:

> ```
> open(f) do |c|
> 
> ```

Hi,

Walking the directory recursively can be done with ‘glob’, or it’s  
equivalent method ‘[]’. The following will recursively find all files  
that have a ‘.rb’ extension, starting from the current directory.

Dir[’\*\*/\*.rb’].each { |path| puts path }

The scan method returns an array of matches, or takes a block which can  
act on that array. To check if any matches where found, one can check  
that the returned array is not empty, for example:

puts path if c.read.scan(/ruby/).length \> 0

ammar

---

<div class="post-metadata">

**Author:** ![rubynut](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/8e8cbc/32.png) [@rubynut](https://www.ruby-forum.com/u/rubynut)\
**Post date:** [January 20, 2010, 11:03am UTC](https://www.ruby-forum.com/t/help-on-a-script/181920/5 "2010-01-20T11:03:06Z")

</div>

Thanks all.  
Under all your helps, I finally get the script to work correctly.

def myfind(path=".")  
Dir.foreach(path) do |f|  
f = File.join(path,f)

## puts f

```
    if File.file? f
        open(f) do |c|
            puts "#{f}" unless c.read.scan(/ruby/).empty?
        end
    elsif File.directory? f and File.basename(f) != "." and

```

File.basename(f) != “…”  
myfind(f)  
end  
end  
end

myfind

Thanks.  
Jenn.

---

<div class="post-metadata">

**Author:** ![rubynut](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/8e8cbc/32.png) [@rubynut](https://www.ruby-forum.com/u/rubynut)\
**Post date:** [January 20, 2010, 12:47pm UTC](https://www.ruby-forum.com/t/help-on-a-script/181920/6 "2010-01-20T12:47:18Z")

</div>

2010/1/20 Ruby N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Thanks all.  
> Under all your helps, I finally get the script to work correctly.
> 
> def myfind(path=“.”)  
> Dir.foreach(path) do |f|  
> f = File.join(path,f)
> 
> ## puts f
> 
> ```
> if File.file? f
> open(f) do |c|
> puts "#{f}" unless c.read.scan(/ruby/).empty?
> 
> ```

You just need a single match - not all of them.

> ```
> end
> elsif File.directory? f and File.basename(f) != "." and
> 
> ```
> 
> File.basename(f) != “…”  
> myfind(f)  
> end  
> end  
> end
> 
> myfind

It is easier if you use Find:

require ‘find’

Find.find path do |f|  
puts f if File.file?(f) && /ruby/ =~ File.read(f)  
end

🙂

[http://www.ruby-doc.org/stdlib/libdoc/find/rdoc/index.html](http://www.ruby-doc.org/stdlib/libdoc/find/rdoc/index.html)

Kind regards

robert
