rmしたやつをsvn rmする

Subversion管理下にあるファイルを削除したい場合は、普通のrmではなくsvn rmする必要がある。

でも、たまにうっかり、rmで大量に消してしまうことがある。そうすると、同じファイルを1つ1つsvn rmする必要がある。しかも、ファイルが存在しないから自動補完が効かない。

というわけで、sedを組み合わせて自動で消してみた。

svn status |  \ 
   sed -n '/^!/s/^! *\(.*\)/"\1"/p' | \
      xargs svn rm

で、残りはこれが何をやっているか解説しよう。未来の自分のためのメモ。
これを応用すれば、ファイルをまとめてsvn addするとかできるはず。

svn status

まず、svn statusは失われたファイルの先頭に"!"を付けて表示する。

で、失われたファイルがrmで消されたファイルに当たる。

$ ls
foo.c bar.c
$ svn status
$ rm foo.c
$ echo "// comment" > baz.c
$ ls
bar.c bar.c
$ svn status
!   foo.c
?   baz.c

sed

というわけでまず"!"で始まる行だけseをとりだす、sedスクリプトを書いてみる。

  • sedは何もしないと、入力をそのまま出力するので、それを禁止する。(-n)
  • 正規表現で/^!/にマッチする行(!で始まる行)を出力する。(/^!/p)
$ svn status
!   foo.c
?   baz.c
$ svn status | sed -n "/^!/p"
!   foo.c

次に、"! "を取り除いてやる必要がある。これは、"! foo.c"を"foo.c"で置き換えれば良い。

  • 文字列置き換えはs/old/new/
  • 正規表現の後ろに置く事で、対象となる行を限定できる
  • \(\)でグルーピングした正規表現は、あとで\n(nは数字)で参照できる
$ svn status | sed -n '/^!/s/^! *\(.*\)/\1/p'
foo.c

ついでにファイル名に空白が含まれていると行けないから、ダブルクオート(")でくくっておく。

$ svn status | sed -n '/^!/s/^! *\(.*\)/"\1"/p'
"foo.c"

xargs

最後は、標準入力で入力される文字列を、コマンドライン引数にいれてやればいい。

で、これをズバリやってくれるのが、xargs。

# svn rm "foo.c"と同じ
$ svn status | sed -n '/^!/s/^! *\(.*\)/"\1"/p' | xargs svn rm
D foo.c

# これを発展させて、Unixのパイプのすばらしさについて語れるかしら
# あと、レポートが進まねぇ