このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

[参照用 記事]

findとxargsを使った、とあるコマンドライン

MercurialやGitのリポジトリはどんどん増えますが、そのなかにはゴミリポジトリもあります。整理しようと思っても、そもそも全部のリポジトリを把握してない。そこで、次のことを実行することにします。

  • Mercurialのリポジトリを全部探して、そのローカルパスとリモートパスを適当な形式で出力する。

使ったコマンドラインは:


$ find `pwd` -type d -name '.hg' | tee hg-repos.list | \
> xargs -I{} sh -c "echo $'---\nlocal = {}'; cd {}; hg paths" | tee hg-paths.list
  1. findに、「名前が '.hg' であるディレクトリ」をすべて出力させます。`pwd`したのは、フルパスを出力させるためです。(デフォルトでフルパス出力のfindもあるようです。)
  2. findの結果は hg-repos.list に保存してパイプラインを続けます。
  3. findの出力行ごとに、xargsで処理を繰り返します。
  4. -I{} は、{} の部分をfindの出力行(の文字列)と置き換える指示です。
  5. 各行(ディレクトリのフルパス)ごとに実行すべきコマンドは、sh -c "echo $'---\nlocal = {}'; cd {}; hg paths" 。
  6. つまり、シェルのコマンドライン echo $'---\nlocal = {}'; cd {}; hg paths で、{}部分をディレクトリのフルパスに置き換えたものを実行します。
  7. 結果を hg-paths.list に保存して標準出力にも書き出します。

最終出力は次のようになります。ローカルパスは、WindowsファイルシステムのCygwin形式です。

---
local = /cygdrive/c/Users/hiyama/Work/Alloy/.hg
---
local = /cygdrive/c/Users/hiyama/Work/configs/.hg
default = https://[email protected]/m_hiyama/configs
---
local = /cygdrive/c/Users/hiyama/Work/JsDev/yet-uncertain/.hg
default = https://[email protected]/m_hiyama/yet-uncertain
---
local = /cygdrive/c/Users/hiyama/Work/pkgsbin/.hg
default = https://[email protected]/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$//' とエスケープすべきですね。[/さらに追記]