fc2ブログ

無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

find には sh!

ウノウラボ Unoh Labs: コマンドラインで作業する上で知っておくといいテクニック
% find . -name '*~' -exec rm {} \;

404 Blog Not Found:勝手に添削 - find(1)
% find . -type f -name '*~' | xargs rm
% find . -type f -name '*~' | perl -nle unlink

わたしなら
% find . -type f -name '*~' | sed 's/^/rm /'
で確認し、OK なら
% find . -type f -name '*~' | sed 's/^/rm /' | sh
で消します。

いまどき fork/exec rm のオーバーヘッドがどれほどのものか。
xargs を使うとき、rm が 1回だけ実行されるときと、ARG_MAX を超えたときに
rm が複数回実行されるときの違いにどれほどの差があると言うのか。
誤差の範囲である。

コンピュータが速くなった今、重視すべきは確実性。
% find . -type f -name '*~' | sed 's/^/rm /'
として、
rm ./hoge~
rm ./dir/fuga~
rm ./foo/bar/baz~

という出力をじっくり眺め、問題がないことを確認する。OK なら、最後に "| sh" をつけて
% find . -type f -name '*~' | sed 's/^/rm /' | sh

とする。

削除してマズいファイルを見つけたら、grep -v で除外すればよい。

find コマンドは、人が使うには難しすぎる。なんだよ {} \; って。
xargs コマンド は、何をするコマンドなのかさえ直感的にわかりづらい。
わざわざ難しいことをする必要はないではないか。

単純なファイル削除ではあまり利点が見えないかもしれないが、便利なのは例えば
% find . -name \*.html | sed "s|\(.*\)|command < \1 > out/\1 | "
などというとき。出力が
command < hoge.html > out/hoge.html
となっていることをじっくり確認して、最後に "| sh" を付けて実行する。

何が起こるかは出力をじっくり観察すればわかる。見よ、この安心感。


…ってちょっと無理があるか? sed の基礎はおさえておかなきゃいけないし、
メタキャラクタ入りのファイルに弱いしなぁ。

sh をつけるやり方を流行らせたいんだが、無理かなー。いやほんと、便利よ。
最初の数行だけ試しに実行したかったら出力をマウスでコピペすればいいし、
コマンドラインだけでがんばるのが厳しかったら、ファイルにリダイレクトして
エディタで中身をいじって
% sh < command.txt
としてもいい。


ちなみに環境により挙動が異なる echo(1) は使わず、printf(1) を使うのが
POSIX 的な解かと思います。といっても、まわりの人が全然知らないので
仕事ではあえて使わないけど。
スポンサーサイト



PageTop

コメント


管理者にだけ表示を許可する
 

ファイル名に空白が含まれている場合も考えて、while と read を使うのはどうでしょうか

ファイル名に空白が含まれているとき、 find の出力をパイプで加工して sh にわたすと、意図しない結果になることが多いです。

何度か痛い目にあったため、わたしは while と read を使って次のようにしています。"$f" とクオートを使ってるのがみそです。
find . -type f | (while read f; do hoge "$f"; done)
コマンド hoge のところを好きなのにかえるかんじです。

とおりすがり | URL | 2007-03-30(Fri)13:36 [編集]


sedよりもxargsの方が直感的に使いやすいけどなぁ。

| URL | 2007-03-30(Fri)23:21 [編集]


GNU findutils

> find . -type f | (while read f; do hoge "$f"; done)

ファイル名にバックスラッシュが含まれている場合に備えて、
read に -r オプションをつけておいても損はない。
もっとおススメは、

find . -type f -print0 | xargs -0 hoge

kk | URL | 2007-03-30(Fri)23:42 [編集]


トラックバック

トラックバック URL
この記事にトラックバックする(FC2ブログユーザー)

あわてるな ディスクはそんなに 速くない

誤差の範囲かどうかは、ファイル数による。無精で短気で傲慢なプログラマ | find には sh!いまどき fork/exec rm のオーバーヘッドがどれほどのものか。xargs を使うとき、rm が 1回だけ実行されるときと、ARG_MAX を超えたときにrm が複数回実行されるときの違いに....

404 Blog Not Found 2007-03-30 (Fri) 04:40


[ブログ的な何か][プログラム] shの使いかた

なんだかんだ言って、sed や awk は使いにくい。あたしのようなタコ linuxer には特に。 find -name ”*.html” -exec sed -e ”s/hoge/HOGE/g” &#62; {} ¥; が動かないのは、ちゃんとした un*x な方々には常識なのだろう。この場合 &#62; が -exec の引数とは認識されな

wiredBeep - gblog 2007-05-24 (Thu) 23:05


UNIXサーバー

国内UNIXサーバー市場は2000年下半期をピークに縮小を続けている。しかし、そ...

IT用語 2007-12-14 (Fri) 17:38