ウノウラボ Unoh Labs: コマンドラインで作業する上で知っておくといいテクニック」の用法に首を傾げたので。

まずはこちら。

$ find . -type f | fgrep index.html

これは

% find . -type f -name index.html

でOK。パイプ不要。.htmlだけ見つけたい時も

% find . -type f -name \*.html

でOK。findはシェルのワイルドカードを受け付ける。ただしシェルにそれを展開して欲しくないので、\でエスケープしている。要は

$ find . -name '*~'

と同じなのだが、なんで上記の例でfgrepを使っているか不明。

ここからが本番。

$ find . -name '*~' -exec rm {} \;

この-exec、かつては有用だったがxargsperlがある昨今ではあまり使わない。

% find . -type f -name '*~' | xargs rm

か、

% find . -type f -name '*~' | perl -nle unlink

がいいだろう。-type fをつけることで、ファイルのみを検索対象にしている。

これらのうち、一番のお薦めは後者。-execxargsも、rmを何度も実行するが、perlにパイプする例では、findperlしか実行されないので高速かつ負荷が低い。

実はベストなのは

% find . -type f -name '*~' -delete

だったりするが、-deletefindによってはサポートしていなかったりするので(BSDのfindはサポートしている)、perlにパイプする技を覚えておいても損はない。

$ find . -name .svn -type d -exec rm -rf {} \;

これも

% find . -name .svn -type d | perl -MFile::Path -nle "rmtree $_"

でOK。

% find -uid 0

-uidは多分GNUのfindでしかサポートされていない。POSIX標準は

% find . -user root

または

% find . -user 0

ちなみに条件を反転させるには、

% find . \! -user dankogai

とすればいい。

$ find -uid 0 -exec chown jokagi {} \;

これは

% find . -user root | xargs chown jokagi

がいいだろう。perlでも出来ないことはないが、perlのchownはUID指定しかできない上、GIDも指定しなければならないので、互換性を持たせて書こうとすると

% find . -user root | perl -nle 'BEGIN{$u=(getpwnam("jokagi"))[2]};@s=lstat($_);chown $u,$s[5], $_'

とあまりに長くなっていまう。

何はともあれ、find(1)は何かとよく使う割にやたらとオプションがあるコマンドなので、迷ったらすぐにman findするのが肝要なのだけど、用例がないといまいちピンと来ないので、用例集が一つ欲しいところ。そういうわけで「私はfind(1)をこう利用してます。というのがあったら、本entryへのTBないしcommentして欲しい。

理想を言えば、manwikiとかが欲しいかも。

Dan the find(1)er

See Also: