1 名前:名無しさん@お腹いっぱい。 [2009/07/01(水) 09:42:48 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6 くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その14 pc12.2ch.net/test/read.cgi/unix/1233179688/
804 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 23:49:50 ] >>804 ありがとうございました。 command時に3を閉じてるので、echo時に1>&3としても出力されないと勘違いしておりました。 それと(3)について、command時に2>&1としていますが、 これはtee時の2には引き継がれないのでしょうか? 引き継がれていると、1>&2とすると元に戻って1に出力して statusに上書きしてしまうように見えます。
806 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 09:40:26 ] >>806 ありがとうございました。 全て理解できました。
808 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 18:20:04 ] つまり要約すると「ご教授」で正しかったのですね。 全て理解できました。
809 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 18:37:12 ] つまり要約すると「ご教授」で正しかったのですね。 全て理解できました。
810 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 19:15:58 ] 大事なことなので二度言いましたよ
811 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 19:41:07 ] >>803 ではありませんが・・・ パイプがあっても1 2ともにデフォルト (パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る) ただし新しいfdが作られていると、その先も残ったまま。 (パイプの左側で3が作られていると、右側でも3が作られている状態) パイプの左側では標準出力がパイプに渡される パイプの右側ではパイプから標準入力を受け取る コマンド置換は、最初のパイプの前までの標準出力を受け取る これで理解できてますか?
812 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 20:32:25 ] >>811 違うね。 >(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る) ↑ 「右側ではデフォルトに戻る」のではなく、 そもそも最初からデフォルトのまま変化しない。 >ただし新しいfdが作られていると、その先も残ったまま。 ↑ パイプの左側で新しいfdが作られても、その先には無関係(残らない)。 >>803 では、あらかじめ execでfdを作っているから、 それを全体が受け継いでいるだけ。これと混同してはいけない。 >コマンド置換は、最初のパイプの前までの標準出力を受け取る ↑ 「最初のパイプの前」じゃなく、パイプラインの最後のコマンドの標準出力を受け取る で、お約束の「ご教授しました」
813 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 21:37:11 ] 誤教授しましたと言うべき。
814 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 22:00:01 ] >>812 thx おおよそ理解しましたが、 2個目と3個目のレスが気になります。 > パイプの左側で新しいfdが作られても 新しいfdを作るにはexecしかないと思っていたのですが、これ以外で作れるのですか? ・・@ それとも、シェルから呼び出されたコマンドの中で作られたfdでは > 無関係(残らない) だけど、execで作っているときは受け継ぐという意味ですか?・・・・・・・・・・・・・・・・・・・・・・・・・A それと > それを全体が受け継いでいるだけ。 というのはそのシェル内で n>&- するまで有効という意味でよいですか?・・・・・・・・・・・・・・B 更にサブシェルにも受け継がれますか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・C 3個目の方は > パイプラインの最後のコマンドの標準出力 とありますが、これはteeの標準出力ではないのですか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・D (でも1>&2しているので、どうなるんだろう。teeは標準出力がなくなるので、3に書き込んだechoということなのかしら) 質問ばかりですみません。
815 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 22:02:31 ] C更にサブシェルにも受け継がれますか? forkするプログラム書いたことあるのを思い出しました。 たしか親からfd受け継いだはずなので、これは受け継がれますよね。
816 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/13(水) 18:38:41 ] 丁寧なご説明ありがとうございます!
818 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/13(水) 23:59:12 ] しかしほんとに「機種」依存文字なのか? 乗っかってるソフトウェア依存文字じゃないのか? とりあえず俺は読めるし、歴史的に俺の使っている機種が Cを表示できるはずは無いのだけれど、表示出来ているわけよ。 (どのようにタイプしたらその字が出せるか解らんが、とりあえずコピペは出来る) FreeBSD で LANG eucJP なのだが、2ちゃんねるビューワだとCが読めるし コピペで転記できるよ。(書き方は不明) ほんとに機種に依存するの?
819 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:04:36 ] ググレカス
820 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:38:24 ] 丸数字やローマ数字を機種依存文字と呼ぶのは おかんが家庭用ゲーム機ならPS3も360もファミコンと呼ぶのと同じで 言葉にこだわる必要はありません
821 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:52:50 ] 丸数字が機種依存とか言われたのは歴史的経緯だわな 今や機種依存どころかUnicodeというれっきとした国際標準に含まれてる 2chで今更丸数字使うなっても化石じみてて何だかな
822 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:55:09 ] 2chが化石Shift_JIS使ってるかぎり言われつづける
823 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 03:41:02 ] 2chはcp932だろ
824 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 04:14:23 ] 時代は UTF-8 ですよ
825 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 04:16:28 ] いまどきの機種依存文字といえば「〜」かな
826 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 08:28:32 ] >>825 誰もがWindows-31JとShift_JISの区別を付けるようになれば 片が付くのにね……
827 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 09:05:59 ] うちのMacちゃんでは2chのカキコのローマ数字が化けるざんす。
828 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 09:44:45 ] この板の住人ならOSは関係ないってことくらい分かるだろ MacJapaneseの代わりにWindows-31Jで処理するようなライブラリ使って FirefoxでもChromiumでも何でもビルドすればいいだけ
829 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 21:53:24 ] 半角カナは使ってもいいと思う
830 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 23:02:10 ] >>828 じゃあsafariをビルドする方法を教えてください。
831 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 23:41:43 ] フィルタリングプロキシを立てて Windows_31JくさいShift_JISなページをUTF-8に変換してやるのが楽じゃないかな
832 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/15(金) 00:12:46 ] それはクライアント側でフォントいじれよっていうのと等価では?
833 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/15(金) 00:29:34 ] 丸数字使うな。カス。と言う方が楽だしecoだな。
834 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/15(金) 01:08:33 ] エコロジストならスレ違いネタでスレを消費しないでくれ
835 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/16(土) 01:23:40 ] bashでif〜とする時、[ と [[ ができますが [ は 外部のtestコマンドで、[[が内部コマンドなんですよね? [ ではなく [[ を使った方が 速度が速いのでしょうか?
836 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/16(土) 01:50:26 ] bash の [ と test は builtin。[[ は compound command。 [[、[、外部コマンドの test の順に速い。 外部コマンドを呼んだ場合がダントツで遅くて、他の50倍ぐらい遅い。[[ と [ は大して変わらん。
837 名前:835 mailto:sage [2010/01/16(土) 02:16:10 ] お答えありがとう。
838 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/16(土) 12:01:06 ] >>834 富豪プログラマのスレです。
839 名前:名無しさん@お腹いっぱい。 [2010/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 名前:名無しさん@お腹いっぱい。 [2010/01/26(火) 12:24:01 ] 補足 各行が ファイル名,ファイルサイズ,MD5ハッシュ値 という出力にしたいです。
841 名前:名無しさん@お腹いっぱい。 [2010/01/26(火) 12:27:06 ] コピペミスです。>>839 の2つ目のfindは正しくは find . -type f | xargs md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt でした。
842 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 12:49:51 ] perlかpythonかrubyで書きなよ。
843 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 12:52:31 ] ●解答 joinすればいいだけ。 ●補足 箇条書での質問は失礼
844 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 13:01:19 ] ●傍観者の感想 ワロタ
845 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 13:31:04 ] pasteというコマンドがあってだな。
846 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 14:55:29 ] sed が起動するのは気にならないのかw
847 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 15:05:51 ] >>846 そりゃ、sedは1回しか起動しないし
848 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 16:46:34 ] 次スレのテンプレに↓入れとけよ ●解答 perlかpythonかrubyで書きなよ。
849 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 16:50:45 ] >>848 >>1 ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 Pythonも入れればよいわけだな。
850 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 16:52:39 ] で、今回の質問の場合 perlもpythonもruby関係なくて、 joinかpasteで済む問題だったわけだが、、
851 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 17:03:54 ] join, pasteは中間ファイルを作るわけだが、数百万ファイルになるとかなりのオーバーヘッドになる。 実行時間はファイルIOが支配的なのでインタプリタが消費するCPUは隠される。 従ってLLでの実装を勧めたわけだが、初心者にはわからないらしい。覚えておく事だ。
852 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 17:35:37 ] >>851 中間ファイルを作らずにnamed pipeでやる方法を知らない初心者らしい、、
853 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 18:31:25 ] この件では I/O にかかる時間でいちばん支配的なのは find, md5, stat,(+ join を使う場合は sort)であって、 中間ファイルを使うことによるオーバーヘッドなんぞ誤差にしかならんよ。
854 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 18:34:04 ] 中間ファイルって、MS-DOSじゃないんだから・・・
855 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 18:40:42 ] find × 2 → named pipe → paste で、中間ファイルなしでメデタシメデタシ
856 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 19:28:25 ] 一部のシェルの diff <(command) <(command2) みたいなのは中間ファイル作るのかしらん?
857 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 19:30:24 ] >>856 だから、それが named pipeなんだよw
858 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 19:31:07 ] mknod で作らなくてもいいのかー
859 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 22:34:39 ] findは全てのファイルにstatかけるのを知らない初心者? w
860 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 22:37:15 ] っつーか >>839 と >>842 をそれぞれ時間計測して比べりゃすむ話だろ 漏れは後者の勝ちだと思う
861 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 22:38:26 ] >>854-855 パイプのIOは発生するだろ。バカ。
862 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 22:38:31 ] 漏れww
863 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 00:35:27 ] 2ch初心者発見。 漏れ、とかで煽られても、、、 半年ROMってれば。
864 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 00:52:28 ] 2ch上級者(;´Д`)
865 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 01:11:09 ] 今時漏れなんて使わねぇよw
866 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 06:54:47 ] >>839 自身、find×2 を個別に実行した状態で 「満足な早さで出力が得られます」 と言っているのだから、それがすべて。 問題はそこじゃなくて、2つの出力を効率良くまとめる方法が質問点。 で、そのベストアンサーはpaste。
867 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 11:51:49 ] 自演乙
868 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 12:54:46 ] >>866 負け犬の何とか…
869 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:17:04 ] >>859 ここではstatは問題にならないんだよ、初心者クン >>860 >後者の勝ちだと思う 「思う」だけじゃ間違ったことでも言えてしまうねw >>861 パイプのI/Oでは物理I/Oは発生しないんだよ、初心者クン
870 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:26:19 ] >>869 前言撤回? w
871 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:28:37 ] >>870 良く良め。869 は 「named pipe+paste の方が速い」という主張を一貫してしてるぞ
872 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:40:18 ] (1)シェルスクリプトでの多少高度な質問がなされる ↓ (2)「それはPerlかPythonかRuby使った方が速い」と誰かが投稿 ↓ (3)別の人からシェルスクリプトでのマトモな回答が投稿される ↓ (4)質問者、傍観者とも納得 ↓ (5) (2)が発狂 ← 今ココ
873 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:50:58 ] >>871 アルツハイマー? >>853 > find, md5, stat,(+ join を使う場合は sort)であって、
874 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:53:01 ] >>869 は >>853 じゃないよ。
875 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 13:57:01 ] >>853 が言ってる statは、xargsから起動されるstatコマンドのことであって、 find内部のstatのことじゃないだろ。
876 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 14:22:00 ] LL: ディレクトリ読み込み 1回 stat(i-node読み込み) ファイル個数 MD5 ファイル個数 出力 paste: ディレクトリ読み込み 2回 stat(i-node読み込み) ファイル個数×3 MD5 ファイル個数 中間ファイル(パイプ)書き出し/読み込み 出力 ファイル数が多くてiノードのキャッシュは期待できない。 MD5はCでの実装もあるから、インタープリターのオーバー ヘッド見込んでも、おそらくLLの方が速いね。
877 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 14:26:16 ] >>876 はいはい、「おそらく」と書いとけば何でも言えるねw perl/python/ruby自体のオーバーヘッド(結構大きい)も良く考えて出直してね
878 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 14:31:44 ] マルチコアなCPU環境だと、 同じことやる場合でもパイプで複数のプロセスに分けた方がかえって速かったりする
879 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 14:48:09 ] 議論してる時間で問題を解決してしまった人の勝ち。
880 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 15:07:26 ] >>877 ぷぷっ。そのレスはそのまま返してやるよ。w
881 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 15:18:31 ] LLが遅いと因縁つけてる奴は実測して証拠出せよ。w
883 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 15:34:47 ] >>860 が言うようにtimeで計測すれば済む話なのになぜ誰もやらないのか あ、俺はrubyとか知らないからパスね^^ 誰かfindとperl/python/rubyでベンチ取ってよ
884 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/27(水) 16:40:18 ] 適当に試してみたよ pastebin.com/f1130c0e8 $ 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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 01:38:29 ] >>884 そのPythonのソースだと、各ファイルに対してstat()が最大3回呼ばれるのかな
886 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 01:58:11 ] ま、どう考えてもMD5sum取る部分のI/O律速になるので stat()の回数減らしたところで誤差程度だろうけど
887 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 03:34:55 ] 1000倍以上違うだろうね
888 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 www.otsune.com/diary/2007/03/29/1.html
889 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 18:10:27 ] >>889 アフォか、ファイル名の md5 計算してどうする www
891 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 18:13:23 ] >>888 日記だからある意味しょうがないのだが。そういう古臭いページなんとかならないもんかね。
892 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 18:22:57 ] >>890 おー、いまperldocしたら calculate the MD5 digest of this "message" ってかいてあったwwはずかしいwwwしぬかも
893 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 19:05:07 ] >>891 どこがどう古臭いんだ?
894 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 19:22:17 ] 今書くなら「xargs捨てろ。 -exec {} +使え」
895 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 19:22:36 ] >>894 一緒じゃないの?
896 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 20:27:35 ] -exec だと正しく受け取れないファイルがある。 -print0 |xargs -0のほうが安全
897 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 21:09:21 ] へー知らんかった
898 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 21:11:42 ] >>896 原理的に有り得ないんだけど。
899 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 21:13:42 ] どっちだよ気になるだろ
900 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 21:37:46 ] -exec の + ターミネータ(;でなく)を知らないで答えていたりしてな。
901 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 21:52:49 ] それにしても「正しく受け取れない」は原理的にない。
902 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 22:08:06 ] いや、あるから -0 オプションが後から追加されたんですが。
903 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 22:08:48 ] って、xargs じゃなくて find の方か。ならないや。ごめん。
904 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 22:17:25 ] 結局>>896 は本当なのかどうなのか答えてくれ つまり実際に-exec +だと受けとれないファイルがあるのか それとも単に-exec ;と-exec +を混同してただけなのか それと>>894 の-exec +のほうが良いという根拠は何だ? -print0 | xargs -0じゃいかんのか? このままじゃ気になって寝れやしない