レポジトリ内でドキュメントを探している時に、特定ディレクトリの中のファイルをgitのcommit日の順に並べて新しめのファイルを見つけたいなーと思ったことがあったのでやってみた。
例えば https://github.com/golang/go のdoc/以下にある全てのファイルをcommit日時順に一覧してみるには、以下のコマンド一つで良い。
$ git ls-files doc | xargs -I@ bash -c 'echo "$(git log -1 --format="%aI" -- @)" @' | sort -r 2018-01-11T11:30:49-05:00 doc/go1.10.html 2018-01-11T10:41:03-08:00 doc/go_spec.html 2018-01-09T15:32:22-05:00 doc/diagnostics.html 2018-01-09T15:32:22-05:00 doc/debugging_with_gdb.html 2018-01-09T15:26:21-05:00 doc/install-source.html 2018-01-09T15:26:21-05:00 doc/go_faq.html ...
やっていることは
git ls-files doc
- doc以下のファイル一覧を出す
xargs -I@ bash -c 'echo "$(git log -1 --format="%aI" -- @)" @'
- xargsの-Iオプションを使って、ファイル名一つ一つをコマンドに渡す
- 例えば
bash -c 'echo "$(git log -1 --format="%aI" -- doc/go1.10.html)" doc/go1.10.html'
のように展開される
git log -1 --format="%aI" -- @
- あるファイルの最新のcommit日時をISO 8601のフォーマットで表示
- ISO 8601形式なら文字列ソートでも日時順になるのでsort -rする
という感じ。xargs便利。