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 4 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 4 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 4 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 4 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 *
.