アカウント名:
パスワード:
【謎】本当にあったfindコマンドの怖い話【おもしろ現象】http://www.kunst1080.net/entry/2018/03/20/120146 [kunst1080.net]
要約100万個のファイルに対して、find コマンドから始めて mv コマンドでファイル名を変更するワンライナーを実行すると、 mv コマンドが約158万回実行されました。
ワンライナーでやろうとしてハマった?
findを実行した時点でのファイルだけをmvしたかったのに、mvされたあとのファイルもfindに引っかかってしまった。って、よくあるお話。
当然やんとしか思わない。
なるほど、そういうもんなんすね。findはファイルのオーナー変更か古いファイルを削除するときに使うくらいでmvってやったことなかったです。どっちもワンライナーにもこだわらないので、一旦リストファイルを生成してそれで次の処理をすることも多い。#賢いワンライナーを書ける技量が無い・・・だけか
私は一番使うのはfind - grepですね。
#makefileには find . -type f -name '*~' -print0 | xargs -0 rm -fはかかれてて、よく使うけど。
;で区切って1lineでやるもよし。(shellのヒストリのため)
私も一番よく使うのはgrepですが、% find . なんやかんか -print | xargs grep 条件1 | less↓% find . なんやかんか -print | xargs grep -l 条件1 | xargs grep 条件2 | less…と、どんどん絞り込むことが多いです。-0をつけなくても大丈夫な状況限定。
あと、ファイルそのものに何か手を入れる場合は、そのままxargsで繋がずに、
% foreach f ( `find . なんやかんか -print | xargs grep -l 条件1 | xargs grep -l 条件2` )> perl -i.bak -pe ワンライナー $f> end
って感じで、対象ファイル一覧を確定させてからコマンド実行してますね。今となってはなぜそうすることにしたのかぜんぜん覚えてないんですが、たぶん今回のネタのような何か痛い目にあったことがあったんだと思う。
そういえば、まんまfor f in $(find . なんたら -print) ; do mv $f $f.back ; doneって何度もやったことある。
#bash派です。
ログインシェルはtcsh派なんですが、tcshのforeachは中身がヒストリに残らないので、たまに% sh -c 'for f in $(find . なんたら -print) ; do mv $f $f.back ; done'とかやったりします。
#そこまでするぐらなら、とっととbashに乗り換えろよ、と自分でも思うのですが、20年以上使い込んだ.tcshrcが捨てられない…
> ログインシェルはtcsh派なんですが、tcshのforeachは中身がヒストリに残らないので
ですね。私もほぼ同じ理由でbashにうつりました。だいたい、historyとreadlineのためにcshからtcshにしたんだから、historyに残らないとかtsch意味ないやんって。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
最初のバージョンは常に打ち捨てられる。
これか? (スコア:1)
【謎】本当にあったfindコマンドの怖い話【おもしろ現象】
http://www.kunst1080.net/entry/2018/03/20/120146 [kunst1080.net]
要約
100万個のファイルに対して、find コマンドから始めて mv コマンドでファイル名を変更するワンライナーを実行すると、 mv コマンドが約158万回実行されました。
ワンライナーでやろうとしてハマった?
Re: (スコア:2)
findを実行した時点でのファイルだけをmvしたかったのに、mvされたあとのファイルもfindに引っかかってしまった。
って、よくあるお話。
当然やんとしか思わない。
Re: (スコア:1)
なるほど、そういうもんなんすね。
findはファイルのオーナー変更か古いファイルを削除するときに使うくらいでmvってやったことなかったです。
どっちも
ワンライナーにもこだわらないので、一旦リストファイルを生成してそれで次の処理をすることも多い。
#賢いワンライナーを書ける技量が無い・・・だけか
Re: (スコア:2)
私は一番使うのはfind - grepですね。
#makefileには find . -type f -name '*~' -print0 | xargs -0 rm -fはかかれてて、よく使うけど。
;で区切って1lineでやるもよし。(shellのヒストリのため)
Re: (スコア:1)
私も一番よく使うのはgrepですが、
% find . なんやかんか -print | xargs grep 条件1 | less
↓
% find . なんやかんか -print | xargs grep -l 条件1 | xargs grep 条件2 | less
…
と、どんどん絞り込むことが多いです。-0をつけなくても大丈夫な状況限定。
あと、ファイルそのものに何か手を入れる場合は、そのままxargsで繋がずに、
% foreach f ( `find . なんやかんか -print | xargs grep -l 条件1 | xargs grep -l 条件2` )
> perl -i.bak -pe ワンライナー $f
> end
って感じで、対象ファイル一覧を確定させてからコマンド実行してますね。
今となってはなぜそうすることにしたのかぜんぜん覚えてないんですが、たぶん今回のネタのような何か痛い目にあったことがあったんだと思う。
Re: (スコア:2)
そういえば、まんまfor f in $(find . なんたら -print) ; do mv $f $f.back ; doneって何度もやったことある。
#bash派です。
Re:これか? (スコア:1)
ログインシェルはtcsh派なんですが、tcshのforeachは中身がヒストリに残らないので、たまに
% sh -c 'for f in $(find . なんたら -print) ; do mv $f $f.back ; done'
とかやったりします。
#そこまでするぐらなら、とっととbashに乗り換えろよ、と自分でも思うのですが、20年以上使い込んだ.tcshrcが捨てられない…
Re:これか? (スコア:2)
> ログインシェルはtcsh派なんですが、tcshのforeachは中身がヒストリに残らないので
ですね。私もほぼ同じ理由でbashにうつりました。
だいたい、historyとreadlineのためにcshからtcshにしたんだから、historyに残らないとかtsch意味ないやんって。