.svnディレクトリだけ列挙2008年09月07日 17時42分06秒

一週間ほど現実逃避をしていたら、もう9月すぎてるし。1ヶ月以上ブログ更新してないし。と思ったのだが、あんまりいいネタがないのでコネタ。

もうね、なんで気が付かないかな。

1ヶ月ほど前のエントリで「コマンドラインで.svnディレクトリを一括削除」なんてコマンドラインネタやったんだけど、このときは

  • dirコマンドのオプションに /b(ファイル名のみ表示)、/s(指定ディレクトリ以降の再帰処理)に加えて隠しディレクトリを対象にするために/aオプションで属性未指定(=すべての属性を対象)として、
  • 結果をfindstrの正規表現で「.svn」だけに絞り込む
という2段階の手続きを踏んでいた。こんな感じ。
dir /b/s/a | findstr /r \.svn$
うん、タイプするのめんどくさいわ。

でね、もう一回dirコマンドのヘルプ見てみると、

  /A          指定された属性のファイルを表示します。
  属性         D  ディレクトリ               R  読み取り専用
               H  隠しファイル                A  アーカイブ
               S  システム ファイル           -  その属性以外
(dir /? より抜粋)
だって。/aオプションでディレクトリのみに絞り込めるじゃん

そんなわけで

さっきのパイプ付き処理を置き換えると、こんな感じ。

dir /b/s/a:dh *.svn
/a:dh で「隠しディレクトリ」のみを対象とする、と。

だもんで、以前のエントリに掲載した.svnの再帰削除コマンド

for /f "tokens=*" %d in ('"dir /b/s/a | findstr /r \.svn$"') do rmdir /q/s "%d"

なんて面倒なコマンドは、(比較的)シンプルに
for /f "tokens=*" %d in ('dir /b/s/a:dh *.svn') do rmdir /q/s "%d"

なんてシンプルに置き換わります。無駄なファイル/ディレクトリの列挙もパイプ処理もないので当然こっちのほうがパフォーマンスいいし。測ってないけど。

あ、ファイル名の指定は通常のDOSワイルドカード指定になるので「.svn」じゃなくて「*.svn」になるとこだけは注意ね。