ターミナルからSVNリポジトリ配下にある特定の拡張子のファイルだけ削除する


エンジニアならSVNリポジトリ配下にある、特定の拡張子のファイルを一度に削除したくなることがあると思います。あるんです。
そういう時にFinderやNemoとか、その辺のファイルマネージャからちまちま消していくのは大変つらいです。なのでターミナルからサッと消しましょう、というメモです。

コマンド

コマンドは大体、以下のようになるかと思います。試した環境がMac OS 10.6なのでコマンドはGNUのものでなくBSDのものです。とはいえ、Ubuntuなどでも大して変わらないかと。

Terminal
$ find (SVNリポジトリのパス) -type d -name '.svn' -prune -or -type f -iname '*.txt' -print0 | xargs -0 rm -f --

詳しい説明

SVNリポジトリにあるファイルを削除するのですが、探索する際に.svnディレクトリが邪魔になります。これを無視するには以下のようにオプションを指定します。

-type d -name '.svn' -prune

-type dでディレクトリのみを、-name '.svn'でディレクトリ名を指定しています。
ディレクトリに対して-pruneを付けると、そのディレクトリの配下を探索しないようになるので、これで.svn以下のファイルは検索しないことになります。


.svnディレクトリを除外しつつ、ファイルを検索するために-orを指定します。

-or

特定の拡張子のファイルを検索するために、以下のように指定します。

-type f -iname '*.txt'

-type fでファイルのみを、-iname '*.txt'で拡張子が.txtのファイルを検索します。
ファイル名の指定では-nameでなく-inameを指定しているので、大文字小文字を区別しません。
なので.TXTであっても対象になります。


-print0 | xargs -0

-print0で、ヌル文字を区切り文字として検索結果を出力します。これにより、半角スペースを含んだファイルでも正常に扱えるようになります。
パイプでつないでいるxargsの方にも-0を指定して、ヌル文字を区切り文字として扱うようにしています。


rm -f --

あとは渡された検索結果に対してrm -fを実行しているだけです。--は以降にはオプションは存在しないことを示すものなので、(確か)ファイル名の先頭が-で始まっているファイルでもオプションと認識されて削除に失敗する、といったことがなくなります。


というメモなのでした。
findの直後に-Eを付加(拡張正規表現を使用、ただしBSDの場合)し、-inameでなく-iregex '.*\.(txt|md)$'などとすると複数の拡張子のファイルを同時に削除できて、もっと幸せになるかもしれません。