MercurialやGitのリポジトリはどんどん増えますが、そのなかにはゴミリポジトリもあります。整理しようと思っても、そもそも全部のリポジトリを把握してない。そこで、次のことを実行することにします。
使ったコマンドラインは:
$ find `pwd` -type d -name '.hg' | tee hg-repos.list | \
> xargs -I{} sh -c "echo $'---\nlocal = {}'; cd {}; hg paths" | tee hg-paths.list
- findに、「名前が '.hg' であるディレクトリ」をすべて出力させます。`pwd`したのは、フルパスを出力させるためです。(デフォルトでフルパス出力のfindもあるようです。)
- findの結果は hg-repos.list に保存してパイプラインを続けます。
- findの出力行ごとに、xargsで処理を繰り返します。
- -I{} は、{} の部分をfindの出力行(の文字列)と置き換える指示です。
- 各行(ディレクトリのフルパス)ごとに実行すべきコマンドは、sh -c "echo $'---\nlocal = {}'; cd {}; hg paths" 。
- つまり、シェルのコマンドライン echo $'---\nlocal = {}'; cd {}; hg paths で、{}部分をディレクトリのフルパスに置き換えたものを実行します。
- 結果を hg-paths.list に保存して標準出力にも書き出します。
最終出力は次のようになります。ローカルパスは、WindowsファイルシステムのCygwin形式です。
--- local = /cygdrive/c/Users/hiyama/Work/Alloy/.hg --- local = /cygdrive/c/Users/hiyama/Work/configs/.hg default = https://m_hiyama@bitbucket.org/m_hiyama/configs --- local = /cygdrive/c/Users/hiyama/Work/JsDev/yet-uncertain/.hg default = https://m_hiyama@bitbucket.org/m_hiyama/yet-uncertain --- local = /cygdrive/c/Users/hiyama/Work/pkgsbin/.hg default = https://m_hiyama@bitbucket.org/m_hiyama/pkgsbin --- . . .
[追記]find `pwd` -type d -name '.hg' のままじゃなくて、find `pwd` -type d -name '.hg' | sed -e 's/.hg$//' としてお尻の.hgを取り外しておいたほうが良かったかも。[/追記]
[さらに追記]追記の sed -e 's/.hg$//' のところ、この場合は結果的にうまくいってしまいますが、ドットを「文字のドット」として扱うなら、sed -e 's/\.hg$//' とエスケープすべきですね。[/さらに追記]