「ウノウラボ 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
、かつては有用だったがxargs
やperl
がある昨今ではあまり使わない。
% find . -type f -name '*~' | xargs rm
か、
% find . -type f -name '*~' | perl -nle unlink
がいいだろう。-type f
をつけることで、ファイルのみを検索対象にしている。
これらのうち、一番のお薦めは後者。-exec
もxargs
も、rm
を何度も実行するが、perl
にパイプする例では、find
とperl
しか実行されないので高速かつ負荷が低い。
実はベストなのは
% find . -type f -name '*~' -delete
だったりするが、-delete
はfind
によってはサポートしていなかったりするので(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:
$ echo -n $'\1' | od -t x1
0000000 01
0000001
$ echo -n $'\0' | od -t x1
0000000
てことは、-d '' でイーンジャネーノ?