diff --git a/cmd/goxmlstruct/main.go b/cmd/goxmlstruct/main.go
index b3146ad..eba88af 100644
--- a/cmd/goxmlstruct/main.go
+++ b/cmd/goxmlstruct/main.go
@@ -5,6 +5,8 @@ import (
 	"flag"
 	"fmt"
 	"os"
+	"path/filepath"
+	"slices"
 
 	"github.com/twpayne/go-xmlstruct"
 )
@@ -23,6 +25,7 @@ var (
 	noExport                     = flag.Bool("no-export", false, "create unexported types")
 	output                       = flag.String("output", "", "output filename")
 	packageName                  = flag.String("package-name", "main", "package name")
+	pattern                      = flag.String("pattern", "", "filename pattern to observe")
 	preserveOrder                = flag.Bool("preserve-order", xmlstruct.DefaultPreserveOrder, "preserve order of types and fields")
 	timeLayout                   = flag.String("time-layout", "2006-01-02T15:04:05Z", "time layout")
 	topLevelAttributes           = flag.Bool("top-level-attributes", xmlstruct.DefaultTopLevelAttributes, "include top level attributes")
@@ -68,13 +71,22 @@ func run() error {
 	}
 	generator := xmlstruct.NewGenerator(options...)
 
-	if flag.NArg() == 0 {
+	filenames := slices.Clone(flag.Args())
+	if *pattern != "" {
+		matches, err := filepath.Glob(*pattern)
+		if err != nil {
+			return err
+		}
+		filenames = append(filenames, matches...)
+	}
+
+	if len(filenames) == 0 {
 		if err := generator.ObserveReader(os.Stdin); err != nil {
 			return err
 		}
 	} else {
-		for _, arg := range flag.Args() {
-			if err := generator.ObserveFile(arg); err != nil {
+		for _, filename := range filenames {
+			if err := generator.ObserveFile(filename); err != nil {
 				return err
 			}
 		}