Journal

WSL2からWindowsのフォルダを触るとき、Explorerより先にGoのCLIを書く理由

朝いちでDownloadsの中身だけ見たいときがあります。Explorerでもできますが、並び替えを触って、余計な列を閉じて、別の場所を開いたまま戻ってきて、という小さい往復が毎回あります。私はこの手の往復がかなり嫌いです。

以前、ダウンロードフォルダの更新ファイルを新しい順に5件だけ出すGoのCLIを30分くらいで書きました。いまでも朝の作業前にたまに叩きます。WSL2からWindows側のフォルダをそのまま渡せるので、ターミナルを開いた流れのまま終わるのが気に入っています。

画面を開くより、引数を渡したほうが早い場面

WSL2からWindowsのファイルを触るとき、 /mnt/c/Users/… の形で見えているだけでも十分ありがたいです。Explorerが悪いわけではありません。ただ、朝の頭で欲しいのは立派な画面ではなく、最近触った5件だけということがよくあります。そこに小さい道具を差し込めば、GUIで探す時間をかなり減らせます。

記事用に、動作確認した最小のコードを下に置きます。Dockerで隔離して確認したので、そのまま試せます。

docker run --rm -v "$PWD":/work -w /work golang:1.25 go run recentfiles.go demo
package main

import (
    "fmt"
    "os"
    "path/filepath"
    "sort"
    "time"
)

type entry struct {
    path string
    mod  time.Time
}

func main() {
    dir := "."
    if len(os.Args) > 1 {
        dir = os.Args[1]
    }

    files := make([]entry, 0, 32)
    filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
        if err != nil || d.IsDir() {
            return nil
        }
        info, err := d.Info()
        if err != nil {
            return nil
        }
        files = append(files, entry{path: path, mod: info.ModTime()})
        return nil
    })

    sort.Slice(files, func(i, j int) bool {
        return files[i].mod.After(files[j].mod)
    })

    limit := 5
    if len(files) < limit {
        limit = len(files)
    }

    for _, f := range files[:limit] {
        fmt.Printf("%s\t%s\n", f.mod.Format("2006-01-02 15:04"), f.path)
    }
}

自分のPCなら、自分の見たい形に寄せていい

こういうCLIは派手ではありません。認証もないですし、設定画面もありません。ただ、朝に一回だけ叩く道具としては、その薄さがちょうどいいです。AIに叩き台を書かせるのもこの程度までなら相性がいいですが、何を見たいかを決めるところは自分でやったほうが結局速いです。非エンジニアがバイブコーディングでこの手の道具を量産しても、あとで直せないなら自分の道具にはなりません。

私はGoを現代のC言語みたいなものだと思っています。ファイル、標準入出力、プロセス、そのあたりを変に飾らず触れます。しかも単体バイナリで終わるので、Windows側に置いてもWSL2側から叩いても扱いが軽いです。

自分のPCなのだから、保存場所も、眺め方も、少しくらい勝手に変えていいはずです。大きな自動化より、朝の10秒を削る小さい道具のほうが長く残ることがあります。私にとってWSL2とGoの組み合わせは、まさにそのための組み合わせです。

Previous