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/
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じゃいかんのか? このままじゃ気になって寝れやしない
905 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 22:42:34 ] >>904 > それと>>894 の-exec +のほうが良いという根拠は何だ? exec +がある環境ならxargsはレガシーコマンド。webで解説する必要は無い。 そもそも、exec +が無い環境がレガシー。 xargsはジジイの胸の奥にしまっておいてくれ。
906 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 22:49:15 ] GNU findutilsにxargs付いてくるじゃない
907 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/28(木) 22:51:58 ] ジジイの懐古趣味
908 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/29(金) 01:55:18 ] xargs がいつobsolete になったの? なんか文書ある?
909 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/29(金) 16:58:01 ] findの-execはひとつひとつ実行するから遅いだろ。 grep /dev/null というバッドノウハウもアレだけど。(-h使えって?)
911 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/29(金) 17:01:35 ] >>910 find -exec + の 「+」の意味を理解していない方は発言を御遠慮ください
912 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/30(土) 09:34:03 ] >>910 レガシーちゃんキター
913 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/30(土) 09:38:13 ] MacのTimeMachineのようなことをするスクリプトを教えて
914 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/30(土) 10:01:33 ] pdumpfs Rubyスクリプトだけどな。
915 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/30(土) 20:41:41 ] ttp://www.gnu.org/software/findutils/manual/html_mono/find.html#Multiple-Files GNU findutils 4.2ぐらいからか
917 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/30(土) 21:09:21 ] -exec {} + テンプレに入ってるじゃねえかww
918 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/30(土) 22:00:29 ] ほんとだ。テンプレにあるな。 >findは -exec command {} + を推奨。 >他に -print0、xargsは -0オプションという方法もあるがSolaris非対応) まるで -exec + ならば solaris でも使えるように書いてあるが、 実際は使えなかったような記憶が…
919 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/31(日) 02:34:28 ] >>913 つ wikis.sun.com/display/OpenSolaris/ZFSTimeSlider
920 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/31(日) 20:50:42 ] >>918 docs.sun.com/app/docs/doc/819-1210/find-1?a=view
921 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/31(日) 21:09:07 ] >>920 そのマニュアル、肝心なところを誤訳してるね。 日本語訳マニュアルは信用してはいけない。
922 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/31(日) 21:19:36 ] sunでもあるんだな。日本誤訳マニュアル
923 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/02/01(月) 01:46:35 ] 原語は技術者が書いてても 翻訳は非技術者に丸投げだからね
924 名前:名無しさん@お腹いっぱい。 [2010/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 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/02/03(水) 00:03:47 ] libftsのバグじゃね?