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/
601 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/14(土) 03:03:51 ] 必死だなw
602 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 10:11:52 ] >>599 只の知ったかだろ 半角数字とか学生の分際で早くも理系気取りかよ
603 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 10:44:29 ] >>602 日本語で頼むわ……
604 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 20:00:12 ] > 半角数字とか学生の分際で早くも理系気取りかよ これは新コピペになりそうな気がする
605 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 01:23:51 ] >>604 新コピペとか学生の分際で早くも理系気取りかよ …こんな感じ?
606 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 02:02:27 ] bashを使用しています。 数字が入っている変数に3桁毎にカンマを入れる方法が分かりません。 どうやれば3桁毎にカンマを入れれるようになりますか?
607 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 12:27:50 ] >>606 printf "%'d" "$var"
608 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:05:46 ] >>607 これはいいことを聞いたと、試してみたができないぞ? $ bash --version GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)
609 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:13:00 ] >>608 varの中にちゃんと数字入れてるか?
610 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:17:56 ] >>607 では printfの書式に改行が入ってないから、 シェルのプロンプト設定によってはprintfの出力をプロンプトが上書きしてしまう とエスパー。 それとは別に、zshの内蔵printfでは動作しないね。
611 名前:606 mailto:sage [2009/11/21(土) 23:23:18 ] >>607 さん 有難うございました。ウチの環境ではうまくいきました。
612 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 14:57:44 ] $ printf "%'d\n" "123456" 123456 $ var="12345667" $ printf "%'d\n" "$var" 12345667 なにがいけないのかねー
613 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 17:20:06 ] $ printf "%aqd\n" "123456"
614 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 17:29:35 ] >>612 localeの設定じゃない? printf(3)によると、 >>printf("%'.2f", 1234567.89); >>results in '1234567.89' in the POSIX locale, in '1234567,89' in the nl_NL locale, >>and in '1.234.567,89' in the da_DK locale.
615 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 00:52:46 ] >>614 ロケールの問題でした。ありがとう。 ちょっと気になるのは、printfコマンドする時に LC_ALLを明示的に与えても上手く動作しなかったんですよね 組み込みコマンドだと伝わらないのかな? $ locale LANG=ja_JP.eucJP LC_CTYPE="ja_JP.eucJP" LC_NUMERIC=C LC_TIME=C LC_COLLATE="ja_JP.eucJP" LC_MONETARY="ja_JP.eucJP" LC_MESSAGES=C LC_PAPER="ja_JP.eucJP" LC_NAME="ja_JP.eucJP" LC_ADDRESS="ja_JP.eucJP" LC_TELEPHONE="ja_JP.eucJP" LC_MEASUREMENT="ja_JP.eucJP" LC_IDENTIFICATION="ja_JP.eucJP" LC_ALL= $ LC_ALL=da_DK printf "%'d\n" "123456789" 123456789 $ LC_ALL=da_DK bash $ locale LANG=ja_JP.eucJP LC_CTYPE="da_DK" (省略) LC_ALL=da_DK $ printf "%'d\n" "123456789" 123.456.789
616 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 06:55:47 ] $ printf "%'d" "123456789" printf: %': invalid directive
617 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 13:08:26 ] >>615 >>$ LC_ALL=da_DK printf "%'d\n" "123456789" LC_ALL を LC_NUMERIC にしてもダメ?
618 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:32:07 ] (優先される)強さは、 強 LC_ALL > LC_個別 > LANG 弱 のはずだから、LC_ALL があってダメなら LC_NUMERIC でもダメな希ガス。
619 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:44:54 ] >>617 ダメでした。 というかlocale(7)に書いてあるロケールの決定順序を見る限り $ LC_ALL=da_DK printf "%'d\n" "123456789" で動かなければ、LC_NUMERICを使っても同じなのではないかと。 ところで、 $ LC_ALL=da_DK locale の結果は$ LC_ALL=da_DK bashで作ったシェル上でlocaleした (参考>>615 の2個目のlocale)のと同じ結果になります。 (つまりLC_ALLも、LC_NUMERICもda_DK) その癖に、 $ LC_ALL=da_DK printf "%s\n" "$LC_NUMERIC" と $ LC_ALL=da_DK echo "$LC_NUMERIC" はどちらも「C」が出力 (参考>>615 の1個目のlocale)になるんですよね。LC_ALLはもちろん、改行のみです。 環境変数の伝わり方が変ですよね? つまり、 localeだとLC_ALL(もしくはLC_NUMERIC)がexportされてて、 printfとechoはexportされない。 それと、 >>615 で「組み込みコマンドだと・・・」といいましたが、 $ type -a echo したら、builtinと/bin/echoの2つのエントリがあったので、 どちらも試してみましたが、exportされませんでした。 どういうメカニズムでこうなっちゃうんでしょう。
620 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:54:16 ] >>618 とレスが一部被ってしまった 連レスですみませんが、 コマンドの前に環境変数定義をつけるシンタックスって なんという名前で呼ばれていますか? そもそもどういうものなのかを調べたいのですが、ググりづらくて。
621 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 16:04:31 ] >>620 shじゃなくてbashのマニュアルで申し訳ないが、 A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. だそうな。 optional variable assignments (省略可能な変数代入)
622 名前:608,612,615,619 mailto:sage [2009/11/23(月) 18:22:28 ] >>621 ありがとう。man bash読みました。 組み込みコマンドでの、optional variable assignmentの挙動についてまとめてみました。 COMMAND EXECUTION ENVIRONMENT節に以下の記述があります。 When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate execution environment つまり組み込みコマンドはseparate execution environmentで呼び出されない。 これは当たり前のことで、組み込みコマンドは別シェルで実行されないということですよね。 そして個人的に新たに知ったのは、optional variable assignmentは別シェルにしか 伝えられないということです。(現在のシェル変数には代入されない) だから、>>615 で $ LC_ALL=da_DK printf "%'d\n" "123456789" がコンマ区切りにならなかったんですね。 だったら、敢えてシェル変数を伝えられた実行環境を作って、printfするとどうなるか。 #include <stdlib.h> int main() { system("printf \"%s\n\" \"$LC_NUMERIC\""); system("printf \"%'d\n\" \"123456789\""); return 0; } をコンパイルしたa.outに対して試してみました。 (a.outは組み込みコマンドではないので別シェルで実行され、 optional variable assignmentが伝えられる)
623 名前:608,612,615,619,622 mailto:sage [2009/11/23(月) 18:25:17 ] $ ./a.out C 123456789 $ LC_NUMERIC=da_DK ./a.out da_DK 123.456.789 $ LC_ALL=da_DK ./a.out C 123.456.789 となりました。 >>615 の後半のようにLC_ALL=da_DK bashで環境作ってからやる方が楽なので、 本末転倒になりましたが。。。 ところで、これで興味深いのは、LC_ALLはLC_NUMERICに影響を及ぼさないことです。 >>615 では LC_ALL=da_DK bash 後にlocaleすると、LC_ALL=LC_NUMERIC=da_DKになりますが、 bashの初期化処理でLC_ALLの値をLC_NUMERICにコピーしているのかも? 最後に。619の訂正。 SIMPLE COMMAND EXPANSIONの節の 4.にあるように、 parameter expansionされてからコマンドが実行されるようなので、 $ LC_NUMERIC=da_DK printf "%s\n" "$LC_NUMERIC" はコマンドが実行される前に引数の$LC_NUMERICが「C」(参考>>615 )と展開される。 そのため、Cが表示される。 長文失礼しました。
624 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 18:52:34 ] 組み込みコマンドがseparate execution environmentで呼び出されないのは bashの場合の話。 kshでは組み込みコマンドでもseparate execution environmentで動作する。
625 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 19:12:34 ] やはり、sh系といえども、何を使っているかは明示すべきなんだな。
626 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 19:17:36 ] 確かにその通りですね。 上は全部>>608 の環境で試してた。
627 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 14:47:50 ] "aa-1125.txt" "aa-0001.txt" "aa bb-1125.txt" "aa bb-0001.txt" "aa bb cc-1125.txt" "aa bb cc-0001.txt" 同じディレクトリにこの6ファイルがあるとします。 この中から「aa bb-????.txt」の形式で且つ最も新しいファイルを 探したいんですが、 (当然のことですが)ls -ltr "aa bb-????.txt"|tail -1とやるとエラーになってしまいます。 どうすればいいでしょうか?シェルはbashです。
628 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:01:32 ] ls -ltr (ここに6個のファイル名を羅列)|tail -1
629 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:01:41 ] ls -lt aa\ bb-????.txt | head -1
630 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:14:14 ] bbの無いファイルもあるぞ
631 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:28:45 ] あるよ だから?
632 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 15:49:56 ] 申し遅れましたが、 実際にはファイル数、ハイフンより前の部分のファイル名は不定です。 >>627 は単純化した例です。 >>627 の時点で知りたかったことは自動でエスケイプする方法もしくはそのコマンドです。
633 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 16:00:11 ] 一体何がしたいんだよ 何とマッチさせたいんだ?
634 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 16:07:04 ] >>627 の下から2行めをエスケイプしたものが >>629 なわけですが、(実質的に) そのようなことをスクリプト内で自動でおこないたいということです。 sed,awkを使うのかなと思いますが、インタラクティブだと[tab]キーを押すと できるようなことなので、bash内部でも出来ないかなとも思います。
635 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 16:13:40 ] ハイフンより前にスペースが含まれていようがいまいが *-????.txt で>>627 の6ファイル全てにマッチするんだけど それで何か困るのか
636 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 17:03:15 ] unix超ど素人です。 本を参照しても見つからないので、 質問させてください。 ちなみにここで推奨されてないcshを使っています。 例えば80.0というように小数点がある数字を 80といった整数に書き直すスクリプトをつくりたいのですが、 うまくいきません。 #!/bin/csh set y_info = 80.0 echo int($y_info) > aaa.dat どうすれば解決できますでしょうか?
637 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:23:05 ] 解決の第一歩は、cshを捨てる事だ。
638 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:24:52 ] >>627 スペースだけをクォートすればいい。シングルクォートの方がお勧め ls -ltr ??' '??-????.txt | tail -1
639 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:30:24 ] >>636 cshは捨てさせていただくので、shでどうぞ。 #!/bin/sh y_info=80.0 printf '%.0f¥n' $y_info
640 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:10:12 ] >>636 cshなら拡張子を削る機能が組み込まれてるので、 悪くないチョイスだよ #!/bin/csh set y_info=80.0 echo $y_inf:r > aaa.dat なんと :r を付けるだけで小数点以下を削れるんだぜ
641 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:11:11 ] echo $y_info:r > aaa.dat のミス
642 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:13:04 ] あと、csh スクリプトは #!/bin/csh -f にした方がなにかと幸せ
643 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:30:51 ] >>640 それだと、 .5 みたいに頭の 0が省略されてる小数で誤動作する。
644 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:34:08 ] >>640 (数値じゃなく)拡張子とみなして削る方式なら shでもできる。 #!/bin/sh y_info=80.0 echo ${y_info%.*} csh(笑)の出番なし。
645 名前:636 mailto:sage [2009/11/26(木) 21:13:03 ] >>640 うまくいきました トンクス 他の方もレスありがとうございます シミュレーションで得られたデータを出力する際にスクリプトを使用しています。 周りがcsh使ってたので、それを使ってましたが、 shの方が問題点が少なそうなので、 そっちにシフトしてみようと思います。
646 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 21:16:33 ] 半導体屋か? あいつら何でcsh好きなんだ?
647 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 21:19:13 ] >>640 だと四捨五入されない。>>639 がお勧め。
648 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 11:45:22 ] 以前にcshで作って、それですんでりゃそうなるだろう。
649 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:14:17 ] tcsh以外に便利なインタラクティブシェルがなかった時代の負債といえようか
650 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:33:23 ] ちょっとしたスクリプトの場合、cshの方が書きやすい場合もある。 四則演算が出来るとか配列が使えるとか、要はケースバイケース
651 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:38:06 ] >>650 四則演算も配列も、今時のsh(系)でできる。
652 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:46:50 ] ケースバイケースでcshスクリプトなんて混ぜられちゃ迷惑だ
653 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 13:18:36 ] コピペで数千行を超えるのcshスクリプト作るんだぜ。 ちょっとしたを遥かに超越している。
654 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 13:23:31 ] 実績があります、とか言ったりなんかしちゃったりして
655 名前:名無しさん@お腹いっぱい。 [2009/11/28(土) 17:21:38 ] UNIXド素人です。 手詰り状態なのでアドバイス頂けると幸いです。 ◆処理内容 Aディレクトリから、Bディレクトリにファイルをコピーする。 (コピーオプション:-p -f) ◆コピー条件 Bディレクトリのファイルの更新時間とAディレクトリのファイルの 更新時間が異なる場合。 ◆その他 更新時間が異ならない場合は、エラーとし、1を戻り値とする。 上記のようなスクリプトを作成したいのですが どのような処理にしたらよろしいのでしょうか?
656 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 18:05:43 ] 書いてあるとおりに処理しよう
657 名前:655 [2009/11/28(土) 18:21:04 ] すいません。。 意味わからない質問になっていました。。 やり方がわからない処理は「更新時間を比較する」点です。 お互いの更新時間を変数に入れ、同じ場合と違う場合で処理を決めれば いいことはわかるのですが、更新時間を比較することなどできるので しょうか?
658 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 18:23:44 ] >>655 要点だけ書くよ。 if [ "$file1" -nt "$file2" ]; then cp -pf "$file1" "$file2" fi
659 名前:655 [2009/11/28(土) 18:43:33 ] >>658 ありがとうございます。 ファイルが更新された場合、サイズや更新時間で比較するしかないと思われるのですが 更新時間や、ファイルの詳細?を変数に格納することは可能なのでしょうか?
660 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 18:47:33 ] >>659 md5sumとかでハッシュ値を見たら?
661 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 18:54:17 ] >>659 せっかく回答もらってるのに意味をちゃんと理解しろよ。 [ A -nt B ] ってやったら、これで更新時間を比較してるんだよ。 別に更新時間を変数に入れる必要なんかない。 -nt は、"newer than" ね。
662 名前:655 [2009/11/28(土) 19:16:35 ] >>658 >>661 そういうことですね!! ファイルの更新時間ではなく、ファイル自体を比較すればいいのですね!! 理解力が無く、ご迷惑おかけいたしました・・・ アドバイスを参考にスクリプトを作成してみたいと思います。 ありがとうございました。
663 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 19:19:11 ] >>662 違うよ。 ファイル自体なんて比較してない。 更新時間を比較してるの。 if [ fileA -nt fileB ]; then ... ってやると、fileA と fileBの更新時刻を比較して、 その結果で動作が決まるんだよ。 fileA/fileBの中身は読んでない。
664 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 19:23:46 ] hashinfo.com/
665 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 19:28:45 ] md5sumとかハッシュとか言ってる回答者の言うことはここでは無視しとけ。 単純にシェルスクリプトから [ ] (testコマンド)で時刻比較できるんだから。
666 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 19:33:06 ] >>662 は日本語読解力からしてダメだな。
667 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 19:36:34 ] 更新時刻が異なる場合、なのに、newer than だけでいいんだろうか
668 名前:655 [2009/11/28(土) 19:36:40 ] >>663 少し調べてみましたところ、ファイルのタイムスタンプ、つまり更新時間 を比較しているのですね。 ファイルの比較には -nt -ot の2種類があるようですが "="や"!="で比較することは無理と理解してよろしいのでしょうか?
669 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 19:42:39 ] >>667 だから>>658 は「要点だけ」って言ってるんだよ。 せっかく >>668 が -nt と -ot を調べたんだから、 それを -o すれば 時刻の "!=" を条件を記述できることに気づくはず。
670 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 21:50:23 ] >>668 > ファイルの比較には -nt -ot の2種類があるようですが >>663 を読み直せ…
671 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 22:22:24 ] rsync 使え、で終わる気がする
672 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/29(日) 00:01:55 ] >>668 > "="や"!="で比較することは無理と理解してよろしいのでしょうか? そう考えていいよ。「異なる場合」って言ってるんだから、 「「新しい場合」または「古い場合」」 っていう条件が必要なんでしょ? それぞれ>>663 の書式を使って-ntと-otでできるよ。君の言うとおりだよ。 あとは二つをつなぐ「または」を調べてみてごらん。>>669 もそう言ってるけどね。 >>671 俺もそう思う。
673 名前:655 [2009/11/29(日) 00:32:15 ] >>672 if [ FILE1 -nt FILE2 -o FILE1 -ot FILE2 ] ; then cp -p -f … exit 0 else exit 1 fi とすればいいのですね! >>658 >>663 そこまで読み取ることができず、ご迷惑おかけいたしました。。
674 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/04(金) 21:09:44 ] $ echo "aaa.kp//////a/bbb//ccc///ddd///// " | sed -e 's@//*@/@g' -e 's@http:/@@g ' aaa.kp/a/bbb/ccc/ddd/ 一応目的の動作は達成しているのですが、sedがマヌケです。 もうちょっと素敵な方法はありますか?
675 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/04(金) 21:32:24 ] >>674 echo 'aaa.kp/a/bbb/ccc/ddd/ '
676 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/05(土) 00:35:32 ] sed -e 's@\([^:]\)//*@\1/@g'
677 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/05(土) 00:49:25 ] マジキチ
678 名前:名無しさん@お腹いっぱい。 [2009/12/05(土) 19:23:28 ] 複雑多数のサブディレクトリを持つディレクトリAを複製したい 但し、いくつかのサブディレクトリについては複製対象外としたい。 現状以下のようにやってます。 cp -rp A B rm -rf B/a/b/c rm -rf B/bb/aa/cc ・・・消したい対象分ひたすら羅列。 サブディレクトリ内のサイズが大きく、cp,rmで余計な時間が掛かってしまいます。 AをBとして複製する場合に、「このサブディレクトリ以外すべてコピー」 またいな記述方法はありますでしょうか? sh,bashでお願いします。
679 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/05(土) 19:40:24 ] cd A tar cf - . --exclude a/b/c --exclude bb/aa/cc | tar xf - -C /path/to/B
680 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/05(土) 19:49:17 ] >>679 なるほど、tarのアーカイブファイルを経由させるのですね。 ありがとう。やってみます。
681 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/05(土) 22:18:32 ] find . -print |egrep -f exlude-pattern-file |cpio -pumd destdir さらに、コピーでなくてハードリンクで済ませられるなら、高速、省スペース。 find . -print |egrep -f exlude-pattern-file |cpio -pumdl destdir
682 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/05(土) 23:09:18 ] ありがとう。一考してみます。
683 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/06(日) 23:26:04 ] >>676 規制で書けかなった。ありがとう。
684 名前:名無しさん@お腹いっぱい。 mailto:sega [2009/12/10(木) 10:18:03 ] findの判別式を単独のファイルに適用して、真偽値だけほしいんだけど どうしたらいい?
685 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 10:27:52 ] 例えば [ -n "`find /path/to/file -mtime 7 ...`" ] みたいな感じか?
686 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 10:34:08 ] いや、 find /path/to/file -mtime 7 2> /dev/null; echo $? だろ。
687 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 10:39:11 ] ファイルが正常に処理されれば、判定結果にかかわらず戻り値はいつも0だよ
688 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 10:42:01 ] >>686 マッチしてもしなくても$?は0なのよ >>685 なるほど文字列の長さを見るのか とりあえずこれでやってみるわ超サンクス
689 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 19:44:25 ] 他サーバ上のtar.gzファイルを解凍する方法はないでしょうか?
690 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 20:28:24 ] sshとか可能なら普通に解凍できるから、そうじゃない質問だとして、 エスパー募集だな
691 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 20:55:52 ] >>690 たとえばftpで他サーバに接続して、gzip -cd | tar xvf - のようなことはできないでしょうか?
692 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 20:59:06 ] >>691 wget ftp://user:pass@他サーバ/path/to/hoge.tar.gz -O - | tar zxvf -
693 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 21:08:14 ] >>692 ありがとうございます。 ちょっと試してみます。
694 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/12(土) 13:37:48 ] v6shell.org/ にてるような、変わっているような。
695 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 13:17:58 ] すみません、スクリプト内で使用されている変数について教えてください。 使用しているOSはCentOS5.3です。 今、勉強がてら/etc/init.d/functionsを読んでいるのですが、 functions内で使用されている変数$LSBの意味がわかりません。 使用例 :[ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] のように記述されています。 例えば、上記例の$BOOTUPは、/etc/sysconfig/init内で定義されているのを確認できました。 しかし$LSBは/etc/sysconfigや、/etc内のファイルをざっと検索してみても大本の定義が発見できません。 setにもenvにもありません。 $LSBは、意味ありげに見えるだけで、単になんでもない、普通の変数なんでしょうか? それとも、ちゃんとどこかで定義されているんでしょうか? もしかしたら、変数ではなく別のものなんでしょうか? しょうもない質問で申し訳ありませんが、ご教授ください。よろしくお願いします。
696 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 14:00:20 ] 教授はあげません。
697 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 14:33:04 ] Linux Standard Base準拠なら定義しておく、ってやつかな?
698 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 15:05:57 ] 「ご教授」で正しいんだよ。
699 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 15:28:33 ] そして、それに対する>>696 の返しは絶妙だったな。
700 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 15:42:03 ] いや、正しくない。 「教授する」というのは体系だててきちんと教えるという意味なので、 どこの馬の骨かわからない匿名掲示板の単発質問者には「教授」しない。