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

しかし,残念ながら 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
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)