# Glob but not fnmatch?

**URL:** <https://www.ruby-forum.com/t/glob-but-not-fnmatch/95663>\
**Category:** Ruby\
**Created:** [June 8, 2006, 2:02pm UTC](https://www.ruby-forum.com/t/glob-but-not-fnmatch/95663 "2006-06-08T14:02:43Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 8, 2006, 2:02pm UTC](https://www.ruby-forum.com/t/glob-but-not-fnmatch/95663/1 "2006-06-08T14:02:43Z")

</div>

Can’t imagine this is right (Linux, Ruby 1.8.4)

Dir.glob(‘lib/\*\*/\*’) #=\> [‘lib/facets.rb’]

File.fnmatch?(‘lib/\*\*/\*’, ‘lib/facets.rb’) #=\> false

In the mean time, anyone got a working Ruby-coded #fnmatch? I can use?

T.

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 8, 2006, 2:08pm UTC](https://www.ruby-forum.com/t/glob-but-not-fnmatch/95663/2 "2006-06-08T14:08:59Z")

</div>

Hi!

It does seem strange…

JRuby does it like this in Java, it should be exceedingly trivial to  
convert to Ruby:

```
    checkArgumentCount(args, 2, -1);
    String pattern = args[0].convertToString().toString();
    RubyString path = args[1].convertToString();
    int opts = (int) (args.length > 2 ?

```

args[2].convertToInteger().getLongValue() : 0);

```
    boolean dot = pattern.startsWith(".");

    pattern = pattern.replaceAll("(\\.)", "\\\\$1");
    pattern = pattern.replaceAll("(?<=[^\\\\])\\*", ".*");
    pattern = pattern.replaceAll("^\\*", ".*");
    pattern = pattern.replaceAll("(?<=[^\\\\])\\?", ".");
    pattern = pattern.replaceAll("^\\?", ".");
    if ((opts & FNM_NOESCAPE) != FNM_NOESCAPE) {
        pattern = pattern.replaceAll("\\\\([^\\\\*\\\\?])", "$1");
    }
    pattern = pattern.replaceAll("\\{", "\\\\{");
    pattern = pattern.replaceAll("\\}", "\\\\}");
    pattern = "^" + pattern + "$";

    if (path.toString().startsWith(".") && !dot) {
        return getRuntime().newBoolean(false);
    }

    return getRuntime().newBoolean(Pattern.matches(pattern,

```

path.toString()));

Regards  
Ola B.

----- Original Message -----  
From: removed\_email\_address@domain.invalid  
Date: Thursday, June 8, 2006 2:02 pm  
Subject: glob but not fnmatch?  
To: removed\_email\_address@domain.invalid (ruby-talk ML)

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [June 8, 2006, 2:49pm UTC](https://www.ruby-forum.com/t/glob-but-not-fnmatch/95663/3 "2006-06-08T14:49:43Z")

</div>

2006/6/8, removed\_email\_address@domain.invalid [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Can’t imagine this is right (Linux, Ruby 1.8.4)
> 
> Dir.glob(‘lib/\*\*/\*’) #=\> [‘lib/facets.rb’]
> 
> File.fnmatch?(‘lib/\*\*/\*’, ‘lib/facets.rb’) #=\> false
> 
> In the mean time, anyone got a working Ruby-coded #fnmatch? I can use?

As far as I can see File.fnmatch does not support directory path  
matching with “\*\*”:  
[http://www.ruby-doc.org/core/classes/File.html#M000012](http://www.ruby-doc.org/core/classes/File.html#M000012)

So although this may seem inconvenient / asymmetric behavior conforms  
at least to the docs.

robert
