Bug #17283
closedWhy does Dir.glob's ** match files in current directory?
Description
If my current directory has 1 file and 1 dir, and I use Dir.glob("**/*") or even just **, both the dir and the file would be matched.
I would expect that only the dir will be matched, since the glob starts with **, which wants to match a directory.
This is a behavior that's different from bash. In bash only the directory would be matched.
Ruby:
 Directory of C:\Users\User\z
10/24/2020  10:42 PM    <DIR>          .
10/24/2020  10:42 PM    <DIR>          ..
10/24/2020  10:42 PM    <DIR>          dir
10/24/2020  10:41 PM                 4 file
               1 File(s)              4 bytes
               3 Dir(s)  256,993,574,912 bytes free
C:\Users\User\z>irb
irb(main):001:0> Dir.glob("**/*")
=> ["dir", "file"]
irb(main):002:0> Dir.glob("**")
=> ["dir", "file"]
In Bash:
root@debian:~/rubytest# ls -lah
total 12K
drwxr-xr-x  3 root root 4.0K Oct 23 17:44 .
drwx------ 19 root root 4.0K Oct 23 17:43 ..
drwxr-xr-x  2 root root 4.0K Oct 23 17:44 dir
-rw-r--r--  1 root root    0 Oct 23 17:44 file
root@debian:~/rubytest# ls -lah **/*
-rw-r--r-- 1 root root 0 Oct 23 17:44 dir/subfile
I know the behavior is not meant to be 1:1 to bash. But this is still unexpected and doesn't make sense to me. Is this intended?
The documentation says:
**
Matches directories recursively.
  
        
          
          Updated by Eregon (Benoit Daloze) about 5 years ago
          
          
        
        
      
      - Related to Bug #17280: Dir.glob with FNM_DOTMATCH matches ".." and "." and results in duplicated entries added
 
        
          
          Updated by Eregon (Benoit Daloze) about 5 years ago
          
          
        
        
      
      Interestingly this behavior differs between Bash and Zsh:
$ tree
.
├── dir
│   └── subfile
└── foo
$ bash
$ echo **
dir foo
$ echo **/*
dir/subfile
$ zsh -f
$ echo **
dir foo
$ echo **/*
dir dir/subfile foo
I think we cannot change the behavior for compatibility.
As a fun fact, "**" can even match the parent directory with FNM_DOTMATCH (#17280).
        
          
          Updated by nobu (Nobuyoshi Nakada) about 5 years ago
          
          
        
        
      
      - Status changed from Open to Closed
 
Applied in changeset git|e880d075f847ff17e1bc77301a9ed363fb40525b.
[DOC] refined "**" description in Dir.glob [ci skip]
As same as the description for File.fnmatch.
[Bug #17283]
        
          
          Updated by nobu (Nobuyoshi Nakada) about 5 years ago
          
          
        
        
      
      Eregon (Benoit Daloze) wrote in #note-2:
Interestingly this behavior differs between Bash and Zsh:
Bash doesn't support **, and it just equals *.