2009年2月2日月曜日

.DS_Storeファイルなどを再帰的に削除するコマンド

ターミナルとFinderの両方を使って作業をしていると、不要な「.DS_Store」に悩まされる事があります。

.DS_Storeを削除するアプリケーションは色々あるのですが、ターミナル上からコマンド一発で削除したい時もありますよね!?

という訳で、少しググってみると、カレントディレクトリ以下の不要なファイルを、まとめて削除してくれるコマンドを公開している方がいました。


削除するコマンドは...
find . -name ".DS_Store" -print -exec rm -r {} ";" ; find . -name ._* -exec rm -r {} ";"
です。コレを実行すると、カレントディレクトリ以下の.DS_Storeファイル等が再帰的に削除されます。ちなみに、どの.DS_Storeファイルが削除されたのかも表示されます。

実行する時は注意が必要ですが、覚えておくと便利なコマンドだと思います。


参考:
All About [Mac OS Xの使い方]メモリカードのメンテナンス
少し古い情報ですが、詳しい解説があります。

3 件のコメント:

Okawari さんのコメント...

いつも楽しく見させてもらっています。

-name オプションでの正規表現での"*" は "¥" でエスケープするのが正しいのではないかと思います。

% find . -name ._¥* -exec rm -r {} ";"

上記であると "._*" でも結果は同じかもしれませんが...

manual にもそんなことが書いてあるような...
外していたらすみません。

erpalacion さんのコメント...

Okawariさん、コメントありがとうございます。

「man find」をして、「-name」の項目を調べると次のような記述があります。

Special shell pattern matching characters (``['', ``]'', ``*'', and ``?'') may be used as part of pattern. These characters may be matched explicitly by escaping them with a backslash (``\'').

ココでは「*」を文字としてではなく、ワイドカードとして使いたいので、バックスラッシュは必要ないと思うのですが、この認識は間違っていますか?もし何か良い情報源などがあれば、是非教えて下さい。

ちなみに、後半部分の「._」を接頭辞に持つファイルに関してですが、コチラに解説があります。最近のMacでは、殆ど利用されないファイルのようです。なので、実際に実行する時は、後半部分を省略しても良いかもしれませんね!

匿名 さんのコメント...

バックスラッシュは通常あったほうがよいと思います。 ._* という部分がシェル (Bash) により解釈される余地を残しておくことになってしまいますので。

空のディレクトリの中で、 "._test0" というファイルと "dir0/._test1" というファイルを作った上で find . -name ._* してみればわかりやすいかと思います。Bash により "._*" という記述が ._test0 に置き換えられた上で find に引数がわたされますので、 ._test1 ファイルが発見できないことになります。