ウノウラボ 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 的な解かと思います。といっても、まわりの人が全然知らないので
仕事ではあえて使わないけど。
- http://68user.blog27.fc2.com/tb.php/39-7814ba22
3件のトラックバック
誤差の範囲かどうかは、ファイル数による。無精で短気で傲慢なプログラマ | find には sh!いまどき fork/exec rm のオーバーヘッドがどれほどのものか。xargs を使うとき、rm が 1回だけ実行されるときと、ARG_MAX を超えたときにrm が複数回実行されるときの違いに....
なんだかんだ言って、sed や awk は使いにくい。あたしのようなタコ linuxer には特に。 find -name ”*.html” -exec sed -e ”s/hoge/HOGE/g” > {} ¥; が動かないのは、ちゃんとした un*x な方々には常識なのだろう。この場合 > が -exec の引数とは認識されな
国内UNIXサーバー市場は2000年下半期をピークに縮小を続けている。しかし、そ...
何度か痛い目にあったため、わたしは while と read を使って次のようにしています。"$f" とクオートを使ってるのがみそです。
find . -type f | (while read f; do hoge "$f"; done)
コマンド hoge のところを好きなのにかえるかんじです。