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


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

シェルスクリプト相談室



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 ]
>>967san
有難うございます!今試せないので明日、速攻でやってみます!





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
・空白のあるファイル名の扱い
・日付の出力形式の仮定
に問題。








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

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

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