1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ] シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。
910 名前:デフォルトの名無しさん [2008/05/29(木) 23:13:02 ] tarファイル内のデレクトリとかファイルをリネームできる? あるいはリネームしながら展開できる?
911 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:05:16 ] >>910 スレ違い。アーカイバ関連のスレで訊くべし
912 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:17:12 ] この板的には、tarのフォーマットを調べて、 リネームするツールを作ろうという趣旨かも。 しかしスレ違いか。
913 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:42:54 ] 特定の名前対応付けファイルにしたがって、 一旦目的のファイル/ディレクトリを展開して mvで目的の場所にリネーム移動させるものを つくるというスクリプトならかろうじて・・・ そこまでの意図はないと思うが。
914 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:51:43 ] ヘッダー情報だけ書き換えて展開は本物のtarにやらせれば良い。 前の勤務先で作ったときは50行(perl)くらいで出来たような気がする。
915 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 20:04:48 ] 文字列中のスペースをエスケープシーケンス付けて"\ "に変換する スクリプトを作りたいのですが、どうしたら良いでしょう? sed を使うと連続スペースを 1つのスペースとして扱われてしまい上手く行きません。 "sample sample"(スペース2以上) っていう文字列を "sample\ \ sample"にしたい。
916 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:28:33 ] ~$ echo "sample sample" | sed -e 's/ /\\ /g' sample\ \ sample
917 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:44:45 ] >916 あれ、それで行きます?ってか家のCygwin上でも出来てるな これでも出来なくて、2〜3時間いろいろ試して、うんうん唸ってたんですが、 バージョンや処理系で動作がちがうとかないですよね・・・ 月曜にリトライします。なんか馬鹿やったかな?
918 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:51:54 ] >>917 gが付いてなかったんじゃないのか?
919 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 23:25:04 ] いや、そういうのではなく、記憶が確かなら echo "sample sample" | sed -e 's/ /:/g' (sampleの間は連続半角スペースね) ってやったら、 "sample:sample" スペースを一つとして扱われた みたいな結果しか帰ってこなかったんだけど。 何かを間違えたんだろうね多分。なにを間違えたやら。
920 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:59:01 ] ubuntu@ubuntu-desktop:~$ echo "sample sample" | sed -e 's/ */:/g' sample:sample
921 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 03:01:29 ] 勘違いす。>>920 は消去。
922 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 03:30:54 ] #!/usr/bin/fontforge 仲間に入れてもらえますか?
923 名前:デフォルトの名無しさん [2008/06/04(水) 22:42:10 ] 相談に乗ってちゃぶ台! 任意のディレクトリ下の全てのファイルの更新日時を フルパスで1行づつ取得したい。また更新日時をyyyymmdddHHMMSSで 取得したい。 例) /home/usr01/aaa/bbb.txt 20080101125525 /home/usr01/aaa/ccc.tar 20080123195530 /home/usr02/ddd.txt 20070811210121 /home/usr03/eee/fff/ggg/hhh/jjj.cfg 20060301042133 よろしくお願いします、みなさん
924 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:14:40 ] 簡単すぐるからパス
925 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:59:00 ] OSによっては簡単すぐるけど、一般にはそうでもないし、perlが最適だったりもする >>923 OSを明かした方が適切な回答があるかもよ
926 名前:デフォルトの名無しさん [2008/06/05(木) 00:09:17 ] > 924,925 レス、さんく とりあえず find でフルパスは取得できよ。 あと、タイムスタンプなんだよね。 OSはAIXでkshでつ
927 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:22:49 ] AIXは、statもないし、lsに-Tもないんじゃないかな。 テキストファイルだけなら diff -c で /dev/null と比較して、 先頭の行を加工すれば何とか取得できるかもしれない。 けど、perl をすすめる。
928 名前:デフォルトの名無しさん [2008/06/05(木) 01:39:28 ] >927 ありがと よく似たコマンドでistatってのがあったけど 月表示が英語なのよ・・・ $ istat bbb デバイス 10/8 上の Inode 89 ファイル 保護 : rw-r--r-- 所有者 : 8(*****) グループ : 0(system) リンク・カウント : 1 長さ 4 バイト 最後の更新: Thu Jun 5 01:35:24 JST 2008 最後の修正: Thu Jun 5 01:35:24 JST 2008 最後のアクセス: Thu Jun 5 01:35:24 JST 2008
929 名前:デフォルトの名無しさん [2008/06/05(木) 02:12:17 ] ひとつ教えてください。 ファイルからデータを収集して txtファイルに出力するようなシェルを作成しているのですが 整形がうまくいきません。 touch test.txt echo "ABCDEF 1_0_2_3" >> test.txt echo "LMN 3_2_4_5" >> test.txt 当然中身は ABCDEF 1_0_2_3 LMN 3_2_4_5 となるんですが ABCDEF 1_0_2_3 LMN 3_2_4_5 としたいんです。 何かいい方法ありませんか? tabのような整形方法を考えたんですがうまく揃わないので 文字数指定する方法あれば教えていただきたいんですが。。。 (C言語のprint文での %10s のようなのができれば理想ですが)
930 名前:デフォルトの名無しさん [2008/06/05(木) 02:12:56 ] ずれーたorz 番号のところが揃うようにしたいです。 ご教授ください。
931 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:14:20 ] なら、12種類しかないんだから、caseで分岐して、 一致した月の数字を返すっていう関数書けばいいんじゃ?
932 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:20:01 ] >>929 OSによっては、まさにprintfがあるけどな。
933 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:24:10 ] # echo "ABCDEF 1_0_2_3" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" > test.txt # echo "LMN 3_2_4_5" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" >> test.txt # cat test.txt ABCDEF 1_0_2_3 LMN 3_2_4_5
934 名前:デフォルトの名無しさん [2008/06/05(木) 02:24:20 ] ファイルの比較するシェルを作りたいのですが、 うまくいきません。 file_list.txt -- 内容 -- ABC DEF GHI このファイルとフォルダ内の内容が一致するかチェックしたいのですが 何かいい方法ありませんか? ls -Rをtxtファイルに吐き出してcmpを使う方法と read line使った後ls -Rとgrepをつかって比較する方法を思いついたのですが、 もっと綺麗な方法ってあるでしょうか?
935 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:25:25 ] busyboxにprintfあったよ・・・・・orz
936 名前:デフォルトの名無しさん [2008/06/05(木) 02:28:49 ] >>932 マジですかorz 調べたりなさ杉。ありがとうございます。 >>933 今現在確認できないので研究室についたら試してみます ありがとうございました。
937 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:35:12 ] おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。
938 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 04:38:56 ] Cに似たシェルスクリプト言語ってある?
939 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:29:08 ] cshでスクリプトは書くな
940 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:41:31 ] 外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、 かなりいや。
941 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:05:21 ] while read Filenm do if [ -e $Filenm ] ; then echo $Filenm" ○" else echo $Filenm" ×" fi done <file_list.txt
942 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:45:57 ] cat file_list.txt | group { Test-Path $_ }
943 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:47:16 ] >>940 どうして?
944 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:28:20 ] インタープリタ言語はスレ違いでしたね スレタイがシェルスクリプトだもんな すっかり勘違いしてた
945 名前:デフォルトの名無しさん [2008/06/07(土) 18:48:20 ] cpioのマルチボリューム保存で1本目が終わると 2本目の前にデバイス名の入力を施すメッセージが表示されます。 その際、そのメッセージ(多分、標準エラー出力)を表示させないで 自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。 標準エラー出力をどう扱うかが肝だと思うのですが、良いアイデアが浮かびません。 何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))
946 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:35:53 ] つ expect
947 名前:デフォルトの名無しさん [2008/06/16(月) 11:34:15 ] #!/bin/csh -f set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t exit 0 echo ------------------ 以上を改良しろ、と言われました。みなさんならどうしますか?教えて下さい。
948 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 11:47:55 ] #!/bin/csh -f tail +$1 $3 | head -$2
949 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:01:05 ] rm -f /bin/csh
950 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:49:14 ] >>949 Permission denied
951 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:14:52 ] 以下のスクリプトで echo をした時に AAAeo kakikukeko sasisuseso AAAituteto naninuneno hahihuheho と表示されるのですが どうすれば tatituteto naninuneno hahihuhehoAAA と表示できるのでしょう? 環境は実行シェルはbashです FUGA="'AAA'" awk '{print;}' hoge.txt | while read LINE; do MOGE=`echo "$LINE" | cut -d , -f 2-` echo "$MOGE""$FUGA" done hoge.txt a,aiueo kakikukeko sasisuseso b,tatituteto naninuneno hahihuheho
952 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:55:37 ] >>951 やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。 つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?
953 名前:951 mailto:sage [2008/06/16(月) 15:09:30 ] >>952 レスありがとうございます やりたい事としては ファイルから1行読み込んで1行をパースし FUGAと連結した文字列を別のコマンドを実行させたい です 1行の内容としては aaaaa,hogehoge mogemoge aiueo という風に書きましたが実際には aaaa,SQL文 という感じで半角スペースやカンマが入ります
954 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:16:15 ] >>953 他人の話をよく聞きなさいって言われたことないか? >952をよく読んで、為すべきことを為してから出直せ。 それから、自分の書いた文章を読み返す癖をつけた方がいい。 とてもじゃないが、他人に読んでもらう文章になっていないぞ。
955 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:48:40 ] >>954 >>952 に書いてある内容は理解しています MOGE=`echo "$LINE" | cut -d , -f 2-` の代わりとなる部分だと言うことは解っているのですが >>953 にも書いてある通りカンマ等が入ってしまう為記述が簡単な MOGE=`echo "$LINE" | cut -d , -f 2-` を選びました 951にカンマ等が複数入る可能性があるという事を 書かなかったのはすみませんでした
956 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:11:07 ] cut -d',' -f2-
957 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:18:10 ] ~> L="123,uio poi" ~> LB=`echo $L | cut -d',' -f2-` ~> echo $LB uio poi ~>
958 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:05:34 ] 違ったか・・・
959 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:03:53 ] tr -d '\015' < hoge.txt | awk ...
960 名前:デフォルトの名無しさん [2008/06/17(火) 11:26:10 ] #!/bin/csh -f set com=$0 if ($#argv < 1 || $#argv > 3) then echo Usage:$com start_line total_lines '[file_name]' exit 1 endif if ($#argv == 2) then set s=$1 set t=$2 tail +$s | head -$t else set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t endif exit 0 echo ------------------ これだとエラーがでます。どなたか改良してください。お願いします。
961 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 11:27:38 ] 酷いマルチ
962 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:28:46 ] bashで while read LINE; do echo $LINE done < ファイル とするとファイルに含まれてるタブ文字が 半角スペースに変換されて表示されるのですが そのまま取り出したい場合どうすればいいのでしょう? cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました
963 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:57:10 ] echo "$LINE"
964 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 14:05:16 ] >>963 うまくいきました ありがとう そんな単純な事に気づかなかったとはorz
965 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:30:18 ] KORNシェルの質問です。よろしくお願いします。 テキストファイル id=tanaka age=25 id=takahashi age=2 id=suzuki age=44 を id age --------------------- id=tanaka age=25 id=takahashi age=2 id=suzuki age=44 にしたい(体裁を整えたい)です。$@を使ってできますか? 変数wkにabc=e があったとして、=があるかどうかわかりますか? grepやcutコマンドは変数を対象に使えませんよね・・?
966 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:42:13 ] 訂正です。体裁が整ってない。 idなら10文字以下でもスペースで10文字にして(これはtypedef使いました) =の前を見出しに出力して、=の後を----の下に書きたいんです。 id age --------------------- tanaka 25 takahashi 2 suzuki 44 よろしくお願いします
967 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:25:03 ] IFS="=$IFS" FIRST=t while read line do set -- $line if [ "$FIRST" ] then printf "%-10s %s\n" "$1" "$3" echo "---------------------" FIRST= fi printf "%-10s %2d\n" "$2" "$4" done
968 名前:デフォルトの名無しさん [2008/06/30(月) 23:38:57 ] >>967 san 有難うございます!今試せないので明日、速攻でやってみます!
969 名前:デフォルトの名無しさん [2008/07/04(金) 23:36:23 ] 質問させてください。 diffの結果を見易く整形するツール等はありますでしょうか。 環境はCENTOSです。よろしくお願いします。
970 名前:969 mailto:sage [2008/07/04(金) 23:37:57 ] すいません。追記します。 シェルスクリプト内で使いたいので、 ツールでもコマンド的なものだとありがたいです。
971 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 00:17:24 ] diff -u
972 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 00:19:45 ] >>969 > diffの結果を見易く整形 kwsk
973 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 01:23:42 ] >972 このファイルだけサイズが違いますよとか このファイルはこっちにありませんよとかが希望です。 ls -Rlaの結果をファイルにリダイレクトしてます
974 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 07:42:01 ] ファイルの差分はいらないのね find dirA -exec wc -c {}; > /tmp/A find dirB -exec wc -c {}; > /tmp/B diff /tmp/A /tmp/B あるいは単純に diff -r --brief dirA dirB 2>&1
975 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 14:20:19 ] 私はこんなスクリプト作ってる。 -- #!/bin/sh -f DIFF="/bin/diff -u" lsd() { find $1 -type f -ls | awk '{printf("%10d %s %2s %5s %s\n", $7, $8, $9, $10, $11);}' | sort +4 } lsd $1 | sed -e "s- $1- $2-" > /tmp/$$ lsd $2 | $DIFF /tmp/$$ - rm /tmp/$$ -- これで一応ファイルサイズとタイムスタンプも比較できる。
976 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:59:08 ] >>975 ・空白のあるファイル名の扱い ・日付の出力形式の仮定 に問題。