- 1 名前:login:Penguin [2007/07/10(火) 23:17:13 ID:qGthZdME]
- UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? 【sed】シェルスクリプト総合@LINUX Part2【awk】 pc11.2ch.net/test/read.cgi/linux/1154578200/ pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5あたりに色々と。
- 616 名前:login:Penguin mailto:sage [2008/02/16(土) 16:57:40 ID:TCXFbGKj]
- 釣られてやるが
if $KIMOI; then
- 617 名前:login:Penguin mailto:sage [2008/02/16(土) 19:13:59 ID:TWToK0Vy]
- いやいや、キモイとかキモクナイを超越することこそが答なのだよ。
export KIMOI= が正解なのだ。
- 618 名前:login:Penguin mailto:sage [2008/02/17(日) 01:08:38 ID:iw9ufgAV]
- >>615-616
なぜそうなるか素人の私にも解説してくだされぇ〜
- 619 名前:login:Penguin mailto:sage [2008/02/17(日) 01:11:52 ID:slw092IT]
- >>616 素で知らなかった.ありがと!
- 620 名前:login:Penguin mailto:sage [2008/02/17(日) 01:27:34 ID:PyTcVmai]
- /usr/bin/[≒/usr/bin/test
- 621 名前:login:Penguin mailto:sage [2008/02/17(日) 03:00:02 ID:tnXxiXa8]
- >>618
if文やwhile文の条件部に書くのは、実はコマンド。 コマンドの終了コードが0なら条件が成立したとみなされる。 で、true(0を返す)やfalse(1(非0)を返す)というコマンドがあるわけだな。 ちなみに [ もコマンドだ。
- 622 名前:login:Penguin mailto:sage [2008/02/17(日) 09:32:32 ID:OGJD7PPY]
- みんな釣られ過ぎ…
$KIMOIに"false"という文字列を代入してるだけ。
- 623 名前:login:Penguin mailto:sage [2008/02/17(日) 14:07:35 ID:4A7UiB6D]
- >>612
俺らはゴーストですか
- 624 名前:login:Penguin mailto:sage [2008/02/17(日) 14:21:15 ID:slw092IT]
- >>623
ネットは広大だよな
- 625 名前:login:Penguin mailto:sage [2008/02/17(日) 14:29:38 ID:uY7SK9GA]
- >>623
否、貴腐人間かもw
- 626 名前:login:Penguin mailto:sage [2008/02/17(日) 14:38:41 ID:slw092IT]
- >>625
元ネタwkrn
- 627 名前:login:Penguin mailto:sage [2008/02/17(日) 14:42:27 ID:uY7SK9GA]
- >>626 「貴腐老人」でggrks
- 628 名前:login:Penguin mailto:sage [2008/02/17(日) 14:44:26 ID:slw092IT]
- >>627
tnks
- 629 名前:login:Penguin [2008/02/18(月) 07:12:54 ID:AGIm4SRV]
- zenity でファイルの選択をさせるのに、最初に任意のフォルダを開くにはなんと書けばいいのか教えて下さい。
- 630 名前:login:Penguin mailto:sage [2008/02/18(月) 11:55:16 ID:VgIMGwkB]
- カレントディレクトリを開くみたいだから、サブシェルを使ってこんな感じでどうかな
(cd /; zenity --file-selection)
- 631 名前:login:Penguin [2008/02/18(月) 13:16:10 ID:AGIm4SRV]
- >>630
ありがとうございます。 やってみます。
- 632 名前:login:Penguin mailto:sage [2008/02/19(火) 08:50:21 ID:90boQwVS]
- シェルスクリプトを覚えるとなにが出来るようになるんですか?
- 633 名前:login:Penguin mailto:sage [2008/02/19(火) 09:00:32 ID:7ADZuvq7]
- >>632
ルーチンワークで楽できる(場合がある)
- 634 名前:login:Penguin mailto:sage [2008/02/19(火) 16:05:41 ID:VrKwqWf/]
- >>632
作業の自動化や、例えばユーザを100人登録しないといけないとか言う、膨大な作業を 物凄い速度で短時間で終わらせる事が出来るようになるとか。
- 635 名前:login:Penguin mailto:sage [2008/02/19(火) 17:25:49 ID:90boQwVS]
- >>633>>634
ほほぅ、ありがとうございます。
- 636 名前:login:Penguin mailto:sage [2008/02/19(火) 19:54:38 ID:oWc/fsPo]
- ほほうって、コンピュータに仕事をさせるという観念のない人なんだろうか。
高級な紙と鉛筆だとしか思ってなさげな人。たまにいるけど……。
- 637 名前:login:Penguin mailto:sage [2008/02/19(火) 19:56:54 ID:7ADZuvq7]
- 魔法の箱だと思ってるよりマシだと思う
- 638 名前:login:Penguin mailto:sage [2008/02/19(火) 23:07:22 ID:VrKwqWf/]
- コンピュータは ある機能を実現させる為の方法(アルゴリズム)を示してやれば
どんなにそれが重労働だろうが難しい計算をしないといけなかろうが、 忠実に高速かつ正確、大量に実行させる事が出来るから凄いよ・・・。 ただし、その仕事の仕方を教える(アルゴリズムを教える)のがかなり苦労するんだけどな・・・。
- 639 名前:login:Penguin mailto:sage [2008/02/20(水) 03:07:58 ID:eOYCs3Nz]
- 基本的に人間がやってもできることを高速ですることしかできないということを知らない人が多すぎる
- 640 名前:login:Penguin mailto:sage [2008/02/20(水) 03:37:12 ID:Z0UaqwNw]
- それは、一秒間に3ギガ回も足し算したり、地球の裏側に光の速度で手紙を届けたりなんつーのは
基本的に人間には絶対できない、ということを知らない者は>>639だけだというだけの話かと。
- 641 名前:login:Penguin mailto:sage [2008/02/20(水) 04:33:00 ID:H+YlTABW]
- 君も頭悪いな。
639は高速で、と書いてあるんだから、「速度を問わなければ」人間が…と 読むのが妥当という答にしかならないぞ。 どうせそういう突っ込みするなら空間計算量でやればよかったのに。
- 642 名前:login:Penguin mailto:sage [2008/02/20(水) 07:24:32 ID:kPfB9gdm]
- 理論ばっかりのたまって生産性の無い人ってよくいるよね。
- 643 名前:login:Penguin mailto:sage [2008/02/20(水) 08:22:42 ID:TBsfl6zQ]
- まとめ。
Q) シェルスクリプトを覚えるとなにが出来るようになるんですか? A) 理論ばっかりのたまって生産性の無い人ってよくいるよね。
- 644 名前:login:Penguin mailto:sage [2008/02/20(水) 09:09:29 ID:s2YtVBn2]
- >>632
シェルスクリプトでやりたいと思ったこと。
- 645 名前:login:Penguin mailto:sage [2008/02/20(水) 10:22:00 ID:0BB6Gw/L]
- 俺は…彼女にパイズリして欲しいな…。
乳はAAだけど orz
- 646 名前:login:Penguin mailto:sage [2008/02/20(水) 10:22:28 ID:0BB6Gw/L]
- >>645
誤爆った。正直スマンかった。
- 647 名前:login:Penguin mailto:sage [2008/02/20(水) 10:47:15 ID:VHJ6cFjQ]
- >>645
基本的に彼女ができないことなのでシェルスクリプトでもできません。
- 648 名前:login:Penguin mailto:sage [2008/02/20(水) 11:22:35 ID:eOYCs3Nz]
- >>647
AAでもいいということなので,アスキーアートでおっぱいを表現することならシェルスクリプトで可能です さらに最近のターミナルエミュレーターはアンチエイリアスがきいてるのでなめらかですよ
- 649 名前:login:Penguin mailto:sage [2008/02/20(水) 11:31:04 ID:Z0UaqwNw]
- すごいな。>>641は地球の裏側に手紙を届けたりなんてことが「ゆっくりならできる」そうだ。
できるというなら精々一生をかけて歩いて船をこいで手紙を届けにいって、それを証明してほしいものだ。 コンピュータという人間が使うモノが、人間以上の方法(アルゴリズムなどの知性)を知らないのは当然のことだが 最近ではその知性すら、コンピュータを使ったシミュレーション解析などで 得ることが増えているのが現実だったりするわけで。特に知の最先端ほどそうだ。 もはや人類はコンピュータを使わないと新しい知識を得ることすら「できない」状況なんだけどね。 そういう現実が見えない人はやっぱり自分の納得を唯一の判断基準とする文系人かな。 人間は遠くのものが見え、遠くの人と話し、より多くの知識を得、共有できるようになった。 100年前に比べたら、ほんとうに夢の魔法かコミックの世界だ。コンピュータはほんとに魔法の箱みたいじゃないか。 そのセンスは逆にあまり間違っていない気がするけどな。 「高度に進んだ科学技術はもはや魔法と見分けがつかない」アーサー・C・クラーク
- 650 名前:login:Penguin mailto:sage [2008/02/20(水) 12:06:00 ID:eOYCs3Nz]
- >>649
日本語でおk 電報というものがあるんだが最近のゆとりは知らないのか?
- 651 名前:login:Penguin mailto:sage [2008/02/20(水) 12:14:29 ID:pg37fRgc]
- ゆとり言いたいだけちゃうんかと
- 652 名前:login:Penguin mailto:sage [2008/02/20(水) 12:23:41 ID:XajlgLxx]
- ネタはよそでやっとくれよ。
- 653 名前:login:Penguin mailto:sage [2008/02/20(水) 16:28:17 ID:vrkF+BtG]
- このスレの>>640や>>641の意見が興味深い。面白いな・・・。
>>648 そういうシェルスクリプト作って公開してよwwwwぜひ実行してみたい・・w
- 654 名前:login:Penguin mailto:sage [2008/02/20(水) 19:29:13 ID:7TuVNRao]
- 先日の芥川賞受賞作が>>649の文章に似てる。
句点から次の句点まで地球半周ぐらいあって、だらだらと続く感じが。 sankei.jp.msn.com/culture/academic/080116/
- 655 名前:login:Penguin mailto:sage [2008/02/21(木) 06:19:36 ID:FDbXS9I4]
- >>649
こういう無駄な長文を書ける才能には素直に感心するよ。
- 656 名前:login:Penguin mailto:sage [2008/02/21(木) 12:33:09 ID:xpu03eg4]
- 時間を持て余してるんだろ?
- 657 名前:login:Penguin mailto:sage [2008/02/21(木) 18:35:15 ID:oj1Q2W6E]
- ある意味うらやましい知性だ。
- 658 名前:login:Penguin mailto:sage [2008/02/24(日) 10:15:17 ID:RUTtO6AQ]
- slコマンドってなかった?画面いっぱいにSLを表現
あれはシェルスクリプトではないから違うか・・・。
- 659 名前:login:Penguin mailto:sage [2008/02/24(日) 11:38:47 ID:kyu4Np6c]
- >>658
つ www.tkl.iis.u-tokyo.ac.jp/~toyoda/
- 660 名前:login:Penguin mailto:sage [2008/02/24(日) 13:02:41 ID:FjGZZj6V]
- bashです。
cdするたびに一緒にlsもして欲しいんですが、どうやって書いたらいいでしょうか? aliasだとうまくできないです。
- 661 名前:login:Penguin mailto:sage [2008/02/24(日) 13:04:14 ID:UaS7yo8D]
- alias cls='cd $1 && ls'
- 662 名前:login:Penguin mailto:sage [2008/02/24(日) 13:21:41 ID:CzUoXlF2]
- clsといったらCLear Screenだろうに
- 663 名前:login:Penguin mailto:sage [2008/02/24(日) 13:24:30 ID:UaS7yo8D]
- そうなのか。うちにはそんなコマンドないって言われたもので。
- 664 名前:login:Penguin mailto:sage [2008/02/24(日) 14:04:47 ID:I77Y2jQo]
- そりゃDOSのコマンドだからな。
- 665 名前:login:Penguin mailto:sage [2008/02/24(日) 14:44:06 ID:FjGZZj6V]
- >>661
できないみたいです。 カレントディレクトリが切り替わりません。
- 666 名前:login:Penguin mailto:sage [2008/02/24(日) 14:53:32 ID:UaS7yo8D]
- >>665
うちでは動作確認したんだが・・・なんでだろね。
- 667 名前:login:Penguin mailto:sage [2008/02/24(日) 14:54:08 ID:UaS7yo8D]
- あ、ほんとだ、切り替わらないねw
- 668 名前:login:Penguin mailto:sage [2008/02/24(日) 15:09:41 ID:I77Y2jQo]
- PROMPT_COMMAND='if [ "$PWD" != "$PWD2" ]; then ls; PWD2="$PWD"; fi'
- 669 名前:login:Penguin mailto:sage [2008/02/24(日) 15:13:49 ID:uTpa9gVS]
- >>667
ぢゃあ関数にしちゃうとか。 function cls { cd $1 && ls }
- 670 名前:login:Penguin mailto:sage [2008/02/24(日) 15:23:08 ID:UaS7yo8D]
- cdはシェルの内部コマンドだから親プロセスには反映されないんだねえ。
#!/bin/sh cd $1 ls として、foo.shとして、 alias cds='. foo.sh' かなあ。動作確認はしたw
- 671 名前:login:Penguin mailto:sage [2008/02/24(日) 15:36:14 ID:FjGZZj6V]
- できればclsじゃなくてcdでやりたいです。
>>669,670 でcdにするとなぜか動かない。 でも参考になりました。 >>668 わかんないです。
- 672 名前:login:Penguin mailto:sage [2008/02/24(日) 15:41:52 ID:FjGZZj6V]
- #!/bin/sh
'cd' $1 ls として、foo.shとして、 alias cd='. foo.sh' でできました。(・∀・)イイ! ありがとう。
- 673 名前:login:Penguin mailto:sage [2008/02/24(日) 15:42:06 ID:Sa+MU/+b]
- cd() {
builtin cd $1 && ls }
- 674 名前:login:Penguin mailto:sage [2008/02/24(日) 15:46:14 ID:I77Y2jQo]
- ( ゚д゚)……
- 675 名前:login:Penguin mailto:sage [2008/02/24(日) 15:47:40 ID:UaS7yo8D]
- >>673
ビルトインか。やっぱりman読まないとダメだな。 ありがとう。
- 676 名前:login:Penguin mailto:sage [2008/02/24(日) 15:54:18 ID:l3aT8ww/]
- ほう、すげっ
- 677 名前:login:Penguin mailto:sage [2008/02/24(日) 15:55:21 ID:FjGZZj6V]
- >>673
それも(・∀・)イイ! トン
- 678 名前:login:Penguin mailto:sage [2008/02/24(日) 16:08:01 ID:OZdK2Ezs]
- 668は逆にわかりやすいと思うが・・・なぜ分からぬ
- 679 名前:login:Penguin mailto:sage [2008/02/24(日) 16:57:30 ID:M1aIs9jI]
- >>659
slねぇ・・・Vine 3.2だとmakeしてもエラーが出てmake出来ないんだけど・・・? apt-get install build-essential は入ってる環境です。
- 680 名前:login:Penguin mailto:sage [2008/02/24(日) 21:43:32 ID:X4+soAGj]
- >>679
libncurses.soのことか?
- 681 名前:login:Penguin mailto:sage [2008/02/24(日) 22:41:47 ID:WU8Eis2Q]
- >>673
cd に -P とかオプションつけると機能しなくなるぞ。 cd() { builtin cd "$@" && ls; }
- 682 名前:login:Penguin mailto:sage [2008/02/24(日) 22:44:30 ID:CzUoXlF2]
- >>673,>>681
それしばらく使ってみるとわかると思うけど、 そのままではナイーブすぎて少し不便だよ。 zshで同じようなことやってるけど、次の点は考慮した方がいいです。 ・サブシェルで実行されたときにはlsしない ・行数が多すぎるときは適当な長さで切り、省略した旨を表示
- 683 名前:login:Penguin mailto:sage [2008/02/25(月) 12:48:54 ID:fTf5K0mT]
- 同一内容のファイルを調べるシェルスクリプトなんだけど、過去にここかUNIX板の方で出てたっぽい。
結局やらず仕舞いだったようだし、どうせならシェルスクリプトの勉強がてらやってみようとおもった。 作りたい理想は以下のとおり ・コマンドラインでオプション指定を行い、検索ディレクトリとサブディレクトリへの再帰検索をするかどうか、あとファイルサイズ閾値を指定できる ・走査しているディレクトリにあるファイルパス&ファイルサイズのペアをリストとして吐く ・ファイルサイズ閾値未満で、ファイルサイズが一致したものに対してmd5sumを実行し、両方が同一のハッシュを吐いた場合、表示する。 ・ファイルサイズ閾値を設定する理由はmd5sumが時間がかかりそうだから。閾値以上のサイズ一致ファイルはmd5sumすることなく表示する。
- 684 名前:login:Penguin mailto:sage [2008/02/25(月) 12:52:01 ID:fTf5K0mT]
- ちなみにサブディレクトリの再帰検索をせず、指定したディレクトリの全てのファイルのハッシュ値を比較して表示するだけなら
#!/bin/sh md5sum $1/* | uniq -D --check-chars=32 | sed 's/^[0-9a-f]* \*//g' 上のだけで済むかな。標準エラーがうざいけど・・・ まずはディレクトリの再帰検索について質問したいところです。
- 685 名前:login:Penguin mailto:sage [2008/02/25(月) 12:55:37 ID:fTf5K0mT]
- あ、uniqの間にsortを入れてあげるとより親切か
うちの場合はwgetで自動保存したファイルの整理だから、ファイル名が必然的に「DLファイル名+.連番」だから気にならないけど まったく違うファイル名かつ内容は同一ってときに、ハッシュ値でsortしてあげていた方がいいよね そう考えたらsedでハッシュ値をわざわざ消す必要もないか・・・ md5sum $1/* | sort | uniq -D --check-chars=32
- 686 名前:login:Penguin mailto:sage [2008/02/25(月) 12:57:54 ID:fTf5K0mT]
- 再帰検索はこの場合、find $1でファイルリストを列挙してからreadで"ls->ファイルサイズ取得"やら"md5sum"やらした方がいいのかな?
- 687 名前:login:Penguin mailto:sage [2008/02/25(月) 13:38:12 ID:fTf5K0mT]
- 不恰好だけどサブディレクトリまで調べて、全てのファイルにmd5sumして表示するのはこんな具合か・・・
#!/bin/sh TMPFILE="filelist" touch $TMPFILE find $1 | while read FILENAME; do if [ -f "$FILENAME" ]; then md5sum "$FILENAME" >> $TMPFILE fi done sort < $TMPFILE | uniq -D --check-chars=32 rm $TMPFILE もうちょっとスマートにならないかなあ・・・ あとユニークなサイズのファイルはmd5sumさせたくないなあ
- 688 名前:login:Penguin mailto:sage [2008/02/25(月) 13:47:58 ID:pu40lUxS]
- 書いてみた。
#!/bin/sh # finddup.sh -- find . | finddup.sh while read -r FILENAME do [ -f "$FILENAME" ] && printf "%14d:%s\n" `stat -c %s "$FILENAME"` "$FILENAME" done | sort | uniq -D -w14 | cut -b 16- | xargs md5sum | sort | uniq -D -w32
- 689 名前:login:Penguin mailto:sage [2008/02/25(月) 13:53:38 ID:pu40lUxS]
- uniq -f のほうが良さそうだね
- 690 名前:login:Penguin mailto:sage [2008/02/25(月) 13:57:12 ID:ATO0A7OZ]
- >>687
find . -type f -print0 | xargs -0 md5sum | sort | uniq -D -w32
- 691 名前:login:Penguin mailto:sage [2008/02/25(月) 14:17:36 ID:fTf5K0mT]
- >>688
ありがとう! あ、ただファイルやディレクトリ名にスペースが入るとmd5sumにしっかり渡せないみたいです bash on cygwin環境だとWindowsの「コピー (2) 〜 hoge.txt」という名前が恨めしい >>690 出力結果同じだΣすげえ ちょっとman読んでこよう・・・
- 692 名前:login:Penguin mailto:sage [2008/02/25(月) 14:23:38 ID:pu40lUxS]
- xargs --delimiter "
" md5sum でどうかな。ちゃんとテストしなきゃだめだね まあ改行文字を含むファイルがあるとだめなんだけど、面倒だから他の言語でやらせたほうがいい
- 693 名前:login:Penguin mailto:sage [2008/02/25(月) 14:26:43 ID:ATO0A7OZ]
- >>692
>>690
- 694 名前:login:Penguin mailto:sage [2008/02/25(月) 14:27:32 ID:pu40lUxS]
- >>693
全部のファイルにmd5sumかけたら遅いだろ
- 695 名前:login:Penguin mailto:sage [2008/02/25(月) 14:31:42 ID:fTf5K0mT]
- あ、>>688のxargs md5sumを>>690のようにxargs -0 md5sumにすればOKなのかな
- 696 名前:login:Penguin mailto:sage [2008/02/25(月) 14:38:34 ID:ATO0A7OZ]
- >>695
んで、printf 側でも \n じゃなく \0 を使うようにする。
- 697 名前:login:Penguin mailto:sage [2008/02/25(月) 14:39:51 ID:pu40lUxS]
- uniqとcutはどうするよ
- 698 名前:login:Penguin mailto:sage [2008/02/25(月) 14:43:11 ID:fTf5K0mT]
- printfで囲ってやればイケました(`・ω・´)
#!/bin/sh # finddup.sh -- ./finddup.sh target-path find $1 | while read -r FILENAME do [ -f "$FILENAME" ] && printf "%14d:\"%s\"\n" `stat -c %s "$FILENAME"` "$FILENAME" done | sort | uniq -D -w14 | cut -b 16- | xargs md5sum | sort | uniq -D -w32
- 699 名前:login:Penguin mailto:sage [2008/02/25(月) 15:21:01 ID:zYqxhFYE]
- 久々にまともな流れだな
- 700 名前:login:Penguin mailto:sage [2008/02/25(月) 16:57:52 ID:fTf5K0mT]
- ついでに以下のような動きが出来ないか色々試してみています。
どうも二進も三進も行かない $ ./findup.sh ~/pic/jun.2chan.net/ 2件の一致ファイル:8f7c1e2adb45adbfdb4d86adb1b9e894-------------------------- ~/jun.2chan.net/b/src/1192805081129.jpg ~/jun.2chan.net/b/src/1192805081141.jpg ------------------------------------------------------------------------------- ~/jun.2chan.net/b/src/1192805081129.jpgを削除しますか?[y/N/a] ~/jun.2chan.net/b/src/1192805081141.jpgを削除しますか?[y/N/a] y ~/jun.2chan.net/b/src/1192805081141.jpgを削除しました。 3件の一致ファイル:6fc4bdc4bc3bb06882bc98d9cbeb60c3-------------------------- ~/jun.2chan.net/b/src/1192800164913.jpg ~/jun.2chan.net/b/src/1194189136460.jpg ~/jun.2chan.net/b/src/1194189137115.jpg ------------------------------------------------------------------------------- ~/jun.2chan.net/b/src/1192800164913.jpgを削除しますか?[y/N/a] y ~/jun.2chan.net/b/src/1192800164913.jpgを削除しました。 ~/jun.2chan.net/b/src/1194189136460.jpgを削除しますか?[y/N/a] y ~/jun.2chan.net/b/src/1194189136460.jpgを削除しました。 ↑同一として列挙されたパスの残りが1になると削除せず次へ
- 701 名前:login:Penguin mailto:sage [2008/02/25(月) 17:00:46 ID:ATO0A7OZ]
- >>700
そこまで行くとシェルスクリプトには荷が重いんじゃないか?
- 702 名前:login:Penguin mailto:sage [2008/02/25(月) 17:10:48 ID:fTf5K0mT]
- >>701
以下の点でハードルがあがってるみたいですね ・一致したファイルのグループ分け ・ファイルを一つだけ残して削除した場合、残りの1ファイルは削除しない 列挙した全ファイルに対して、質問→削除というのは簡単にいけそうな感じ。 自分の知識だけで無理と判断して投げるのはアレだと思ったんだけど、やっぱ難しいかなあ
- 703 名前:login:Penguin mailto:sage [2008/02/25(月) 18:09:02 ID:pu40lUxS]
- #!/bin/bash
# askdelete.sh -- find . | finddup.sh | askdelete.sh # よくテストされてませんので注意 TMPF=`mktemp /tmp/askdelete.XXXXXX` trap 'rm $TMPF' 0 CURHASH= COUNT=0 (cat; echo DUMMYHASH /dev/null) | while read -r HASH FILENAME; do if [ "$CURHASH" ] && [ "$CURHASH" != "$HASH" ]; then echo "------------------------------" echo "$COUNT 件の一致ファイル:$CURHASH" tail -n $COUNT $TMPF | cut -b 33- echo "------------------------------" tail -n $COUNT $TMPF | while read -r HASH FILENAME; do [ $COUNT -eq 1 ] && break echo -n "$FILENAME を削除しますか? [yN] " while read ANSWER do case "$ANSWER" in [yY]) echo rm "$FILENAME" COUNT=`expr $COUNT - 1` ;; esac done < <(head -1 /dev/tty) done COUNT=0 fi echo $HASH $FILENAME >>$TMPF CURHASH=$HASH COUNT=`expr $COUNT + 1` done
- 704 名前:login:Penguin mailto:sage [2008/02/25(月) 18:12:29 ID:pu40lUxS]
- done < <(head -1 /dev/tty) とか、絶対おかしいよこれ。
違う言語で書き直したほうがいい。
- 705 名前:login:Penguin mailto:sage [2008/02/25(月) 18:17:46 ID:fTf5K0mT]
- おおすげええΣ
ちょっとテストしてみます!
- 706 名前:login:Penguin mailto:sage [2008/02/25(月) 19:20:15 ID:pu40lUxS]
- #!/bin/sh
# askdelete.sh -- find . | finddup.sh | askdelete.sh TMPF=`mktemp /tmp/askdelete.XXXXXX` trap 'rm -f $TMPF' 0 1 2 3 15 CURHASH= COUNT=0 (cat; echo DUMMYHASH /dev/null) | while read -r HASH FILENAME; do if [ "$CURHASH" ] && [ "$CURHASH" != "$HASH" ]; then echo "------------------------------" echo "$COUNT 件の一致ファイル:$CURHASH" tail -n $COUNT $TMPF echo "------------------------------" tail -n $COUNT $TMPF | while read -r FILENAME; do [ $COUNT -eq 1 ] && break echo -n "$FILENAME を削除しますか? [yN] " while read ANSWER; do case "$ANSWER" in [yY]) echo rm "$FILENAME" COUNT=`expr $COUNT - 1` ;; esac break done < /dev/tty done COUNT=0 fi echo $FILENAME >>$TMPF CURHASH=$HASH COUNT=`expr $COUNT + 1` done すこしよくなった 参考になる www.nurs.or.jp/~asada/FAQ/UNIX/section3.8.html
- 707 名前:login:Penguin mailto:sage [2008/02/25(月) 20:58:36 ID:NDOa2UbC]
- 理想的な流れだ。
- 708 名前:login:Penguin mailto:sage [2008/02/26(火) 01:26:57 ID:Knz7qJ2h]
- >>706
サブシェルをわざわざ使う必要は無いのでは? --- (cat; echo DUMMYHASH /dev/null) | +++ { cat; echo DUMMYHASH /dev/null; } |
- 709 名前:login:Penguin mailto:sage [2008/02/26(火) 01:31:17 ID:V2S90oTo]
- こんなのじゃ駄目?
find . -type f -print | xargs md5sum | sort | while read i do set -- $i test -e .$1 && rm -i $2 touch .$1 done 削除して残りが1つなら消さずに次、ということは最初の1つは 無条件で残して、2つ目以降についてのみ rm -i で削除確認すれば いいんだよね? 記憶用に .<md5sum> なマーカ作ってるけど、ここは md5sum な ダミー環境変数の方がいいかも。
- 710 名前:login:Penguin mailto:sage [2008/02/26(火) 08:30:35 ID:V4Ca66lJ]
- >>709
全ファイルにmd5sumしたら遅くならない?
- 711 名前:login:Penguin mailto:sage [2008/02/26(火) 08:46:21 ID:M2OUW+0j]
- >>708
パイプを使うと結局はサブシェルが起動されるんだから () のほうがわかりやすいと思うよ
- 712 名前:login:Penguin mailto:sage [2008/02/26(火) 09:53:07 ID:jk2VB7eG]
- >>710
どうせシェルスクリプトなんて使い捨てなんだし 多少遅くてもいいんじゃない? 実行時間の長さより 思いついたことをちゃちゃっと実行できる手軽さが大事でしょ。
- 713 名前:login:Penguin mailto:sage [2008/02/26(火) 10:56:04 ID:V4Ca66lJ]
- >>712
もっともな意見だと思うが、肝心なことを棚に上げてるな シェルスクリプトの本質は処理を効率化するための機能なんだから、 手軽に加えて「より早くスマートに処理」できる方がいいだろうよ どうせ使い捨てとか言い出したら、いつまで経っても遅くて低機能なスクリプトしか書けないぜ? まあせっかくいい方向で流れてるから、俺も最適化してみるか。
- 714 名前:login:Penguin mailto:sage [2008/02/26(火) 15:09:02 ID:KrvpwwSS]
- 手作業で30分かかる作業を、わずかワンライン5秒で済ます。
どうよ、この快感、すごいよ、俺!! ただしスクリブト書きに3時間かかるけどなっ!!、 みたいな・・・・
- 715 名前:login:Penguin mailto:sage [2008/02/26(火) 15:18:25 ID:jk2VB7eG]
- 5分で書いて実行時間3分にできればそれでおkだよな。
その作業を200回繰り返さなきゃいけないなら 3時間かけて書いて5秒に短縮してもいいけど、 そういうのはシェルじゃなくて別な言語を使った方がいいと思う。
- 716 名前:login:Penguin mailto:sage [2008/02/26(火) 16:04:42 ID:V4Ca66lJ]
- >>714
良いスクリプトを早く書けるスキルを養うといった考えはないのかよw まぁ価値観が違うなら仕方ないが >>715 言いたいことは分かるし仕事では俺も同じスタンスだ。モトが取れない作業をするのはアホだと思う。 さらに>>1にあるようにPerlやPythonを使ってもいいと書いてあるように、別にシェルスクリプトに固執はしてないさ。 ただID:fTf5K0mTみたいに質問を丸投げせずに分かってないながらも自分で試してみている奴も居るんだから 「どうせ使い捨て」や「パンがなければケーキを」じゃなくて、しっかりした見本を見せてやろうぜw・・・と思ったんだ。 勝手に限界を作っちゃダメさ・・・!
|

|