filesystem/name_matching_parens.rb

tests/_examples/filesystem/name_matching_parens.rb in the metorex repository.

# `Dir.glob` reads a pattern against a directory tree: `*` and `?` within one
# name, `[...]` for a set, `{a,b}` for a list of patterns, and `**` for a walk
# down through the subdirectories.
require "tmpdir"

root = File.join(Dir.tmpdir, "metorex_name_matching_parens")
Dir.mkdir(root) unless Dir.exist?(root)
%w[a a/b a/b/c].each do |part|
  held = File.join(root, part)
  Dir.mkdir(held) unless Dir.exist?(held)
end
%w[a/one.rb a/two.txt a/.hidden a/b/three.rb a/b/c/four.rb].each do |part|
  File.write(File.join(root, part), "")
end

Dir.chdir(root) do
  p(Dir.glob("a/*").sort)
  p(Dir.glob("a/*.rb"))
  p(Dir.glob("a/{one,two}.*").sort)
  p(Dir.glob("a/?ne.rb"))
  p(Dir.glob("a/[ot]ne.rb"))
  p(Dir.glob("**/*.rb").sort)
  p(Dir.glob("a/.*").sort)
  p(Dir.glob("*", File::FNM_DOTMATCH).sort)
  p(Dir.glob("**/", base: "a").sort)
  p(Dir.glob("*", base: "a/b").sort)
  p(Dir["a/*.rb"])
  p(Dir.glob("a/nothing*"))
  p(Dir.glob(""))
  collected = []
  p(Dir.glob("a/*.rb") { |held| collected << held })
  p(collected)
end

%w[a/b/c/four.rb a/b/three.rb a/one.rb a/two.txt a/.hidden].each do |part|
  File.delete(File.join(root, part))
end
%w[a/b/c a/b a].each { |part| Dir.rmdir(File.join(root, part)) }
Dir.rmdir(root)

Output:

["a/b", "a/one.rb", "a/two.txt"]
["a/one.rb"]
["a/one.rb", "a/two.txt"]
["a/one.rb"]
["a/one.rb"]
["a/b/c/four.rb", "a/b/three.rb", "a/one.rb"]
["a/.", "a/.hidden"]
[".", "a"]
["/", "b/", "b/c/"]
["c", "three.rb"]
["a/one.rb"]
[]
[]
nil
["a/one.rb"]