09/12/27 15:16:39
>>744
そか、いったん合計して偏差値出すしかないか
㌧
751:正月前
09/12/29 21:51:50
シェルスクリプトの中で以下のようにperlで重複部分の文字を削除する場合は、最後の文字は消されない理由はなんでしょうか?
perlの中で同じことをすると、最後の文字は消されるのに。
教えて頂ければ、ありがたいです。
--------------------------
hoge='a:b:c:d:a:b:c:d:a'
echo $hoge
echo " "
echo $hoge | perl -F: -ane 'chop;foreach(@F){$s{$_}++ or push(@b,$_)}print join(":",@b)'
echo " "
--------------------------
752:名無しさん@お腹いっぱい。
09/12/29 22:24:22
>>751
echo -n
753:正月前
09/12/29 22:45:31
ありがとうございました!!!
perlの中でchopではだめで、echo -n で改行を消さないといけないんですね!
754:名無しさん@お腹いっぱい。
09/12/30 00:24:04
auto-split後だからchopするとしたら
chop($F[$#F]);
755:名無しさん@お腹いっぱい。
10/01/07 21:10:23
run.shファイルの中で、script_file.shをsourceした場合。
sourceされているscript_fileの中でscript_file自身の絶対パスを得る方法を調べています。
bashの場合はscript_fileの中で$BASH_SOURCEから得られるが、他のシェル(zsh/tcsh/ksh)でscript_file.shのパスを得られる方法を
教えていただけませんか?
>>>>>>>>>>>>>>>>>>>>>>
script_file.shファイルのある場所
/path/to/script_file.sh
>>>>>>>>>>>>>>>>>>>>>>
実行例:
%./run.sh
期待結果:
/path/to/
ファイル <run.sh>の中身
-------------
#!/bin/(sh/zsh/tcsh...)
source $path/script_file.sh
-------------
ファイル script_file:
-------------
script_file_path=`******`
echo $script_file_path;
-------------
756:名無しさん@お腹いっぱい。
10/01/07 21:31:48
>>755
他のシェルのソースを改造して $BASH_SOURCEの機能を実装すれば桶。
757:名無しさん@お腹いっぱい。
10/01/07 21:50:29
>>756
早速のレスありがとうございます。今環境がないので明日試してみます。
758:名無しさん@お腹いっぱい。
10/01/07 22:13:18
こりゃ、わかって無いな。
759:名無しさん@お腹いっぱい。
10/01/08 13:35:29
制限時間を設定して、2つのプロセスを実行して、時間内に1つでもプロセスが終了しなかったら2つともキルして、もう一度最初から実行するにはどのように記述すれば良いのでしょうか?
ご教授ねがいます
760:名無しさん@お腹いっぱい。
10/01/08 14:04:43
どこの馬の骨かわからん奴に教授はしない。
761:名無しさん@お腹いっぱい。
10/01/08 14:41:28
>>759
同条件で、最初から再実行したら、また時間内に
プロセスが終了しないのでループしちゃうのでは?
762:名無しさん@お腹いっぱい。
10/01/08 14:52:01
>>716
ループしてもいいから、まずはやり方を教授しろよ
763:名無しさん@お腹いっぱい。
10/01/08 14:57:34
>>761
ネットとか、I/Oポートとか、外的要因が絡んでるのなら
同条件で、最初から再実行してもループしない。
764:名無しさん@お腹いっぱい。
10/01/08 15:00:24
>>762
だから、誤用だけど言葉として正しい
と言ってるだろバカ
765:名無しさん@お腹いっぱい。
10/01/08 18:36:31
>>764
誤用する奴には教えないと言っているのだ。バカ。
766:名無しさん@お腹いっぱい。
10/01/08 18:43:35
うるせー馬鹿
767:名無しさん@お腹いっぱい。
10/01/08 18:53:46
いい加減ウザイよ。
768:名無しさん@お腹いっぱい。
10/01/08 19:02:39
>>765
仮に誤用してなかったとしても肝心の質問の答を知らないくせに
769:名無しさん@お腹いっぱい。
10/01/08 19:22:50
煽って答えがもらえるのは小学生まで
770:名無しさん@お腹いっぱい。
10/01/08 19:24:23
>>768
惨めだなあ。馬鹿丸出しの言い逃れを↓で完璧にのされたのを忘れてまた出てきやがった。
From: [719] 名無しさん@お腹いっぱい。 <sage>
Date: 2009/12/21(月) 18:25:12
>>716
アホ丸出しの言い訳止めろ。>>695の用法も正しいと言うのがお前の主張(>>705)。
>>696はオレじゃないが、誤用に対して「あげない」とからかっている。
お前は用法を知らずに揚げ足とったつもりで恥を晒したうえに、小学生並みの見苦
しい言い逃れを続けている単なるバカ。お前の負け。
>>705
> 「ご教授ください」=「体系だててきちんと教えてください」(同値)
> >>695 には「ご教授ください」と書いてある、
> イコール
> >>695 は「体系だててきちんと教えてください」と言っている
771:名無しさん@お腹いっぱい。
10/01/08 21:13:41
>>759
#!/bin/sh
program1 &
p1=$!
program2 &
p2=$!
sleep 60
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 = 0 -o $is_p2 = 0 ]
then
kill -9 $p1 $p2
sh $0
fi
772:名無しさん@お腹いっぱい。
10/01/08 21:24:43
1 SIGKILLは安易に使ってはいけない。
2 exec sh $0
773:名無しさん@お腹いっぱい。
10/01/08 21:57:52
シェルをexecし直すのは効率が悪い。while文で書ける。
#!/bin/sh
while :
do
program1 &
p1=$!
program2 &
p2=$!
sleep 60
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 = 0 -o $is_p2 = 0 ]
then
kill -9 $p1 $p2
continue
fi
break
done
774:名無しさん@お腹いっぱい。
10/01/08 22:06:04
SIGTERM と SIGINT のどちらを使うべきか
いまだによくわからないのはオレだけでいい
775:名無しさん@お腹いっぱい。
10/01/08 22:11:32
SIGKILLでおk
776:名無しさん@お腹いっぱい。
10/01/08 22:19:31
>>771 >>773
program1やprogram2が 60秒以内に正常終了した場合には、
sleep 60 せずにスクリプトもすぐ終了したいんですが、、
777:名無しさん@お腹いっぱい。
10/01/08 22:45:57
「ご教授ねがいます」なんていう奴は、これだよ
778:名無しさん@お腹いっぱい。
10/01/08 22:56:17
ご教授ねがえります
779:名無しさん@お腹いっぱい。
10/01/08 23:06:34
ご教授ねがえったか
780:名無しさん@お腹いっぱい。
10/01/08 23:47:21
謀反でござる!
謀反でござる!
781:名無しさん@お腹いっぱい。
10/01/09 05:41:48
女教授おながいします
782:名無しさん@お腹いっぱい。
10/01/09 07:47:50
質問 >>759 >>776 について、
「ご教授」の突っ込みと誤答ばかりで、
==== ここまで正解ゼロ ====
783:名無しさん@お腹いっぱい。
10/01/09 11:58:33
釣り板の釣りスレでマジ回答したら負け
784:771
10/01/09 14:46:50
>>776
sleep 60の代わりに、それらのプロセスが終了したか
チェックすればいい
t=0
while t=`expr $t + 1`; [ $t -lt 60 ]
do
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 != 0 -a $is_p2 != 0 ]
then
break
fi
sleep 1
done
785:名無しさん@お腹いっぱい。
10/01/09 15:03:34
お題を良く読みましょう。「制限時間」
オレはご教授しないけどな。
786:名無しさん@お腹いっぱい。
10/01/09 15:06:52
>>784
それ、1秒間隔でポーリングしてるだけなので、
やっぱり最大1秒遅れるので、ダメです。
787:名無しさん@お腹いっぱい。
10/01/09 19:46:58
#!/bin/sh
T1=`date "+%s"`
T2=0
T3=0
STS=1
while t=`expr $T3 - $T1`; [ $t -lt 最大制限時間 ]
do
program1 &
p1=$!
program2 &
p2=$!
T2=`date "+%s"`
T3=0
while t=`expr $T3 - $T2`; [ $t -lt 制限時間 ]
do
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 != 0 -a $is_p2 != 0 ]; then
STS=0
break 2
fi
T3=`date "+%s"`
done
kill -9 $p1 $p2
done
exit $STS
もっとスマートに書けると思う ご教授しる
788:名無しさん@お腹いっぱい。
10/01/09 19:47:22
いやです
789:名無しさん@お腹いっぱい。
10/01/09 20:33:37
>>787
それ、ビージーループになってて重いのでNGです
790:名無しさん@お腹いっぱい。
10/01/09 22:00:20
waitすればいいやん
sleep 60 &して、これも含めた三つのpidをwait。
コードは書かないでおくが。
791:名無しさん@お腹いっぱい。
10/01/09 22:03:13
>>790
複数のプロセスをwaitすると、全部が終了するまで返って来ないという仕様なのでNG
792:名無しさん@お腹いっぱい。
10/01/09 22:34:21
ソケット通信でprogram1,2の終了を
管理プロセスに通知する仕組みにすれば
何とかなるかもしれないが、
シェルだけでは無理だね
793:名無しさん@お腹いっぱい。
10/01/09 22:38:41
んなぁこたー無いが、ご教授はしない。
794:名無しさん@お腹いっぱい。
10/01/11 01:17:26
下の input.txt から output.txt を作るにはどうすればよいでしょうか?
input.txt は1列のデータで、output.txt は、
input.txt の1列目から1行目を削除して2列目に並べたものです
perl か何かに全部読み込んで・・・という方法しか思いつかないのですが
ワンライナーでさくっとやる方法あったら教えてください
### input.txt
1
2
3
5
6
### output.txt
1 2
2 3
3 5
5 6
795:名無しさん@お腹いっぱい。
10/01/11 01:25:06
(read a; while read b; do echo $a $b; a=$b; done) <input.txt >output.txt
796:名無しさん@お腹いっぱい。
10/01/11 01:53:40
>>795
ありがとうございます
目から鱗です
797:名無しさん@お腹いっぱい。
10/01/11 12:54:30
>>794
横方向に連結する場合、 paste を使うのが基本
paste - - < input.txt
798:名無しさん@お腹いっぱい。
10/01/11 12:59:32
あ、よく読んでなかった。こうか
# tail -n +2 input.txt | paste input.txt - > output.txt
799:名無しさん@お腹いっぱい。
10/01/11 13:27:17
>>798
なぜ #プロンプト…
800:名無しさん@お腹いっぱい。
10/01/11 13:49:45
あ、いや、特に考え無しに・・。 $ が一般ユーザで、# が root だっけ
801:759
10/01/11 14:32:31
放置してしまってすみません。
みなさんありがとうございます。
>>776さんは自分ではありません、まったくレスしていないので逆に失礼ですが。
802:名無しさん@お腹いっぱい。
10/01/11 19:14:45
>>800
古くはさらに、$と%をそれぞれBourne ShellとC Shellの一般ユーザー
プロンプトとしたものだけれど、いまはそこまで厳密に使う人はいない
かもなー。
zshは基本的には$系のはずなのにデフォルトが%なのはちょっと不思議。
803:名無しさん@お腹いっぱい。
10/01/11 23:07:53
以下の処理のリダイレクトについて教えていただけますでしょうか?
もしくは、よくある処理のようなので解説しているサイトを教えていただけますでしょうか?
commandの結果を取得しつつ、画面及びファイルに出力
status=`exec 3>&1; { command 2>&1 3>&-; echo $? 1>&3; } | tee command.log 1>&2 3>&-`
echo $status
①execにより3で1を指した後にcommand実行時に3を閉じてるのは何故でしょうか?
必要性がよくわからないです。
同時に1が閉じられることはないですよね?
②どういう経路でcommandの結果はstatusに格納されているのでしょうか?
③tee実行時に行っているリダイレクトの意味はどのようなものでしょうか?
正直言って全体的によく分からないです。
804:名無しさん@お腹いっぱい。
10/01/11 23:22:23
>>803
機種依存文字は書き換えました
(1)commandが3に出力しないように念のため
(2) echo $? が 3に出る。3には、あらかじめexec 3>&1 によって、
パイプではなく、コマンド置換(バッククォート)に通じる標準出力が
複製されている。よって、echoが 3に出せば 変数statusに入る。
(3)teeがcommandの出力をcommand.logに書くと同時に
同じものを 1に出そうとするが、1にそのまま出すと変数statusに入ってしまうので
2にリダイレクトして画面に表示されるようにしている。
3>&-は(1)と同じく念のため。
以上、ご教授しましたw
805:名無しさん@お腹いっぱい。
10/01/11 23:49:50
>>804
ありがとうございました。
command時に3を閉じてるので、echo時に1>&3としても出力されないと勘違いしておりました。
それと(3)について、command時に2>&1としていますが、
これはtee時の2には引き継がれないのでしょうか?
引き継がれていると、1>&2とすると元に戻って1に出力して
statusに上書きしてしまうように見えます。
806:名無しさん@お腹いっぱい。
10/01/12 06:29:53
>>805
commandとechoは無関係。
exec 3>&1したものが、commandとechoに並列して引き継がれる。
command側では3は不要なので閉じてるだけ。
commandの2とteeの2は無関係。
commandの1はパイプにつながっているので、
commandの2もパイプに流すためにcommand 2>&1 してるだけ。
teeはそのパイプを0で受けとる。
teeの1や2はcommandとは無関係で、デフォルトのまま。
そこで tee 1>&2 で画面に出す。
以上、俺もご教授しましたw
807:名無しさん@お腹いっぱい。
10/01/12 09:40:26
>>806
ありがとうございました。
全て理解できました。
808:名無しさん@お腹いっぱい。
10/01/12 18:20:04
つまり要約すると「ご教授」で正しかったのですね。
全て理解できました。
809:名無しさん@お腹いっぱい。
10/01/12 18:37:12
つまり要約すると「ご教授」で正しかったのですね。
全て理解できました。
810:名無しさん@お腹いっぱい。
10/01/12 19:15:58
大事なことなので二度言いましたよ
811:名無しさん@お腹いっぱい。
10/01/12 19:41:07
>>803ではありませんが・・・
パイプがあっても1 2ともにデフォルト
(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る)
ただし新しいfdが作られていると、その先も残ったまま。
(パイプの左側で3が作られていると、右側でも3が作られている状態)
パイプの左側では標準出力がパイプに渡される
パイプの右側ではパイプから標準入力を受け取る
コマンド置換は、最初のパイプの前までの標準出力を受け取る
これで理解できてますか?
812:名無しさん@お腹いっぱい。
10/01/12 20:32:25
>>811
違うね。
>(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る)
↑
「右側ではデフォルトに戻る」のではなく、
そもそも最初からデフォルトのまま変化しない。
>ただし新しいfdが作られていると、その先も残ったまま。
↑
パイプの左側で新しいfdが作られても、その先には無関係(残らない)。
>>803 では、あらかじめ execでfdを作っているから、
それを全体が受け継いでいるだけ。これと混同してはいけない。
>コマンド置換は、最初のパイプの前までの標準出力を受け取る
↑
「最初のパイプの前」じゃなく、パイプラインの最後のコマンドの標準出力を受け取る
で、お約束の「ご教授しました」
813:名無しさん@お腹いっぱい。
10/01/12 21:37:11
誤教授しましたと言うべき。
814:名無しさん@お腹いっぱい。
10/01/12 22:00:01
>>812 thx
おおよそ理解しましたが、
2個目と3個目のレスが気になります。
> パイプの左側で新しいfdが作られても
新しいfdを作るにはexecしかないと思っていたのですが、これ以外で作れるのですか? ・・①
それとも、シェルから呼び出されたコマンドの中で作られたfdでは
> 無関係(残らない)
だけど、execで作っているときは受け継ぐという意味ですか?・・・・・・・・・・・・・・・・・・・・・・・・・②
それと
> それを全体が受け継いでいるだけ。
というのはそのシェル内で n>&- するまで有効という意味でよいですか?・・・・・・・・・・・・・・③
更にサブシェルにも受け継がれますか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・④
3個目の方は
> パイプラインの最後のコマンドの標準出力
とありますが、これはteeの標準出力ではないのですか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑤
(でも1>&2しているので、どうなるんだろう。teeは標準出力がなくなるので、3に書き込んだechoということなのかしら)
質問ばかりですみません。
815:名無しさん@お腹いっぱい。
10/01/12 22:02:31
④更にサブシェルにも受け継がれますか?
forkするプログラム書いたことあるのを思い出しました。
たしか親からfd受け継いだはずなので、これは受け継がれますよね。
816:名無しさん@お腹いっぱい。
10/01/12 22:23:58
>>814
だから、機種依存文字を使うなと、、
(1)exec以外でも勝手に新しいfdを使えるよ。
ただ、そのコマンド1つだけに有効になる。
(ここでいうコマンドには、サブシェルなどのコマンド群全体も含む)
(2)execでは、シェル自体のfdが変わるので、以降のコマンドすべてに影響。
(ただし、サブシェル内でexecした時はそのサブシェル内のみ)
(3)いいよ。あと、n>&-だけじゃなく、n>&mで別の値を複製しなおすと
execの影響は無関係になる。
(4)サブシェルにも受け継がれる
(5)teeの標準出力だよ。で、標準出力に出ないように 1>&2してる。
3に書き込んだechoもパイプライン全体の標準出力だからコマンド置換に取り込まれる。
teeで1>&2するのと、echoとは無関係。
817:名無しさん@お腹いっぱい。
10/01/13 18:38:41
丁寧なご説明ありがとうございます!
818:名無しさん@お腹いっぱい。
10/01/13 23:59:12
しかしほんとに「機種」依存文字なのか?
乗っかってるソフトウェア依存文字じゃないのか?
とりあえず俺は読めるし、歴史的に俺の使っている機種が
④を表示できるはずは無いのだけれど、表示出来ているわけよ。
(どのようにタイプしたらその字が出せるか解らんが、とりあえずコピペは出来る)
FreeBSD で LANG eucJP なのだが、2ちゃんねるビューワだと④が読めるし
コピペで転記できるよ。(書き方は不明)
ほんとに機種に依存するの?
819:名無しさん@お腹いっぱい。
10/01/14 00:04:36
ググレカス
820:名無しさん@お腹いっぱい。
10/01/14 00:38:24
丸数字やローマ数字を機種依存文字と呼ぶのは
おかんが家庭用ゲーム機ならPS3も360もファミコンと呼ぶのと同じで
言葉にこだわる必要はありません
821:名無しさん@お腹いっぱい。
10/01/14 00:52:50
丸数字が機種依存とか言われたのは歴史的経緯だわな
今や機種依存どころかUnicodeというれっきとした国際標準に含まれてる
2chで今更丸数字使うなっても化石じみてて何だかな
822:名無しさん@お腹いっぱい。
10/01/14 00:55:09
2chが化石Shift_JIS使ってるかぎり言われつづける
823:名無しさん@お腹いっぱい。
10/01/14 03:41:02
2chはcp932だろ
824:名無しさん@お腹いっぱい。
10/01/14 04:14:23
時代は UTF-8 ですよ
825:名無しさん@お腹いっぱい。
10/01/14 04:16:28
いまどきの機種依存文字といえば「~」かな
826:名無しさん@お腹いっぱい。
10/01/14 08:28:32
>>825
誰もがWindows-31JとShift_JISの区別を付けるようになれば
片が付くのにね……
827:名無しさん@お腹いっぱい。
10/01/14 09:05:59
うちのMacちゃんでは2chのカキコのローマ数字が化けるざんす。
828:名無しさん@お腹いっぱい。
10/01/14 09:44:45
この板の住人ならOSは関係ないってことくらい分かるだろ
MacJapaneseの代わりにWindows-31Jで処理するようなライブラリ使って
FirefoxでもChromiumでも何でもビルドすればいいだけ
829:名無しさん@お腹いっぱい。
10/01/14 21:53:24
半角カナは使ってもいいと思う
830:名無しさん@お腹いっぱい。
10/01/14 23:02:10
>>828
じゃあsafariをビルドする方法を教えてください。
831:名無しさん@お腹いっぱい。
10/01/14 23:41:43
フィルタリングプロキシを立てて
Windows_31JくさいShift_JISなページをUTF-8に変換してやるのが楽じゃないかな
832:名無しさん@お腹いっぱい。
10/01/15 00:12:46
それはクライアント側でフォントいじれよっていうのと等価では?
833:名無しさん@お腹いっぱい。
10/01/15 00:29:34
丸数字使うな。カス。と言う方が楽だしecoだな。
834:名無しさん@お腹いっぱい。
10/01/15 01:08:33
エコロジストならスレ違いネタでスレを消費しないでくれ
835:名無しさん@お腹いっぱい。
10/01/16 01:23:40
bashでif~とする時、[ と [[ ができますが
[ は 外部のtestコマンドで、[[が内部コマンドなんですよね?
[ ではなく [[ を使った方が
速度が速いのでしょうか?
836:名無しさん@お腹いっぱい。
10/01/16 01:50:26
bash の [ と test は builtin。[[ は compound command。
[[、[、外部コマンドの test の順に速い。
外部コマンドを呼んだ場合がダントツで遅くて、他の50倍ぐらい遅い。[[ と [ は大して変わらん。
837:835
10/01/16 02:16:10
お答えありがとう。
838:名無しさん@お腹いっぱい。
10/01/16 12:01:06
>>834
富豪プログラマのスレです。
839:名無しさん@お腹いっぱい。
10/01/26 12:21:42
●やりたいこと
カレントディレクトリ以下の全ファイル(レギュラーファイル,かなり大量,何百万単位)を
検索し,ファイル名,ファイルサイズ,MD5ハッシュ値を出力したい。
1ファイルにつき1行。
※効率よくやりたいのでファイルの数ごとにstatやmd5プロセスを起動する,という
ことは避けたい。
●やったこと
ファイルサイズだけ,とかMD5だけなら下記の方法で満足な早さで出力が得られます。
環境はMac OS Xです。
find . -type f | xargs stat -f '%N,%z' > outputfile.txt
find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
上の二つを合わせたようなことをしたいのですが,うまい方法を教えて下さい。
840:名無しさん@お腹いっぱい。
10/01/26 12:24:01
補足
各行が
ファイル名,ファイルサイズ,MD5ハッシュ値
という出力にしたいです。
841:名無しさん@お腹いっぱい。
10/01/26 12:27:06
コピペミスです。>>839の2つ目のfindは正しくは
find . -type f | xargs md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
でした。
842:名無しさん@お腹いっぱい。
10/01/26 12:49:51
perlかpythonかrubyで書きなよ。
843:名無しさん@お腹いっぱい。
10/01/26 12:52:31
●解答
joinすればいいだけ。
●補足
箇条書での質問は失礼
844:名無しさん@お腹いっぱい。
10/01/26 13:01:19
●傍観者の感想
ワロタ
845:名無しさん@お腹いっぱい。
10/01/26 13:31:04
pasteというコマンドがあってだな。
846:名無しさん@お腹いっぱい。
10/01/26 14:55:29
sed が起動するのは気にならないのかw
847:名無しさん@お腹いっぱい。
10/01/26 15:05:51
>>846
そりゃ、sedは1回しか起動しないし
848:名無しさん@お腹いっぱい。
10/01/26 16:46:34
次スレのテンプレに↓入れとけよ
●解答
perlかpythonかrubyで書きなよ。
849:名無しさん@お腹いっぱい。
10/01/26 16:50:45
>>848
>>1
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
Pythonも入れればよいわけだな。
850:名無しさん@お腹いっぱい。
10/01/26 16:52:39
で、今回の質問の場合 perlもpythonもruby関係なくて、
joinかpasteで済む問題だったわけだが、、
851:名無しさん@お腹いっぱい。
10/01/26 17:03:54
join, pasteは中間ファイルを作るわけだが、数百万ファイルになるとかなりのオーバーヘッドになる。
実行時間はファイルIOが支配的なのでインタプリタが消費するCPUは隠される。
従ってLLでの実装を勧めたわけだが、初心者にはわからないらしい。覚えておく事だ。
852:名無しさん@お腹いっぱい。
10/01/26 17:35:37
>>851
中間ファイルを作らずにnamed pipeでやる方法を知らない初心者らしい、、
853:名無しさん@お腹いっぱい。
10/01/26 18:31:25
この件では I/O にかかる時間でいちばん支配的なのは
find, md5, stat,(+ join を使う場合は sort)であって、
中間ファイルを使うことによるオーバーヘッドなんぞ誤差にしかならんよ。
854:名無しさん@お腹いっぱい。
10/01/26 18:34:04
中間ファイルって、MS-DOSじゃないんだから・・・
855:名無しさん@お腹いっぱい。
10/01/26 18:40:42
find × 2 → named pipe → paste
で、中間ファイルなしでメデタシメデタシ
856:名無しさん@お腹いっぱい。
10/01/26 19:28:25
一部のシェルの
diff <(command) <(command2)
みたいなのは中間ファイル作るのかしらん?
857:名無しさん@お腹いっぱい。
10/01/26 19:30:24
>>856
だから、それが named pipeなんだよw
858:名無しさん@お腹いっぱい。
10/01/26 19:31:07
mknod で作らなくてもいいのかー
859:名無しさん@お腹いっぱい。
10/01/26 22:34:39
findは全てのファイルにstatかけるのを知らない初心者? w
860:名無しさん@お腹いっぱい。
10/01/26 22:37:15
っつーか >>839 と >>842 をそれぞれ時間計測して比べりゃすむ話だろ
漏れは後者の勝ちだと思う
861:名無しさん@お腹いっぱい。
10/01/26 22:38:26
>>854-855
パイプのIOは発生するだろ。バカ。
862:名無しさん@お腹いっぱい。
10/01/26 22:38:31
漏れww
863:名無しさん@お腹いっぱい。
10/01/27 00:35:27
2ch初心者発見。
漏れ、とかで煽られても、、、
半年ROMってれば。
864:名無しさん@お腹いっぱい。
10/01/27 00:52:28
2ch上級者(;´Д`)
865:名無しさん@お腹いっぱい。
10/01/27 01:11:09
今時漏れなんて使わねぇよw
866:名無しさん@お腹いっぱい。
10/01/27 06:54:47
>>839 自身、find×2 を個別に実行した状態で
「満足な早さで出力が得られます」
と言っているのだから、それがすべて。
問題はそこじゃなくて、2つの出力を効率良くまとめる方法が質問点。
で、そのベストアンサーはpaste。
867:名無しさん@お腹いっぱい。
10/01/27 11:51:49
自演乙
868:名無しさん@お腹いっぱい。
10/01/27 12:54:46
>>866
負け犬の何とか…
869:名無しさん@お腹いっぱい。
10/01/27 13:17:04
>>859
ここではstatは問題にならないんだよ、初心者クン
>>860
>後者の勝ちだと思う
「思う」だけじゃ間違ったことでも言えてしまうねw
>>861
パイプのI/Oでは物理I/Oは発生しないんだよ、初心者クン
870:名無しさん@お腹いっぱい。
10/01/27 13:26:19
>>869
前言撤回? w
871:名無しさん@お腹いっぱい。
10/01/27 13:28:37
>>870
良く良め。869 は 「named pipe+paste の方が速い」という主張を一貫してしてるぞ
872:名無しさん@お腹いっぱい。
10/01/27 13:40:18
(1)シェルスクリプトでの多少高度な質問がなされる
↓
(2)「それはPerlかPythonかRuby使った方が速い」と誰かが投稿
↓
(3)別の人からシェルスクリプトでのマトモな回答が投稿される
↓
(4)質問者、傍観者とも納得
↓
(5) (2)が発狂 ← 今ココ
873:名無しさん@お腹いっぱい。
10/01/27 13:50:58
>>871 アルツハイマー?
>>853
> find, md5, stat,(+ join を使う場合は sort)であって、
874:名無しさん@お腹いっぱい。
10/01/27 13:53:01
>>869 は >>853 じゃないよ。
875:名無しさん@お腹いっぱい。
10/01/27 13:57:01
>>853 が言ってる statは、xargsから起動されるstatコマンドのことであって、
find内部のstatのことじゃないだろ。
876:名無しさん@お腹いっぱい。
10/01/27 14:22:00
LL:
ディレクトリ読み込み 1回
stat(i-node読み込み) ファイル個数
MD5 ファイル個数
出力
paste:
ディレクトリ読み込み 2回
stat(i-node読み込み) ファイル個数×3
MD5 ファイル個数
中間ファイル(パイプ)書き出し/読み込み
出力
ファイル数が多くてiノードのキャッシュは期待できない。
MD5はCでの実装もあるから、インタープリターのオーバー
ヘッド見込んでも、おそらくLLの方が速いね。
877:名無しさん@お腹いっぱい。
10/01/27 14:26:16
>>876
はいはい、「おそらく」と書いとけば何でも言えるねw
perl/python/ruby自体のオーバーヘッド(結構大きい)も良く考えて出直してね
878:名無しさん@お腹いっぱい。
10/01/27 14:31:44
マルチコアなCPU環境だと、
同じことやる場合でもパイプで複数のプロセスに分けた方がかえって速かったりする
879:名無しさん@お腹いっぱい。
10/01/27 14:48:09
議論してる時間で問題を解決してしまった人の勝ち。
880:名無しさん@お腹いっぱい。
10/01/27 15:07:26
>>877
ぷぷっ。そのレスはそのまま返してやるよ。w
881:名無しさん@お腹いっぱい。
10/01/27 15:11:54
find ->(パイプ)-> md5
の場合、ファイル1個あたりにかかる時間はmd5の方がはるかに大きく、
find自体の動作はmd5の実行の裏プロセス(別CPU)で行なうから、
findの実行時間はすべてmd5の実行時間内に吸収されてしまって、
結局findの時間は無関係になる。
例: sleep 1 | sleep 10 ってやると、10秒で終了する。
左側のsleep 1は無関係になる。
もう1本のfindの、
find ->(パイプ)-> statコマンド
の方は、find->md5の方よりはるかに速いから、
2つのfindを名前付きパイプでpasteに接続する場合、
実行速度は遅い方の上流パイプであるmd5だけによって決まる。
よって、stat云々は一切関係なくなり、
名前付きパイプ+pasteが高速で動作する。
882:名無しさん@お腹いっぱい。
10/01/27 15:18:31
LLが遅いと因縁つけてる奴は実測して証拠出せよ。w
883:名無しさん@お腹いっぱい。
10/01/27 15:34:47
>>860が言うようにtimeで計測すれば済む話なのになぜ誰もやらないのか
あ、俺はrubyとか知らないからパスね^^
誰かfindとperl/python/rubyでベンチ取ってよ
884:名無しさん@お腹いっぱい。
10/01/27 16:40:18
適当に試してみたよ URLリンク(pastebin.com)
$ time test.bash >/dev/null
real 1m50.762s
user 0m17.992s
sys 0m4.473s
$ time test.py >/dev/null
real 1m49.994s
user 0m19.045s
sys 0m5.523s
885:名無しさん@お腹いっぱい。
10/01/28 01:38:29
>>884
そのPythonのソースだと、各ファイルに対してstat()が最大3回呼ばれるのかな
886:名無しさん@お腹いっぱい。
10/01/28 01:58:11
ま、どう考えてもMD5sum取る部分のI/O律速になるので
stat()の回数減らしたところで誤差程度だろうけど
887:名無しさん@お腹いっぱい。
10/01/28 03:34:55
1000倍以上違うだろうね
888:名無しさん@お腹いっぱい。
10/01/28 11:54:30
>>839
> find . -type f | xargs stat -f '%N,%z' > outputfile.txt
> find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
findは -print0でxrgsに渡し、xargsは -0で受け取るようにしましょう。
> find . -type f -print0 | xargs -0 stat -f '%N,%z' > outputfile.txt
> find . -type f | xargs -0 md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
URLリンク(www.otsune.com)
889:名無しさん@お腹いっぱい。
10/01/28 17:51:27
こんなのfind + perl のワンライナーでいいじゃん
> find . -type f -print | perl -l0ne 'use Digest::MD5 qw(md5_hex);$s=-s $_;print $_ ." $s " . md5_hex($_) ."\n"'
890:名無しさん@お腹いっぱい。
10/01/28 18:10:27
>>889
アフォか、ファイル名の md5 計算してどうする www
891:名無しさん@お腹いっぱい。
10/01/28 18:13:23
>>888
日記だからある意味しょうがないのだが。そういう古臭いページなんとかならないもんかね。
892:名無しさん@お腹いっぱい。
10/01/28 18:22:57
>>890
おー、いまperldocしたら
calculate the MD5 digest of this "message"
ってかいてあったwwはずかしいwwwしぬかも
893:名無しさん@お腹いっぱい。
10/01/28 19:05:07
>>891
どこがどう古臭いんだ?
894:名無しさん@お腹いっぱい。
10/01/28 19:22:17
今書くなら「xargs捨てろ。 -exec {} +使え」
895:名無しさん@お腹いっぱい。
10/01/28 19:22:36
>>894
一緒じゃないの?
896:名無しさん@お腹いっぱい。
10/01/28 20:27:35
-exec だと正しく受け取れないファイルがある。
-print0 |xargs -0のほうが安全
897:名無しさん@お腹いっぱい。
10/01/28 21:09:21
へー知らんかった
898:名無しさん@お腹いっぱい。
10/01/28 21:11:42
>>896
原理的に有り得ないんだけど。
899:名無しさん@お腹いっぱい。
10/01/28 21:13:42
どっちだよ気になるだろ
900:名無しさん@お腹いっぱい。
10/01/28 21:37:46
-exec の + ターミネータ(;でなく)を知らないで答えていたりしてな。
901:名無しさん@お腹いっぱい。
10/01/28 21:52:49
それにしても「正しく受け取れない」は原理的にない。
902:名無しさん@お腹いっぱい。
10/01/28 22:08:06
いや、あるから -0 オプションが後から追加されたんですが。
903:名無しさん@お腹いっぱい。
10/01/28 22:08:48
って、xargs じゃなくて find の方か。ならないや。ごめん。
904:名無しさん@お腹いっぱい。
10/01/28 22:17:25
結局>>896は本当なのかどうなのか答えてくれ
つまり実際に-exec +だと受けとれないファイルがあるのか
それとも単に-exec ;と-exec +を混同してただけなのか
それと>>894の-exec +のほうが良いという根拠は何だ?
-print0 | xargs -0じゃいかんのか?
このままじゃ気になって寝れやしない
905:名無しさん@お腹いっぱい。
10/01/28 22:42:34
>>904
> それと>>894の-exec +のほうが良いという根拠は何だ?
exec +がある環境ならxargsはレガシーコマンド。webで解説する必要は無い。
そもそも、exec +が無い環境がレガシー。 xargsはジジイの胸の奥にしまっておいてくれ。
906:名無しさん@お腹いっぱい。
10/01/28 22:49:15
GNU findutilsにxargs付いてくるじゃない
907:名無しさん@お腹いっぱい。
10/01/28 22:51:58
ジジイの懐古趣味
908:名無しさん@お腹いっぱい。
10/01/29 01:55:18
xargs がいつobsolete になったの?
なんか文書ある?
909:名無しさん@お腹いっぱい。
10/01/29 12:12:24
-exec + のデメリット
コマンドに渡すファイルの数を制御できない(xargs -n)
並列実行できない(xargs -P)
-exec + のメリット
find でひっかかったファイルが存在しなければコマンドが実行されない
(GNU xargs は入力がゼロでもなぜか1回は実行する; xargs -r で抑制可)
つーか、
ps ax | awk '/なんか条件/{print $1}' | xargs -r kill
みたいに find とは無関係に使う場合も多いから、obsolete のはずがない。
910:名無しさん@お腹いっぱい。
10/01/29 16:58:01
findの-execはひとつひとつ実行するから遅いだろ。
grep /dev/null というバッドノウハウもアレだけど。(-h使えって?)
911:名無しさん@お腹いっぱい。
10/01/29 17:01:35
>>910
find -exec + の 「+」の意味を理解していない方は発言を御遠慮ください
912:名無しさん@お腹いっぱい。
10/01/30 09:34:03
>>910
レガシーちゃんキター
913:名無しさん@お腹いっぱい。
10/01/30 09:38:13
MacのTimeMachineのようなことをするスクリプトを教えて
914:名無しさん@お腹いっぱい。
10/01/30 10:01:33
pdumpfs
Rubyスクリプトだけどな。
915:名無しさん@お腹いっぱい。
10/01/30 20:34:25
> -exec utility [argument ...] {} +
> Same as -exec, except that ``{}'' is replaced with as many path-
> names as possible for each invocation of utility. This behaviour
> is similar to that of xargs(1).
うおっ。-execに+なんて何時からあったんだ。
916:名無しさん@お腹いっぱい。
10/01/30 20:41:41
URLリンク(www.gnu.org)
GNU findutils 4.2ぐらいからか
917:名無しさん@お腹いっぱい。
10/01/30 21:09:21
-exec {} + テンプレに入ってるじゃねえかww
918:名無しさん@お腹いっぱい。
10/01/30 22:00:29
ほんとだ。テンプレにあるな。
>findは -exec command {} + を推奨。
>他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
まるで -exec + ならば solaris でも使えるように書いてあるが、
実際は使えなかったような記憶が…
919:名無しさん@お腹いっぱい。
10/01/31 02:34:28
>>913
つ URLリンク(wikis.sun.com)
920:名無しさん@お腹いっぱい。
10/01/31 20:50:42
>>918
URLリンク(docs.sun.com)
921:名無しさん@お腹いっぱい。
10/01/31 21:09:07
>>920
そのマニュアル、肝心なところを誤訳してるね。
日本語訳マニュアルは信用してはいけない。
922:名無しさん@お腹いっぱい。
10/01/31 21:19:36
sunでもあるんだな。日本誤訳マニュアル
923:名無しさん@お腹いっぱい。
10/02/01 01:46:35
原語は技術者が書いてても
翻訳は非技術者に丸投げだからね
924:名無しさん@お腹いっぱい。
10/02/02 23:57:42
このスレ参考にファイル数が膨大なディレクトリで
paste -d, <(find $i -type f -exec stat -f '%N,%z' {} +) \
<(find $i -type f -exec md5 {} + | sed -E 's/^MD5 \(.*\) = (.*)/\1/') \
> output.txt
やったら
find: fts_read cannot allocate memory
出ました。Mac OSX
なぜ? find のバグ?
925:名無しさん@お腹いっぱい。
10/02/03 00:03:47
libftsのバグじゃね?