Gocli Package v0.8.0 Released

no extension

この前 v0.7.0 をリリースしたばかりだが,舌の根も乾かぬうちに v0.8.0 をリリースしてしまった。

今回はファイル・ディレクトリ操作用の gocli/file サブパッケージを追加した。

実は mattn/jvgrep を使ってみてディレクトリの再帰検索はなかなか便利なことに気づき,自分でも実装してみようと思ったのだ。

Go 言語標準の filepath.Glob() 関数はなかなか性能がよくて,パス検索に以下のワイルドカードが使える。

pattern:
    { term }
term:
    '*'         matches any sequence of non-Separator characters
    '?'         matches any single non-Separator character
    '[' [ '^' ] { character-range } ']'
                character class (must be non-empty)
    c           matches character c (c != '*', '?', '\\', '[')
    '\\' c      matches character c

character-range:
    c           matches character c (c != '\\', '-', ']')
    '\\' c      matches character c
    lo '-' hi   matches character c for lo <= c <= hi
via filepath - The Go Programming Language

しかし,残念ながら Ruby の Dir.glob にあるようなディレクトリの再帰検索(**/)は用意されていない。 そこで今回 filepath.Glob()filepath.Walk() を組み合わせる形で file.Glob() 関数を作ってみた。

こんなふうに使える。

package main

import (
    "fmt"
    "os"

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

func main() {
    if len(os.Args) < 2 {
        fmt.Fprintln(os.Stderr, os.ErrInvalid)
    }

    for _, path := range os.Args[1:] {
        paths := file.Glob(path, file.NewGlobOption())
        if len(paths) > 0 {
            for _, path := range paths {
                fmt.Println(path)
            }
        }
    }
}

これを実行するとこんな感じになる。

$ go run /path/to/search.go  **/*.lua
nyagos.d\aliasandset.lua
nyagos.d\aliases.lua
nyagos.d\backquote.lua
nyagos.d\box.lua
nyagos.d\brace.lua
nyagos.d\catalog\autocd.lua
nyagos.d\catalog\autols.lua
nyagos.d\catalog\cho.lua
nyagos.d\catalog\dollar.lua
nyagos.d\catalog\ezoe.lua
nyagos.d\catalog\git.lua
nyagos.d\catalog\gogit.lua
nyagos.d\catalog\neco.lua
nyagos.d\catalog\nyagosini.lua
nyagos.d\catalog\peco.lua
nyagos.d\catalog\subcomplete.lua
nyagos.d\cdlnk.lua
nyagos.d\comspec.lua
nyagos.d\lns.lua
nyagos.d\open.lua
nyagos.d\start.lua
nyagos.d\su.lua
nyagos.d\suffix.lua
nyagos.d\swapstdfunc.lua
nyagos.d\trash.lua
nyagos.d\use.lua

Go 言語製なので,フォルダの区切り文字には '/''\' の両方が使える。 また出力結果の内,フォルダについては末尾にフォルダ区切り文字('/' または '\')を付加している。 その他,細かい使い方については glob_test.go を参照のこと。

本当はもう少しスマートなコードを書きたかったんだけど,行き当たりばったりで書いてたらエラく汚いコードになってしまった。 まぁ,これが今の私の実力,ということで。 そのうち refactoring できる機会もあるかもしれない。

spiegel-im-spiegel/gocli パッケージは CLI (Command-Line Interface) を組む際に(主に自分が)便利な細々とした機能を収録している。 他の人には使いにくいかもしれないし大した内容でもないため CC0 で公開している。 一切の権利を放棄しているので自由に持っていって弄っていただいて構わない。

参考図書

photo
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan Brian W. Kernighan 柴田 芳樹
丸善出版 2016-06-20
評価

スターティングGo言語 (CodeZine BOOKS) Go言語によるWebアプリケーション開発 Kotlinスタートブック -新しいAndroidプログラミング Docker実戦活用ガイド グッド・マス ギークのための数・論理・計算機科学

著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。

reviewed by Spiegel on 2016-07-13 (powered by G-Tools)