朝いちで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の組み合わせは、まさにそのための組み合わせです。