拡張版 Glob 関数を書いてみた

前回の記事を書いたあと,ちょっと思いついたので手遊びに filepath.Glob() 関数の拡張版を書いてみた。

ディレクトリを再帰的に検索する **/ ワイルドカードが使えるのが特徴で,内部で件の saracen/walker パッケージを使っている。 とはいえ,全体的に素朴な作りになっているため,スピードは期待しないで欲しい(笑)

たとえば以下のようなコードを書いてみる。

package main

import (
	"flag"
	"fmt"
	"os"

	"github.com/spiegel-im-spiegel/file"
)

func main() {
	fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
	if err := fs.Parse(os.Args); err != nil {
		fmt.Fprintf(os.Stderr, "%+v\n", err)
		return
	}
    if fs.NArg() < 2 {
		fmt.Fprintln(os.Stderr, os.ErrInvalid)
		return
	}

	matches, err := file.Glob(fs.Arg(1), file.WithFlags(file.ContainsFile))
	if err != nil {
		fmt.Fprintf(os.Stderr, "%+v\n", err)
		return
	}
	fmt.Println("Count:", len(matches))
	for _ , path := range matches {
		fmt.Println(path)
	}
}

これに対して /usr/local/go/src/ ディレクトリ以下のファイルを取得したいなら,コマンドラインの引数に /usr/local/go/src/**/* を指定すればよい。 結果は以下の通り。

$ go run work/sample.go "/usr/local/go/src/**/*"
Count: 6008
/usr/local/go/src/Make.dist
/usr/local/go/src/README.vendor
/usr/local/go/src/all.bash
/usr/local/go/src/all.bat
/usr/local/go/src/all.rc
/usr/local/go/src/archive/tar/common.go
/usr/local/go/src/archive/tar/example_test.go
/usr/local/go/src/archive/tar/format.go
/usr/local/go/src/archive/tar/reader.go
/usr/local/go/src/archive/tar/reader_test.go
/usr/local/go/src/archive/tar/stat_actime1.go
/usr/local/go/src/archive/tar/stat_actime2.go
...

もちろんオリジナルの filepath.Glob() 関数の syntax も使える。

$ go run work/sample.go "/usr/local/go/src/**/*.[ch]"
Count: 77
/usr/local/go/src/cmd/go/testdata/src/badc/x.c
/usr/local/go/src/cmd/internal/goobj/testdata/mycgo/c1.c
/usr/local/go/src/cmd/internal/goobj/testdata/mycgo/c2.c
/usr/local/go/src/cmd/vendor/golang.org/x/sys/unix/gccgo_c.c
/usr/local/go/src/debug/dwarf/testdata/cycle.c
/usr/local/go/src/debug/dwarf/testdata/line1.c
/usr/local/go/src/debug/dwarf/testdata/line1.h
/usr/local/go/src/debug/dwarf/testdata/line2.c
/usr/local/go/src/debug/dwarf/testdata/ranges.c
/usr/local/go/src/debug/dwarf/testdata/split.c
/usr/local/go/src/debug/dwarf/testdata/typedef.c
/usr/local/go/src/debug/elf/testdata/hello.c
...

まぁ,私自身が趣味で書くのはフィルタ・プログラムが殆どで,ファイル検索機能にはあまりお世話にならないのだが(普段は shell スクリプト任せ),使えそうならご自由にどうぞ。 そうそう,「こうすれば効率よくなるよ」みたいな PR は大歓迎である。

ブックマーク

参考図書

photo
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
丸善出版 2016-06-20
単行本(ソフトカバー)
4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
評価     

著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。

reviewed by Spiegel on 2016-07-13 (powered by PA-APIv5)

photo
Go言語による並行処理
Katherine Cox-Buday (著), 山口 能迪 (翻訳)
オライリージャパン 2018-10-26
単行本(ソフトカバー)
4873118468 (ASIN), 9784873118468 (EAN), 4873118468 (ISBN)
評価     

Eブック版もある。感想はこちら。 Go 言語で並行処理を書くならこの本は必読書になるだろう。

reviewed by Spiegel on 2020-01-13 (powered by PA-APIv5)