[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 04/21 15:11 / Filesize : 233 KB / Number-of Response : 926
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その15



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のバグじゃね?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<233KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef