Entries

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 的な解かと思います。といっても、まわりの人が全然知らないので
仕事ではあえて使わないけど。
このエントリーをブックマークに追加 ブックマークに追加する
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://68user.blog27.fc2.com/tb.php/39-7814ba22

3件のトラックバック

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

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

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

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

[T13] UNIXサーバー

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

3件のコメント

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

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

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

[C60]

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

[C61] GNU findutils

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

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

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

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

Author:68user
http://X68000.q-e-d.net/~68user/

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Powered By FC2ブログ

Powered By FC2ブログ
ブログやるならFC2ブログ