简体   繁体   中英

Is there a way to write a glob pattern that matches all files except those in a folder?

I need to write a file glob that will match all files except for those that are contained within a certain folder (eg all files except those contained within the high level folder foo/ .

I've arrived at the following glob:

!(foo)/**/*

However, this glob doesn't seem to match on any files in Ruby's File.fnmatch (even with FNM_PATHNAME and FNM_DOTMATCH set to true .

Also, Ruby's glob interpreter seemed to have different behavior than JavaScript's:

JavaScript glob interpreter matches all strings

Ruby glob interpreter doesn't match any strings:

2.6.2 :027 > File.fnmatch("!(foo)/**/*", "hello/world.js")
 => false
2.6.2 :028 > File.fnmatch("!(foo)/**/*", "test/some/globs")
 => false
2.6.2 :029 > File.fnmatch("!(foo)/**/*", "foo/bar/something.txt")
 => false

If you really need to use a glob then you can list what is allowed, making it equivalent to the negation:

extglob = "{[^f]*,f,f[^o]*,fo,fo[^o]*,foo?*}/**/*"

File.fnmatch(extglob, "hello/world.js", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> true

File.fnmatch(extglob, "test/some/globs", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> true

File.fnmatch(extglob, "foo/bar/something.txt", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> false

File.fnmatch(extglob, "food/bar/something.txt", File::FNM_EXTGLOB | File::FNM_PATHNAME)
#=> true

{[^f]*,f,f[^o]*,fo,fo[^o]*,foo?*} means:

  • Any string that doesn't start with f
  • The strinf f
  • Any string that starts with f and whose second character is not a o
  • The string fo
  • Any string that starts with fo and whose third character is not a o
  • Any string that starts with foo if it has at least one more character

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM