拡張版 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 は大歓迎である。
ブックマーク
参考図書
- プログラミング言語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 言語の教科書と言ってもいいだろう。
- Go言語による並行処理
- Katherine Cox-Buday (著), 山口 能迪 (翻訳)
- オライリージャパン 2018-10-26
- 単行本(ソフトカバー)
- 4873118468 (ASIN), 9784873118468 (EAN), 4873118468 (ISBN)
- 評価