5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【sed】シェルスクリプト総合@LINUX Part2【awk】

1 :ミスターバッシュ:2006/08/03(木) 13:10:00 ID:5dVnjkpT
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

前スレ
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。

2 :ミスターバッシュ:2006/08/03(木) 13:12:11 ID:5dVnjkpT
関連スレ
おまいら! sed の使い方教えて下さいm(_ _)m@linux板
http://pc8.2ch.net/test/read.cgi/linux/1067815570/l50
【Shell】どのシェル使ってる?【Script】@LINUX板
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
シェルスクリプト総合 その6
http://pc8.2ch.net/test/read.cgi/unix/1143302182/
sed@UNIX板
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
2ちゃん画像落としまくりスクリプト@UNIX板
http://pc8.2ch.net/test/read.cgi/unix/1003833552/
連番のH画像/動画を一気にダウンロードする2
http://pc8.2ch.net/test/read.cgi/unix/1135533382/

ログを読みたい人はこちら
http://makimo.to/cgi-bin/search/search.cgi?q=%83V%83F%83%8B%83X%83N%83%8A%83v%83g&andor=OR&sf=0&H=&view=table&all=on&shw=

3 :ミスターバッシュ:2006/08/03(木) 13:13:16 ID:5dVnjkpT
参考リンク
bashで始めるシェルスクリプト基礎の基礎 @IT
http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html
シェルスクリプト(Bash)入門 CYBERAM Documents Project
http://cyberam.dip.jp/linux_command/shellscript.html

IBM developerWorks
bash 例解
http://www-6.ibm.com/jp/developerworks/linux/000714/j_bash.html
http://www-6.ibm.com/jp/developerworks/linux/000714/j_bash2.html
http://www-6.ibm.com/jp/developerworks/linux/000714/j_bash3.html
実例でわかるsed
http://www-6.ibm.com/jp/developerworks/linux/010202/j_l-sed1.html
http://www-6.ibm.com/jp/developerworks/linux/010216/j_l-sed2.html
http://www-6.ibm.com/jp/developerworks/linux/010223/j_l-sed3.html
実例でわかるawk
http://www-6.ibm.com/jp/developerworks/linux/010330/j_l-awk1.html
http://www-6.ibm.com/jp/developerworks/linux/010413/j_l-awk2.html
http://www-6.ibm.com/jp/developerworks/linux/010622/j_l-awk3.html
コマンドラインからのグラフィックス操作
http://www-6.ibm.com/jp/developerworks/linux/031031/j_l-graf.html
洗練されたPerl: MP3とPerlで遊ぶ
http://www-6.ibm.com/jp/developerworks/linux/040402/j_l-cpmp32.html
http://www-6.ibm.com/jp/developerworks/linux/040319/j_l-cpmp31.html

4 :login:Penguin:2006/08/03(木) 14:44:47 ID:NQ3T36sk
前スレで

one
two
three

の改行を「,」に置換してつなげたいと質問したものです。
結果として、sedではなく、pasteを使って解決致しました。

$ paste -s -d , file > newfile

sedでやる方法については、結構むずかしそう(Nとか駆使)なので、
時間をかけて勉強していきたいと思います。アドバイスして下さった
方々、ありがとうございました。これからもよろしくお願い致します。

5 :login:Penguin:2006/08/03(木) 17:55:54 ID:TFA/5ZAA
>4
からかって悪いけど、前スレで「tree 」を見たとき笑ってしもうた。

6 :login:Penguin:2006/08/03(木) 21:08:32 ID:NQ3T36sk
>>5
(*・∀・)あわてて、何事もなかったように直しましたとも。

7 :login:Penguin:2006/08/03(木) 21:47:36 ID:tNhCb6YC
>>1

>>4
他のスレで拾った物だけど
sed -ne '1h;1!H;${x;s/\n/,/g;p}' file > newfile

http://pc8.2ch.net/test/read.cgi/tech/1112553783/

8 :login:Penguin:2006/08/03(木) 22:39:28 ID:NQ3T36sk
>>7
ありがとうございます。今、テストしたら完璧でした!
原理はこれから学びます。胸のモヤモヤがとれました。

9 :login:Penguin:2006/08/03(木) 23:27:57 ID:TFA/5ZAA
関係ない話だけど、
「原理」とか「摂理」とかいう比較的重い意味を持つ概念が
怖いものの代名詞というか、近づいてはならぬものに
使われる言葉となってしまったことは悲しいことだ。

なんかbashのスクリプト一発でドカンと世界中の破壊的カルトを消滅させられればいいのに・・・

10 :login:Penguin:2006/08/04(金) 00:24:00 ID:YSnXFLrG
>>9

つ find 世界中 -name カルト -exec rm {}\;

11 :login:Penguin:2006/08/04(金) 00:39:59 ID:eCSPZD0t
どんなに自分(達)だけは違うとか言い張っても
スクリプト書いてる時点で所詮はハッカー夷的カルトだろ。
つか何で又とつぜん???

12 :login:Penguin:2006/08/04(金) 00:48:36 ID:tTQk3to+
>11
んにゃ、単に「原理」→「統一協会(統一=原理)」→
「破壊的カルト」と連想が行ったので、急に
「ビンラディンとか文鮮明とかおかしな連中を一斉に消せないかしら」
と思っただけで深い意味はないわ。
スレ汚し失礼。

13 :login:Penguin:2006/08/04(金) 02:16:12 ID:hXVs7Oof
rm -f /bin/ladin

14 :login:Penguin:2006/08/04(金) 02:20:36 ID:UtLdfbE9
$ gen-riken > /dev/null

15 :login:Penguin:2006/08/04(金) 07:15:35 ID:tTQk3to+
ははは。皆さんノリが良いですねえ。

16 :login:Penguin:2006/08/04(金) 21:29:56 ID:YSnXFLrG
質問です。

カレントに apple orange pine etc というディレクトリがあり、これに
次々とログインして(出来ればetc以外)、

$ myprog

と実行したいのですが、どこから手をつけて良いのやらまったくわかりません。
わかる方、ヒントだけでも結構ですので、ご教授頂けませんでしょうか?

17 :login:Penguin:2006/08/04(金) 22:03:09 ID:YSnXFLrG
微妙に自己解決

ls -1 | sed '/^etc/d' | xargs myprog

で出来たくさいけど、美しくないです。
出来れば、これを

$ myprog

一発でやれたらなと思ってます。

18 :login:Penguin:2006/08/04(金) 22:04:26 ID:YSnXFLrG
たびたびすいません。訂正です。

>>16
誤 次々とログインして
正 次々と移動して

でした。すいません。

19 :login:Penguin:2006/08/04(金) 22:38:41 ID:dXMK20nx
>>16

for workingdir in apple orange pine etc # 「etc」がいらなきゃ削れ
do
    cd $workingdir
    myprog
    cd ..
done

ま、cd .. という流儀が気に入らないという奴がこのスレにはいるかも。
そういう奴は適当にレスつけろや。

20 :login:Penguin:2006/08/04(金) 22:41:39 ID:wY0VtmKQ
sedじゃないからレス付けないわよ

21 :login:Penguin:2006/08/04(金) 22:53:54 ID:dXMK20nx
sedのスレじゃないんじゃない?スレタイの【sed】はpart1の継承と思われ。

22 :login:Penguin:2006/08/04(金) 23:03:25 ID:VDkmAFM5
>>19
>17はlsしてるから、こういうことのような気がする。
for workingdir in !(etc) # bashのみ

myprog一発の意味は良くわからないままだが。

23 :login:Penguin:2006/08/05(土) 09:14:42 ID:O9k+WVF/
ふつーfindじゃね?
ttp://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
-path pattern参照


24 :login:Penguin:2006/08/05(土) 14:47:48 ID:9HX9xiOs
{}\ の意味を教えてください!
GoogleやYahooで出ないよ!!!!なんでー

25 :login:Penguin:2006/08/05(土) 14:48:38 ID:J3gOyxfQ
>>24
引数は特にない。区切り記号

26 :login:Penguin:2006/08/05(土) 15:21:31 ID:4ssKXxYM
>>24

正確にいうと、

{}\ でなく、{} \

スペース空けないとエラーになります。

27 :login:Penguin:2006/08/05(土) 15:23:21 ID:J3gOyxfQ
>>26
正確に言うと{}\;ではないか

28 :login:Penguin:2006/08/05(土) 17:30:27 ID:XjGTvucN
>>24
話が見えないんだが…
find の引数ってことで良いの?


29 :login:Penguin:2006/08/06(日) 01:16:46 ID:Myj22fA7
まずman読もうよ....

>引き数は、 `;' を含む引き数にいたるまで、すべて command の引き数と
>みなされる。文字列 `{}' は現在処理しているファイル名に置き換えられる。

30 :login:Penguin:2006/08/07(月) 19:15:39 ID:C6inuQl7
>>19 >>22

亀レスですいません。アドバイスありがとうございます。
諸事情でネットに繋ぐことが出来ませんでした。

具体的にやりたいことを説明しますと、/var/spool/ml の下に100個程のディレク
トリがあります。etc他、数ディレクトリは無視して、任意のディレクトリ配下の
activeファイルからコメント行(#)を削除。その後、$ cp members actives を実行、
という感じです。
どういう用途かと言いますと、メーリングリストのユーザ設定ファイルのゴミ行を
整理する目的です。で、現在、次の様なmyprogというスクリプトを書き

#/bin/sh
PROGRAM=`basename $0`
HOME=/var/spool/ml/
for x in "$@"
do
if [ -d $x ]; then
if [ -f $x/actives ]; then
cd $x
sed '/^#/d' actives | sort | uniq > members;
cp members actives;
echo "done... $x"
else
echo "actives not found... $x"
fi
cd $HOME
else
echo "not direcotory... $x"
fi
done

31 :login:Penguin:2006/08/07(月) 19:16:14 ID:C6inuQl7
下記コマンドでやりたいことは出来るのですが
$ ls -1 | sed -e '/^bin/d' -e '/^etc/d' -e '/^@/d' -e '/^doc/d' | xargs myprog
出来れば、ls -1 の結果を配列(あるのかな?)に入れて、myprog内で実行したいと
思っています。また、こうすればもっと美しくなるというアドバイスもあれば、とても
うれしく思います。

32 :login:Penguin:2006/08/07(月) 19:30:10 ID:C6inuQl7
少し短くなりました。後は、ls -1 の結果を forに渡せれば完璧
なんですが(´・ω・`)

#/bin/sh
PROGRAM=`basename $0`
HOME=/var/spool/ml/t/

for x in "$@"
do
if [ -f $x/actives ]; then
sed '/^#/d' $x/actives | sort | uniq > $x/members;
cp $x/members $x/actives;
echo "done... $x"
else
echo "actives not found... $x"
fi
done



33 :login:Penguin:2006/08/07(月) 20:48:45 ID:gs8/6rb4
やりたいことできてるならそれでいいじゃん。
きれいに書きたいとか配列使いたいとかなら
もっとまともなスクリプト言語使った方がいいよ。
そういうのをシェルに求めちゃいかん。

34 :login:Penguin:2006/08/07(月) 22:46:57 ID:w0ywXoJn
やきもそ?

35 :login:Penguin:2006/08/07(月) 23:23:40 ID:h+JkAwh7
TOPDIR=/var/spool/ml/t/

cd "${TOPDIR}"
for x in *
do
case "$x" in
bin|etc|doc|@*)
continue
;;
esac

${PROGRAM}はいらないのでは?
${HOME}を書き換えるのも気持ち悪いかと


36 :login:Penguin:2006/08/08(火) 09:51:22 ID:xwC3gQjv
for x in `find hoge`でまわして
除外対象は${x%hoge}でチェックとかはよくやる。

あと、ここの前擦れにwhile+readの例があったと思う。
お、まんまの例があった。
ttp://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8


37 :login:Penguin:2006/08/10(木) 01:17:08 ID:hLDol0PX
>>33-36
アドバイスありがとうございます。
勉強になります。

>>35
PROGRAMは慣習でつけてます。拡張していった時に
echo "usage: $PROGRAM filename"
とかって使ったりするので。たしかにHOMEは気持ち悪いですね。直しました!

>>36
for x in `find hoge`
これは使えるかも!ありがとうございます!コマンド結果をxに渡せるとは
知りませんでした。

38 :login:Penguin:2006/08/11(金) 00:24:55 ID:dPYSw/pT
>>37
$0

39 :login:Penguin:2006/08/11(金) 19:52:52 ID:c1dCdFjO
Cutlist: 0-2731,19014-21714,37651-41262,64752-68382,80903-84503,95557-98910,
という出力を
0 2731 0
19014 21714 0
37651 41262 0
64752 68382 0
80903 84503 0
95557 98910 0
このように整形することはできました。(最後の0は定数)
さらにこの個々の値を全て29.97で割って倍精度出力したいのですが
シェルスクリプトでそこまで出来るでしょうか?
できるという方、その方法を教えてください。お願いします。

今のところのコマンド
mythcommflag --getcutlist -f /mpeg/rec/1007_20060609005300.mpg | grep Cutlist | sed -e 's/Cutlist: //' -e 's/-/\t/g' -e 's/,/\t0\n/g' | sed -e '$,$d'

40 :login:Penguin:2006/08/11(金) 20:41:43 ID:byhCsImE
>>39
最終結果(倍精度出力)はawkあたりを使うと良いと思われ。

41 :login:Penguin:2006/08/11(金) 22:17:16 ID:AQmE1c/e
>>40
#!/usr/bin/gawk -f
/^Cutlist/ {
sub(/^Cutlist: */, "", $0);
sub(/,$/, "", $0);
n = split($0, a, ",");
for(i = 1; i <= n; i ++){
split(a[i], j, "-");
printf("%f %f 0\n", j[1] / 29.97, j[2] / 29.97);
}
}

42 :39:2006/08/11(金) 22:27:22 ID:c1dCdFjO
>>40-41
ありがとうございます。神です。
今から自分で一行ずつ理解していくつもりです。
# ちょっと複雑な物はawkのがいいのかな

ありがとうございました。

43 :login:Penguin:2006/08/12(土) 02:02:48 ID:F5xv4HYx
基本的な質問ですが、このスレって、sed、awk限定ですか?
それとも、「シェルスクリプト総合」とある様に、他の質問などしても大丈夫
なんでしょうか?

44 :login:Penguin:2006/08/12(土) 02:22:13 ID:0D4xQrt3
【】はアホが付けたゴミなので無視すべし。

45 :login:Penguin:2006/08/12(土) 15:55:03 ID:qqxmgQZ0
>39
bcの有無次第という経験がある。
perlの方がawkの実装違いに悩むよりはいい鴨試練。

>43
expectあたりもおk

46 :login:Penguin:2006/08/12(土) 17:23:29 ID:rfgDoil3
wish もシェルの内?


47 :login:Penguin:2006/08/12(土) 17:49:22 ID:0P6HlNMI
仮にそうだとしても、このスレに書いても反応ないと思う。

48 :login:Penguin:2006/08/13(日) 00:22:41 ID:/XLxPgJE
大げさでも遠慮する必要もない、どんどん使え。
どうせperlは必須科目、読み書きできてあたりまえ。
pythonも必須科目になりつつある。
ruby、どうかな。
bashのスクリプトをpythonで書き直すとかはいい訓練になるよ。
古代象形文字を英語に翻訳する感じ。

49 :login:Penguin:2006/08/13(日) 00:33:57 ID:CGwN7DaL
>>48
そうですか。んでは次の方どうぞ。

50 :login:Penguin:2006/08/17(木) 14:26:19 ID:NdJCZwC6
正規表現について質問です。

dir
dir1
dir10
dir.tar
file.php

とあり、dir、dir1、dir10という風にdir[数字0桁〜2桁]へマッチさせたい
のですが、

"^dir[0-9][^\.]"

だと、dir自体にマッチしてくれません。どう書けばいいんでしょうか?
昨日からやってます。アドバイスお願い致します。
ちなみに、PHPのereg()です。

51 :login:Penguin:2006/08/17(木) 14:29:36 ID:1Ek0hIni
>>50
PHP part2
http://pc8.2ch.net/test/read.cgi/tech/1127806509/

52 :login:Penguin:2006/08/17(木) 20:06:26 ID:nAJZh721
>>50
grep -e "^dir[0-9]*$"

53 :login:Penguin:2006/08/18(金) 00:36:00 ID:Dr7kWMUz
>>52
dir111

ハイアウト。


54 :login:Penguin:2006/08/18(金) 00:44:07 ID:RiO8CgXj


55 :login:Penguin:2006/08/18(金) 00:54:13 ID:OVN7tn41
数字は2桁までだそうですよ、センセ

56 :login:Penguin:2006/08/18(金) 00:55:07 ID:RiO8CgXj
なるほど。

>>52は俺じゃないけど

grep -e "^dir[0-9]$" -e "^dir[0-9][0-9]$"

これでいいんか?

57 :login:Penguin:2006/08/18(金) 01:01:10 ID:FNYS+oEf
grep じゃなくて PHP だそうですよ、センセ。

58 :login:Penguin:2006/08/18(金) 01:02:06 ID:K8QeIm2Y
だったらお前が書いてやれ、センセ

59 :login:Penguin:2006/08/18(金) 10:11:45 ID:uU/Ps5z+
(^dir$|^dir\d{1,2}$)


60 :login:Penguin:2006/08/18(金) 10:37:01 ID:FNYS+oEf
http://pc8.2ch.net/test/read.cgi/tech/1127806509/419
で解決してるみたいよ。

61 :login:Penguin:2006/08/18(金) 12:19:14 ID:uU/Ps5z+
dir\D+ともマッチしそうだけど、まいーか

62 :login:Penguin:2006/08/18(金) 12:23:17 ID:uU/Ps5z+
あ、大丈夫だな

63 :login:Penguin:2006/08/19(土) 17:46:13 ID:CKH2sw8O
テキストファイルの中から、 "\b[a-zA-Z]{10}\b" にヒットする単語
(スペース+アルファベット10文字+スペース)を抽出して一覧で出
したいんですが、手も足も出ません。

awkかsedで実現する方法を教えていただけませんでしょうか。

64 :login:Penguin:2006/08/19(土) 21:11:45 ID:lL38en3G
>>63
(step 1)1行複数単語→1行1単語の形式にまず直す。
これは\bを改行にtrすることでほぼ実現できる(余計な空行とか多少入るけど)。
(step 2)grep '^[a-zA-Z]{10}$' のようなことをする。
(grepの実装によっては{}をサポートしてたりしてなかったりするだろう)

65 :63:2006/08/19(土) 21:41:31 ID:CKH2sw8O
>>64
貴殿、頭いいな。方向性は見えた。Thanks。


66 :login:Penguin:2006/08/20(日) 12:36:50 ID:8BT2kJaV
きのうやっとsedとかawkの勉強を始めたOSX使いの俺はお断りですかそうですか。
断られないようにきっちり勉強してくると汁。

でもさあ、
いまいち練習のいいネタが見つからないんだよなあ。
みなさま正規表現の練習とかするときのネタは、どこから仕込んでるんですか?

67 :login:Penguin:2006/08/20(日) 12:45:30 ID:HHyoi7jx
>>66
htmlでも解析してみたらどうだい?

68 :login:Penguin:2006/08/20(日) 15:37:07 ID:6ucGe45P
>>66
俺は初めはviの置換で練習した。sedと同じ表記が可能。
awkは言語としてとらえたほうがいいかも。


69 :66:2006/08/20(日) 15:46:43 ID:8BT2kJaV
>>66
BlogのHTMLの解析をして、それをRSSにでっち上げるとか面白そうだからやってみようと思いますた。

さっきからdatを解析してました。HTMLに吐き出すもの。
この1行で処理するというのには正直感動。

$ cat dat1.dat | awk -F"<>" '{print "<h1>" $3 "</h1><p>" $4 "</p>"}' | sed -e 's/\(http:\/\/.*\/l50\)/<a href=\"\1\">\1<\a>/g' > test.html

こんな具合だけれど…。文章中にリンクがあったときに、自動でタグをくっつけるやり方がいまいちぱっとしない。

sed -e 's/\(http:\/\/[^/]*\)/<a href=\"\1\">\1<\a>/g'
ホストのトップディレクトリにリンクがはれる('A`)。

いわゆる | をつけて処理しようとすると、うちのsedは何も吐き出さないんだけれど、これはバージョンが古いってことかな。

70 :login:Penguin:2006/08/20(日) 16:58:41 ID:jjYenmqQ
1行で実現するより、複数行になってもawkオンリーあるいはsedオンリーで実現した方が美しいだろ。


71 :login:Penguin:2006/08/20(日) 17:00:11 ID:HHyoi7jx
>>70
TPO

72 :login:Penguin:2006/08/20(日) 20:07:25 ID:9C4Qkftc
xmlawkつかうといいよ。

73 :login:Penguin:2006/08/20(日) 23:30:08 ID:OEoaYPnv
それで練習になるのか?

74 :login:Penguin:2006/08/21(月) 02:12:20 ID:Wd9CmAkD
>>69
いわゆる | って正規表現の選択のやつ?
だとしたら、BREには選択はないのでそもそも使えない。

ただし、GNU sed だと \| という表記で使える。


75 :login:Penguin:2006/08/22(火) 21:07:59 ID:+v8xeAHC
初歩的な質問で恐縮です。

user1:AAAAAAAA
user2:BBBBBBBB
user3:CCCCCCCC

という中身のファイルがあったとします。で、user3の行があれば、第2カラムを
DDDDDDDDに変更。無ければ、user3:DDDDDDDDの行を追加したいのですが、何の
コマンドを使えばよろしいんでしょうか?希望としては、コマンド一発で出来る
方法を探っています。※Perlなどでスクリプトを組まない

お知恵をお借り出来ればと思います。宜しくお願い致します。


76 :login:Penguin:2006/08/22(火) 21:11:51 ID:iaWm4QvQ
>>75
(grep -v '^user3:' srcfile ; echo user3:DDDDDD) > tmpfile ; mv tmpfile srcfile

77 :login:Penguin:2006/08/22(火) 21:29:52 ID:+v8xeAHC
>>76

ありがとうございます。
でも、これだと、user1,user2が上書きされて消えてしまいます(T.T)

78 :login:Penguin:2006/08/22(火) 21:33:49 ID:iaWm4QvQ
ぇー

79 :login:Penguin:2006/08/22(火) 21:39:31 ID:+v8xeAHC
なんか例がわかりずらかったですね。
もっと細かく説明します。

adminファイル
admin:AAAAAAAA
power:CCCCCCCC

userファイル
user:DDDDDDDD

とあり、userファイルに、adminファイルの内容を追加したいのです。
追加だけなら

$ cat admin >> user

で済むのですが、既に追加済みの場合は、新しく、adminとpowerの行を
上書きしたいのです。わかりずらくてすみません。

80 :login:Penguin:2006/08/22(火) 21:46:24 ID:iaWm4QvQ
細かくも何もぜんぜん要求仕様ちがうやん。
いつのまにかファイル2個あるし。

81 :login:Penguin:2006/08/22(火) 22:10:49 ID:NABXSFVh
joinつうコマンドでできるような気がするが、オプション覚えるのがめんどくさいから、
俺はその手の処理にはawkを使うようにしている。


82 :login:Penguin:2006/08/22(火) 22:10:59 ID:+v8xeAHC
すいません。m(__)m
説明不足でごめんなさい。

83 :login:Penguin:2006/08/22(火) 22:36:43 ID:iaWm4QvQ
join 微妙だなぁ。cat してワンライナー組んじゃった方が早い感じ。

84 :login:Penguin:2006/08/22(火) 22:37:55 ID:qaN2f1N0
>>75を無理矢理一行で書いてみた。sed -iを使ったので反則気味。

#!/bin/sh

grep -q -c "user3:" userfile \
&& sed -i 's/^user3:.*$/user3:DDDDDDDD/' userfile \
|| echo "user3:DDDDDDDD" >> userfile

85 :login:Penguin:2006/08/22(火) 23:46:45 ID:90hvAnWP
Linuxをインストールする時のパッケージや設定とかをシェルスクリプトにまとめたことある人いますか?
シェルスクリプトはやったことがないので、こんな感じでまとめていいものか、
途方にくれています。


「スクリプト前」
# cd /etc
# mv -i logrotate.conf logrotate.conf.org
# cp -i -p logrotate.conf.org logrotate.conf
# vi logrotate.conf
# ci -u -zLT logrotate.conf



「スクリプト後」
if [ cd /etc];
then
mv -i logrotate.conf logrotate.conf.org &&
cp -i -p logrotate.conf.org logrotate.conf &&
cp -p /home/SHELL/logrotate.conf logrotate.conf &&
ci -u -zLT logrotate.conf
else
echo"logrotate Error!!!"
fi

86 :login:Penguin:2006/08/23(水) 02:58:44 ID:LeEwpLMn
>85
行動の成否で判定したいだけなら[]は余計。

87 :login:Penguin:2006/08/23(水) 05:01:38 ID:B3/HAlAd
引数に特定の文字列があるかどうか grep で確かめたい場合、
どういう書き方が一番いいでしょうか?
今は

if echo "$1" | grep 'h[ao]ge' > /dev/null ;then

こんな感じでやってるんですけど、
echo と /dev/null へのリダイレクトが冗長に思えるので、
もっと簡潔なやり方があれば教えてください。

88 :login:Penguin:2006/08/23(水) 06:01:06 ID:uCowIUgO
>>87
case $1 in h[ao]ge) echo found ;; *) echo notfound ; esac
正規表現じゃなくてパス名展開なので注意

89 :login:Penguin:2006/08/23(水) 19:14:08 ID:XWE7YPDO
>>87
grep -q

90 :login:Penguin:2006/08/23(水) 21:54:25 ID:m8SvDdPt
>>89
grep -s な環境もあるので、>/dev/null の方がポータブル。

91 :login:Penguin:2006/08/29(火) 10:44:29 ID:LacrCZoW
>>86の補足。

シェルスクリプトの文法では、if文は、
if コマンド; ...
なので、if cd ...; と書くという意味ね。

[ はif文の括弧じゃなくてtestコマンドへのリンク。
if [ ... ]; then は if test ...; then と等価。
test ではなく [ という名前で実行した場合は最後に ] という引数が
ないとエラーになるという作りになっている。

92 :login:Penguin:2006/08/30(水) 08:56:40 ID:ptUsDypX
あぁ、]は引数なのか。どうりでスペースが。。。
勉強になった。ありがと。>>85じゃないけど

93 :login:Penguin:2006/09/01(金) 20:00:08 ID:lCcTQKLy
bashで、ファイルAとファイルBの
タイムスタンプの同一性が確認したいのですが、
どーやればいいのでしょうか。
内容の同一性ではなく、あくまでタイムスタンプの同一性です。

Cでかけば、多分こんな感じ。
struct stat stat1=fstat(file1);
struct stat stat2=fstat(file2);
if( stat1.mtime==stat2.mtime){....}

bash ではどうするのでしょうか?


94 :login:Penguin:2006/09/01(金) 20:08:17 ID:5aC2i0M0
test ! tstest1 -nt tstest2 -a ! tstest1 -ot tstest2 && echo hoge

95 :login:Penguin:2006/09/01(金) 20:46:18 ID:9V2XQm3y
>>93
statを使えば可能かと

96 :login:Penguin:2006/09/03(日) 02:05:43 ID:F8zNeDUy
ディレクトリを755
ファイルを644で一括して変換したいんですが、

$ chmod -R 755 dir

だと、ファイルも755になってしまします。何か良い方法かコマンドがあったら
教えて下さい。chmodのman見たけど、ないっぽいのでこちらで質問します。

97 :login:Penguin:2006/09/03(日) 02:10:10 ID:Ke5Muy7n
find -type

98 :login:Penguin:2006/09/03(日) 11:45:21 ID:bshh0ysH
>>96
find tmp \( -type d -exec chmod 0755 {} \; \) -o \( -type f -exec chmod 0644 {} \; \)


99 :login:Penguin:2006/09/03(日) 11:47:59 ID:O81fbTM3
findってキモいなぁ

100 :login:Penguin:2006/09/03(日) 11:54:50 ID:Kb773J88
chmod -R a+r,u+w

101 :96:2006/09/03(日) 12:49:17 ID:F8zNeDUy
>>97-100
アドバイスありがとうございます!解決しそうです。

102 :login:Penguin:2006/09/03(日) 13:12:10 ID:K075yEZw
zshでしあわせになろうと、
chmod 755 **/*(/)
chmod 644 **/*(.)
を試みたらディレクトリが深すぎて怒られることもある。

一発でやらないなら
find -type d -print0 | xargs -0 chmod 755
find -type f -print0 | xargs -0 chmod 644
が一番汎用性が高くてすっきりしているか。
Darwinの非GNU find/xargsにも-print0や-0あるようだし。

103 :login:Penguin:2006/09/03(日) 13:12:44 ID:K075yEZw
find . 以下略にすべきでした。

104 :login:Penguin:2006/09/03(日) 13:45:39 ID:K075yEZw
そういえばここLinux板だった。GNU find/xargs前提でいいんだな、きっと。

105 :login:Penguin:2006/09/04(月) 15:50:53 ID:N5MHYTmG
mkdir でディレクトリを作成してそのディレクトリに移動するスクリプトを書きたいと思っています。
#!/bin/sh
mkdir $1 && cd $1
だと、子プロセスが移動するだけで親がcdしてくれません。いい方法はないでしょうか。

106 :login:Penguin:2006/09/04(月) 15:57:14 ID:dcVwde1w
いまいち、意味がよくわからんけど、
呼び出すときに、
$ . /hoge.sh
とするということか?


107 :login:Penguin:2006/09/04(月) 16:36:14 ID:N5MHYTmG
>>106
意味が分かりにくくてスミマセン。
パスが通ったところに例えばmkdircdという名前で置いておいて
$ mkdircd $(date +%Y%d%m)-1
とすると、$(date +%Y%d%m)-1というディレクトリを作成して
そこにcdするという意味です。言い換えると、
$ mkdir $(date +%Y%d%m)-1
$ cd $(date +%Y%d%m)-1
を一度にするという意味です。mkdirのワラッパーを作成してalisasで置き換え、
例えば--cdというオプションがあれば、mkdirした後にそこへcdするというもの
でも構いません。
# 単に打鍵数を減らして横着したいだけなのですが。。



108 :login:Penguin:2006/09/04(月) 16:38:38 ID:Xg7jkciV
ふふふ

109 :login:Penguin:2006/09/04(月) 16:38:41 ID:vaQkza9Z
「ワラッパー」ってのが何だかわからんけど、
関数じゃだめなん?

110 :105:2006/09/04(月) 16:52:20 ID:N5MHYTmG
>>109
ありがとうございます。解決しました。
mkdircd () { /bin/mkdir $1 && cd $1; }


111 :login:Penguin:2006/09/04(月) 19:50:25 ID:Zd0ujhiz
>>102
find -type d -exec chmod 755 {} \;
find -type f -exec chmod 644 {} \;


112 :login:Penguin:2006/09/04(月) 22:34:21 ID:sHXG9gFj
wrap = ラップ (サランラップとかラッピングとか)

113 :105:2006/09/04(月) 23:17:00 ID:N5MHYTmG
>>112
ありがと。ラッパーでつね。

114 :login:Penguin:2006/09/04(月) 23:31:18 ID:GlEy5cG5
chmod -R 644 /

115 :login:Penguin:2006/09/05(火) 10:08:07 ID:5E+/nWTh
シェルスクリプトの中で変数中の "`" を "\`" に escape したいんですができません

#!/bin/sh
S='a`b'
S2=`echo "${S}" | sed 's/\`/\\\`/g'`
echo "${S2}"

a`b

外部に sed script をおけばできるんですが
shell script の中だけではむりでしょうか

116 :login:Penguin:2006/09/05(火) 10:36:35 ID:CtztP3Q6
そらそだ

117 :login:Penguin:2006/09/05(火) 10:53:09 ID:4GXGTKmU
S2=`echo "$S" | sed 's/\`/\\\\\`/g'`


118 :115:2006/09/05(火) 22:33:00 ID:pCLRKlZc
>>117
なるほど、できました
しっかし、これは難しかった
#!/bin/sh が `----` を解釈するとき
sed 's/\`/\\\\\`/g' が sed 's/`/\\`/' になって、
sub shell が '----' を解釈して
sed に $1==s/`/\`/ を渡すということですか!!



119 :login:Penguin:2006/09/05(火) 22:54:42 ID:dRnTZ/L0
>>118
なんかああー!もうだめー!ブリブリぶりー!!って言うコピペに見えた。

120 :login:Penguin:2006/09/05(火) 23:33:33 ID:w48ryD58
>>119
眼科池


121 :login:Penguin:2006/09/06(水) 01:03:44 ID:k0MtvRe2
>>119
脳外科池。
2chの見過ぎには注意しよう。

122 :login:Penguin:2006/09/07(木) 17:27:40 ID:iCRx2SWb
dir以下を再帰的に掘っていって、全てのファイル(.txt)の中の文字列

SAM001P (SAM+三桁数字+英1桁〜2桁)

のSAMを削除をしたいんですけど、どんな感じでスクリプトを作れば良いか
アドバイス頂けますでしょうか?

めんどくさいことに、SAM001P/SAM002PX/SAM003B ってのもあれば、

これについてはSAM004NNを参照。

と言う風に文に埋まってしまってるものもあります。なんとかshとsedとawkで
やり遂げたいと思ってます。

123 :login:Penguin:2006/09/07(木) 17:34:35 ID:q58mDIRA
>>122
find と sed -i で行けそうじゃない?

124 :login:Penguin:2006/09/07(木) 18:59:32 ID:iCRx2SWb
>>123
いけそうな気がして来ました!
がんばってみます(*・∀・)=3

125 :login:Penguin:2006/09/14(木) 01:29:15 ID:p/dn3po+
例えば P1-5 P3-12 P2-9 を P1-05 P3-12 P2-09 というようにマイナスのあとを2桁にしたい
のですが、
echo P1-5 P3-12 P2-9 | sed -e 's/P\([123]\)-\([0-9]\{1\}\)/P\1-0\2/g'
P1-05 P3-012 P2-09
うまくいきません。この場合はどのように正規表現を書いたらよいのでしょうか。

126 :125:2006/09/14(木) 01:40:51 ID:p/dn3po+
自己解決しました
cho P1-5 P3-12 P2-9 | sed -e 's/P\([123]\)-\([0-9]\)\([^0-9]\|$\)/P\1-0\2\3/g'
P1-05 P3-12 P2-09


127 :login:Penguin:2006/09/14(木) 23:49:34 ID:rr8HdM9N
ちょw

128 :login:Penguin:2006/09/22(金) 16:32:09 ID:Gi/VKmOp
簡単にお金稼ぎ!!!

以下の手順でやれば、無料でお金稼ぎができます。
企業も広告の宣伝になるから、お金をくれるわけです。
最初の1日目で 2000 円〜3000 円 は確実に稼げます。
実際の作業は数十分程度、1時間はかかりません。

@ http://www.gendama.jp/invitation.php?frid=470908
    ↑このアドレスからサイトに行く。
Aそこのサイトで無料会員登録(応募)します。
 (その時点で 500 ポイントが貰えます。)
 ※事前に新規でヤフーなどのフリーメールアドレス
 を取っておくといいですね。
Bポイントを稼ぎます。
 懸賞の応募や無料会員登録などをする事によって
 1日目で約 20000 ポイントは GET できます。
C 3000 ポイントから、現金や WEB マネーに交換できます。
Dトップの右上に「交換」という所がありますので、
 そこから交換をしましょう。
 その月に初めてポイントバンクにポイントを移行した時、
 さらに別途として 1000 ポイント貰えます。

これで現金や WEB マネーを稼ぐといいですよ!!!

129 :login:Penguin:2006/09/25(月) 14:04:16 ID:ENWvwHb8
シェルはbashで、
MySQLのデータを元に自動でユーザを作るシェルを
作りたいのですが、参考になりそうなサイトを教えて
下さい。
ぐぐったけどそういう参考になるサイトが出てこないです。

130 :login:Penguin:2006/09/25(月) 15:53:36 ID:3M5G2Z3K
>>129
>>3

131 :login:Penguin:2006/09/25(月) 20:01:16 ID:8zKTMoIu
常套手段だったらすまん。
#!/bin/busybox ash
とかやると結構早くなるかな?

それとも各種コマンドの表現力のなさに絶望するかな。


132 :login:Penguin:2006/09/25(月) 23:30:01 ID:bEafUneY
へぇー(x3)、busybox ashでシェルスクリプト実行させると
該当する外部コマンド呼び出しはシェルコマンド的呼び出しになるんだ。
$?とか使えるからてっきりバイナリ実体の共通化だけが目的で、
コマンド実行自体は普通にfork&execしてるのかと思ってた。

それはともかく、インストーラだとかでは結果的にそれやってる訳だから、
それなりに使えるんじゃない?逆にGNU拡張とかに依存しない移植性の
高いシェルスクリプトを書けるようになるかも。

速度は・・・速くなるだろうけど、シェルスクリプトで気にするかというか。


133 :129:2006/09/26(火) 10:54:20 ID:/kN9yJk7
シェルでMySQLの起動までは出来るんですけど、その続きを自動で処理してくれません。
(MySQLにログインした後、入力待ち状態になってしまって、起動後にDBを変更してくれない)。

mysql -u mofu -pmofumofu
use mohe
select * from moeneko;

としたところログイン後の処理をしてくれずにMySQLを終わらせた時点でuseって何だゴルァと
怒られます(以降の処理も怒られます)。


134 :login:Penguin:2006/09/26(火) 11:19:28 ID:df8bksAP
>>133
echo 'use mohe; use select * from moeneko;' | mysql -u mofu -pmofumofu

135 :129:2006/09/26(火) 15:05:32 ID:/kN9yJk7
>>134
そんなスマートな方法が・・・。

mysql -u mofu -pmofumofu mohe <mofu.sql

[mofu.sql]
use mohe
select * from moeneko;

って2つのファイルにしてやってた。
問題はこのクエリを発行後、戻ってきた奴を変数に入れる方法だね。

//MySQLのレストア作業で読み込ませるファイルがCreate文とか普通に
手打ちで出来ることをテキストに纏めて順次実行してるだけなんだから、
select文とかも実行できるんじゃね?と思って試してみました。

136 :login:Penguin:2006/09/28(木) 23:39:58 ID:qmT4SbpH
シェル(使ってるのは主にbash)って、ちょっと複雑な処理をさせると、
すぐに動作が重くなるね(多重にループさせたときとか)。
同じ処理でも、Cの方が圧倒的に早い。
最適化しないのがおおきいのかな?

137 :login:Penguin:2006/09/28(木) 23:46:14 ID:kP+fnhcw
シェルは真のインタプリタ
Tcl、Perlなどはランタイムコンパイル


138 :login:Penguin:2006/09/29(金) 00:09:45 ID:ikhtZqAF
>>137
どっからperlがでてきてんだ?

139 :login:Penguin:2006/09/29(金) 00:17:43 ID:qV/OGN3K
>>136
具体的にどういう処理?

そもそもCで書かれたbash上の実行内容をCで書いたら負けるわけないだろ。
書く時間がかかるからフツーshellでやるけど。

140 :login:Penguin:2006/09/29(金) 00:19:49 ID:ikhtZqAF
>>139
>そもそもCで書かれたbash上の実行内容をCで書いたら負けるわけないだろ。

そうか?Cでアセンブラを書くことも出来るわけでな。

141 :login:Penguin:2006/09/29(金) 02:33:29 ID:AlG8EKxr
shellscriptだってバイトコードべた書きできるよ

142 :login:Penguin:2006/10/01(日) 14:53:16 ID:me3R4vLB

原点に戻ろう。ケースバイケースで使い分ければ済む事。

用途に合ってれば、バイナリをゲロする言語で結構。

そこまですることない、ってーならシェルスクリプトでいいジャマイカ



143 :login:Penguin:2006/10/01(日) 19:06:18 ID:Xo+fTZgf
>>139
遅レスだが、あるファイル内のすべてのの10進を16進に変換する処理。
(bashって、16進形式ないよね?)
アルゴリズムは16の何乗かで割っていくというよくある方法。
変換する文字が10個以上くらいになると、途端に遅くなる。

144 :login:Penguin:2006/10/01(日) 19:18:04 ID:7VdKxRNj
>>143
それシェルでやるか?
普通はbcやら計算用の他のプログラムを呼ぶと思うんだが。

そもそもシェルスクリプトは、単機能なプログラム群(test,expr,sed,awk,etc.)
のグルーとして機能して、複雑な機能の9割を短期間で構成できる所が強みだろ。
プログラミング言語としてのシェル自体の能力を語ってみてもなあ。

145 :144:2006/10/01(日) 19:21:28 ID:7VdKxRNj
16進変換自体は、bcでobase指定してもいいけど、今の時代ならprintfの方が簡単か。

146 :login:Penguin:2006/10/02(月) 14:46:13 ID:D0XdThx6
>>143みたいなジョークはおいといてw
必要ならperlやcで書いてそれをbashから使えばいいだけの事。
bashもいっぱしの言語なので他の言語で書けるアルゴリズムならbashでも書けるが
効率的にナンセンスなモノは書く前に気づけよ。
ちょいとbashで済ませる程度の事をcで書くのも効率的にナンセンス。

147 :login:Penguin:2006/10/03(火) 05:16:19 ID:FpR8NZbm
今のCPUの性能なら、基数変換程度の計算ならシェルで動かしても
そんなに時間かからないと思ったんだけど、そうでもないのね。

148 :login:Penguin:2006/10/03(火) 07:31:25 ID:EZmi0NrE
敢えてbashismを犯してまでヤル作業でもないなぁ。と言う印象。

149 :login:Penguin:2006/10/03(火) 10:52:43 ID:/JDV4iux
>>148
適材適所なので自分ではやらないいけど、
無茶する香具師がshellを改良するとか、
別のソフト作ることを期待して止めはしない。

150 :login:Penguin:2006/10/03(火) 11:41:14 ID:i4ad2dwr
そこでzshですよ

151 :login:Penguin:2006/10/03(火) 13:56:04 ID:KeekA4F/
いや、ここはscsh
http://www.scsh.net/

152 :login:Penguin:2006/10/04(水) 18:13:19 ID:nvODb2Cn
bashコンパイラを書けば解決さw
bashってのは完全にプログラマの為の道具。
プログラマって人種が極度のキータイプ嫌いでものぐさな事を如実に示しているのがbash。
通常は最も手軽に動かせる言語で、だから初心者も使うんだけど非常に迷路じみて無愛想な言語。
適材適所で言うなら初心者には最も不適な部類の言語だと思う。

153 :login:Penguin:2006/10/04(水) 19:30:49 ID:K3dljP7/
rcがいちばん。


154 :login:Penguin:2006/10/04(水) 22:38:44 ID:FNsr3Nih
inittabインタプリタが切に欲しい。

155 :login:Penguin:2006/10/04(水) 23:15:48 ID:sl6UHG36
>>152
じゃあ初心者にはなにがいいのよ?

156 :login:Penguin:2006/10/05(木) 23:25:36 ID:zAfJdDDf
csh

157 :login:Penguin:2006/10/07(土) 10:34:31 ID:81nNYwVr
氏ね

158 :login:Penguin:2006/10/09(月) 23:35:33 ID:9KuWHWOZ
二つのsort,uniqされたファイル

file1
a
b
c

file2
c

があったとして、file1-file2>file3

file3
a
b

みたいことやりたいんですが、何てコマンド使えば良いんでしょうか?

159 :login:Penguin:2006/10/09(月) 23:41:56 ID:9la7eu6H
>>158

grep -v -f file2 file1 > file3

160 :login:Penguin:2006/10/10(火) 00:48:52 ID:j7TWTFqG
>>159
ありがとうございます!
すごく助かりました。

161 :login:Penguin:2006/10/10(火) 01:11:18 ID:34A8UKNC
そういえばgrepで除外を意味する-vの由来は何だろう。
校正記号の「トル」?

162 :login:Penguin:2006/10/10(火) 01:20:55 ID:lcIpK0vW
--invert-matchのvじゃね。

163 :login:Penguin:2006/10/10(火) 04:16:52 ID:j7TWTFqG
2000バイト以上のファイルを削除したい場合、どうしたら良いでしょうか?

findと組み合わせればよいのは分かるのですが、-sizeの使い方が良くわかり
ません。宜しくお願い致します。

164 :login:Penguin:2006/10/10(火) 04:21:26 ID:j7TWTFqG
すいません。
自己解決しました。

find . -size -2000c

165 :login:Penguin:2006/10/10(火) 04:43:41 ID:j7TWTFqG
ちょっと不親切でしたので、再投稿します。

find . -size +2000c -exec rm {} \;

で解決出来ました。お騒がせしました。

166 : ◆Zsh/ladOX. :2006/10/10(火) 23:29:53 ID:2MRSIVzd
vetoジャマイカ

167 :login:Penguin:2006/10/11(水) 02:58:14 ID:JyuHWbkO
>>166
む、納得しちゃいそう。

168 :login:Penguin:2006/10/13(金) 11:56:24 ID:Mn/ZCEtt
>>155
cでしょうに。
ただcから入るとc++で頭切替えるのが大変になる。
c++てcを書いてる人が多い。

169 :login:Penguin:2006/10/13(金) 12:14:19 ID:yGdobEUM
>>168
あえてネイティブで動かす必要のあるものを作る場合を除けば、いまどきCやる必要なんてないでしょ。
Rubyとかのスクリプト言語でサッと書いてサッと使ってサッと捨てる。

170 :login:Penguin:2006/10/13(金) 12:59:32 ID:Mn/ZCEtt
>>169
初心者向けの言語って意味だから。
プログラミング入門はcが王道でしょ。
いきなりrubyは高級すぎて何がすごいのかも理解できないと思うし。
まず単純で質素なcで学んでからの方がいい。
ちなみにおじさんはアッセンブラからやらされた。
その時はくだらないと思ったがcの過程でポインタや配列を即理解できてやっててよかったと思ったよ。

171 :login:Penguin:2006/10/13(金) 13:05:42 ID:i+BkCOk3
スレ違いの話はその辺で切り上げてくれないかな。

172 :login:Penguin:2006/10/13(金) 13:07:20 ID:Mn/ZCEtt
ついでに言えばアッセンブラとcは極論すれば書き方が違うだけで同じだった。
だがcとc++は根底が違う、見た目が一緒だから厄介。
>c++てcを書いてる人が多い。
の一人だったよ。
rubyの根底を理解するには基準としてcをやっておいて損はないと思う。
命令や文法だけ暗記しても無意味だから。
ちなみにperlはおおげさなものは何もない。
cの次にperlを初心者向け言語の候補に上げよう。
だらしないコードを書くようになる危険があるが。

173 :login:Penguin:2006/10/13(金) 23:31:27 ID:w5YU+1sG
>だがcとc++は根底が違う、見た目が一緒だから厄介。

マルチパラダイム言語という名の元、構造化プログラミングと言う枯れた手法を用いることもまた合法。


174 :login:Penguin:2006/10/14(土) 02:26:44 ID:4wDWWWIQ
【sed】シェルスクリプト総合@LINUX Part2【awk】

175 :login:Penguin:2006/10/14(土) 11:42:14 ID:awFbXLqQ
tccでスクリプト書けば最強ということでFA?
いや実際ツールコマンド化されてないシステムコール叩けて便利だけど。


176 :login:Penguin:2006/10/14(土) 13:43:44 ID:aJtsd/OF
「○○しますか?[Yes]/[No]」
と言うダイアログを表示させて、その後の処理を選択したとおりに分岐させたいのですが
コマンド一覧などでは見つかりませんでした。

参考になるサイトなどがあれば教えて下さいm(_ _)m

177 :login:Penguin:2006/10/14(土) 15:20:50 ID:ZNsxMjW/
>>176
gnomeならzenityってのがある。

178 :login:Penguin:2006/10/14(土) 15:30:22 ID:vHgMANEE
>>177
ありがとうございます。早速逝って来ます

179 :login:Penguin:2006/10/14(土) 15:44:47 ID:pcLZXe+4
>>176
dialog とか。

180 :塩水 ◆1FrMT.vzQQ :2006/10/14(土) 20:07:07 ID:alqqP7TT
おもに計算はfortranでやって、ファイルの処理をシェルスクリプトとかでやってる。
計算終わってはかれたログを整理したりgnuplotで描画できるようにデータを変換したりする。
だいたいシェルスクリトプトとsedとawkで処理できるかなと思ってたけど、ちょっとした
計算に不都合があった。シェルスクリプトだと少数が含まれる計算や割算のやりかたが
よくわからない。awkは引数としてファイルを指定して、そのファイルの中身をいじくるのは
スムーズなんだけど、第一引数と第二引数に直接値を指定して、その引数同士で
計算させるというのが案外難しい。引数の定義をawk側でごにょごにょしないといけないみたい。
その点perlはARGVで直接ひっぱってきてささっと計算できた事をもってして、
ああ、perlも便利なものだったんだなって思えた。
これからperlも勉強してみようと思うんだけど、Rubyのああ、やってて便利だなと
実感できる強みみたいなモノってあるのかな。オブジェクト指向になってて、開発してて
楽しいスクリプトだという概観みたいなモノは把握したんだけど、まだいまいち実感がわかない。
まずオブジェクト指向なるものがそれほど理解できてないからかもしれないけど。
だんだんスレタイからずれてきた…

るびらーの人がいたらおもしろそうな魅力をちょこっと教えてほしいな。

181 :login:Penguin:2006/10/14(土) 20:18:30 ID:iEFH5wj3
>>180
て言うかなげぇよ。

182 :塩水 ◆1FrMT.vzQQ :2006/10/14(土) 20:38:03 ID:alqqP7TT
ごめん。
スクリプトは遅いって言われてるけど、そこまで動作速度に不満を感じることなんて
ほとんどと言っていいほど無いんですよね。コンパイルという作業をかましてまで
速度を向上したいというようなプログラムは私的な状況の改善くらいでは特に感じない。
商品開発したり、いろんなマシンでも動くようなプログラム作ったりするのに
コンパイルするようなプログラムが必要なのかな?でもperlなら大概のマシンで動くし。
科学技術計算はさすがにスクリプトじゃ無理だけど、身近な問題の改善なら
スクリプト言語でじゅうぶんだと思った。と、懲りずに長文感想文。

183 :login:Penguin:2006/10/14(土) 20:40:02 ID:iEFH5wj3
>>182
2行だけ読んだ。それに関しては激しく同意。

184 :login:Penguin:2006/10/14(土) 21:58:28 ID:vHgMANEE
>>179
ありがとうございます。
早速これも調べてみます

185 :login:Penguin:2006/10/15(日) 17:26:52 ID:hHCRRLT3
>>176

gtkというアプローチも。XでGUIプログラミングに便利かも。

手早い選択肢としては、179のdialogに同意。

186 :login:Penguin:2006/10/15(日) 20:04:48 ID:Dk9VntiV
dtkshとか。


187 :login:Penguin:2006/10/19(木) 20:47:24 ID:FQ6Ui9I8
すいませんが教えてください

/old の全ファイルを /new にコピーを行いたいのですが、
もし /new に同名のファイルがあれば、そのファイルはコピーしない
というのをやりたいです

教えてスレではないと思うのですがよろしくお願いいたします

188 :187:2006/10/19(木) 20:48:09 ID:FQ6Ui9I8
あ、すいません bash です

189 :login:Penguin:2006/10/19(木) 21:02:16 ID:rKeC8zcr
>>188
cp をうまく使えばできないかい。
$ man cp
cp -u とか

190 :login:Penguin:2006/10/19(木) 21:03:31 ID:up7gNFzc
>>187
自分ではどこまでできたの?

191 :login:Penguin:2006/10/19(木) 21:04:10 ID:O9X2awX6
>>188
ちゃんとmanよめよ。

>>189
この場合だと-iでいいんじゃないかな。

192 :login:Penguin:2006/10/19(木) 21:06:45 ID:rKeC8zcr
>>191
.bashrc に alias で指定してあると思うが、じゃあ
cp でいいな。

193 :login:Penguin:2006/10/19(木) 21:43:51 ID:tD+4Ba/E
rsync が一番適切なんじゃないの?

194 :login:Penguin:2006/10/19(木) 21:46:20 ID:bIjdLPn3
>>193
たぶんそれが一番だと思う。

195 :login:Penguin:2006/10/19(木) 23:16:23 ID:LdXdiqxq
yes no | cp -ia ...


196 :login:Penguin:2006/10/20(金) 00:27:54 ID:txS6575E
tar -C old -cf - . | tar -C new --keep-old-files -xvf -

197 :login:Penguin:2006/10/20(金) 14:30:44 ID:lljI9Z8i
すみません。findコマンドで
find ~ -name '*.sh' -exec rm -f {} \;

みたいなコマンドを良く見掛けるんですけど、後ろの「{} \;」って
どういう意味があるのでしょうか?

198 :login:Penguin:2006/10/20(金) 15:03:24 ID:jcp0YpyW
>>197
まず、findの-execスイッチは、「-exec command ;」という形式をとるの。
というところまではわかってる?まずこの点findのman読んで復習して。

{}の意味については、やっぱりfindのmanの-exec...の項を読むとみつかるはず
だから探してみて。

\;は、元々は-exec...;の最後の;。
なんだけど、シェルが;をコマンドの区切りとみなしちゃう(findの-execスイッチの
一部分だとはシェルには解釈しない&できない)から、それを防止するために
エスケープして\;と書くの。

199 :login:Penguin:2006/10/20(金) 15:37:04 ID:lljI9Z8i
>>198
あ、エスケープの「\」だったんですね。
manを読んでみます。

検索しても使いかただけとか、{}で検索しても良いページがでなかったもので。

200 :login:Penguin:2006/10/20(金) 15:53:46 ID:lljI9Z8i
'*.sh'でヒットしたファイルをカウンターにして
forのようにまわして、{}にその引数の中身を展開して実行してるみたいですね。

for i in (ファイルのあるPATH)/*.sh ; do
rm -f $i
done

みたい。

201 :login:Penguin:2006/10/20(金) 20:51:18 ID:sPhZqjis
http://vine.ic.sci.yamaguchi-u.ac.jp/
の自動更新スクリプトも核はsedで書かれているらしい。

202 :login:Penguin:2006/10/25(水) 17:04:32 ID:N8gV8hQo
あるディレクトリを作成、その下にディレクトリツリー(movieとかaudio、更にそのmovieやらaudioディレクトリの
下に01、02〜の様な)を 作成してツリーの大元に戻って大本のフォルダをリネームをしたいのですが
最後の対話式でリネームする部分が難しくてうまい事作動してくれません。どなたか救いの手を…


203 :login:Penguin:2006/10/25(水) 17:15:20 ID:tU4cUr/G
>>202
今どこまで書けたの?

204 :login:Penguin:2006/11/04(土) 14:41:24 ID:8GhdlUfe
質問です

通常シェルスクリプトを書くとき,シグナルを受け取った時の
処理をシグナル毎に書くと思うのですが,逆に
どのシグナルが送られてきたか調べる方法はありますでしょうか?


205 :login:Penguin:2006/11/04(土) 21:47:32 ID:WxZzepoe
ないんじゃない。

myhandler () {
  local sig="$1"
  ...
}
trap "myhandler 1" 1
trap "myhandler 15" 15

とかじゃだめ?

206 :login:Penguin:2006/11/05(日) 11:33:47 ID:wGRiE4/g
>>205
やっぱりひとつひとつ調べないと無理ですか...(´・ω・`)ショボーン

あざーす

207 :login:Penguin:2006/11/05(日) 13:28:09 ID:RXI70RMP
誰か暇な人解いて

引数付(1〜5)で実行したshellが何を引数として入力
  したかを,switch文を使って表示させたい。

【その1】引数無し、もしくは引数が1〜5以外の場合
% ./test.sh
Invalid number.
%

【その2】引数が1〜5の場合
(5を入力した場合)
% ./test.sh 5
You have imput 5.


208 :login:Penguin:2006/11/05(日) 13:37:45 ID:i3mgyo4j
switch文なんてないから不可能だな。

209 :login:Penguin:2006/11/05(日) 13:41:46 ID:2kXaFaWm
揚足取り乙


210 :login:Penguin:2006/11/05(日) 13:45:34 ID:6dyarNgd
宿題は自分で。

211 :login:Penguin:2006/11/05(日) 14:56:58 ID:swozWI3K
マルチかよ…

212 :login:Penguin:2006/11/06(月) 00:02:57 ID:q5pzIs6H
お勉強中の素人です。

rsh 許されていないサーバとのやりとりを絡めた処理を
やらせる為 , 一部 expect を使おうと思っています。

で , expect の send は実行したいコマンドを " で括りますが
" 自体をコマンドで使いたい場合はどうすればいいのか
ワカランです。

教えてくだされ。


213 :login:Penguin:2006/11/07(火) 18:02:42 ID:uIiz0qVx
お舞らちょっと漏れの愚痴を聞いて下さいませんか。

今GNU findを使ってディレクトリツリーのファイル一覧を出力したんだが、
日本語(EUC-JP)の名前が付いたファイルが上手く表示されねぇ。

以前は同じ
$ find . -ls
なんかで、ちゃんと表示されてたのに。

仕方ねーから、man findをじっくり読んでみた訳よ。

 UNUSUAL FILENAMES
          :
   -ls, -fls
      Unusual characters are always escaped. White space, backslash,
      and double quote characters are printed using C-style escaping
      (for example '\f', '\"'). Other unusual characters are printed
      using an octal escape. Other printable characters (for -ls and
      -fls these are the characters between octal 041 and 0176) are
      printed as-is.

非ASCII圏は無視ですか。そーですか。
version 4.2からこんな仕様になっていたとわ… orz


214 :login:Penguin:2006/11/07(火) 18:07:07 ID:pP57+mqL
>>213
find . | nkf -e
でもしとけ。

215 :login:Penguin:2006/11/07(火) 18:16:17 ID:3/rl4qfJ
less なら文字化けしないんだけどね。

216 :login:Penguin:2006/11/07(火) 18:24:34 ID:uIiz0qVx
>>214
いや、だからfindが出力するファイル名自体が、既にASCIIで
\213\245\216\270...
になってるんですって。UNUSUALにされてしまうのです。

愚痴るだけではあれなので…
>>212
expectって結局はtclだから、\でエスケープ出来ない?
"command" なら "\"command\"" みたいに。


217 :213:2006/11/07(火) 18:32:30 ID:uIiz0qVx
上レス番号付け忘れますた。

>>214>>215
確かに-print系では、出力が端末以外なら、そのまま表示できますが、
-lsで一気に詳細情報まで得ようとすると、どうやっても勝手に変換と。

一々-exec ls -l {} \;とか-printfで指定してやらにゃならんのか… o...rz


218 :login:Penguin:2006/11/07(火) 18:36:55 ID:3/rl4qfJ
>>216
find に文句がいいたのですね。
「find でリストを作るのに nkf 噛ませないと行けないなんて find は使えねーな。」
ってことでしょうか。

219 :login:Penguin:2006/11/07(火) 20:06:37 ID:TyjbxAWs
>>218
nkf噛ませてもダメだから困ってるんじゃないの?

220 :login:Penguin:2006/11/07(火) 21:01:30 ID:3/rl4qfJ
>>219
nkf 噛ませれば問題ないよ。

221 :login:Penguin:2006/11/07(火) 22:05:32 ID:pP57+mqL
>>217
ああ -ls option の問題なのか。
いつも省略してた(-print が使われる)から分からなかった。
確かにASCIIになっちまうな。

これpatchないのかな?

222 :login:Penguin:2006/11/09(木) 22:18:47 ID:hxGsWwCw
patchつーかバグレポ対象だろ、これ。
少なくともlocale見て動けYO!位はいっていいんじゃない


223 :login:Penguin:2006/11/09(木) 23:07:28 ID:Fy+EWKU1
>>222
>patchつーかバグレポ対象だろ、これ。

バグレポートだけよりパッチつきで報告してくれるほうがはるかに有意義だ。

224 :login:Penguin:2006/11/18(土) 17:28:51 ID:IVoEU4qc
シェル変数$tstvar1がwhileループ内で局所されて?しまいます。
ループの外で参照するにはどうしたらいいですか?
ちなみにforループで違う感じにまわしてみたのですが$tstvar2は
局所されなかったとです。んん?
$ cat tst.sh
#!/usr/bin/env bash

seq 1 $1 | while read line ;do
tstvar1=$line
done

for i in $(seq 1 $1);do
tstvar2=$i
done

echo while loop last num is $tstvar1
echo for loop last num is $tstvar2
#=====================================

$ ./tst.sh 5
while loop last num is
for loop last num is 5


225 :224:2006/11/18(土) 17:32:22 ID:IVoEU4qc
m(_ _ )m
× 局所
○ 局所化

226 :login:Penguin:2006/11/18(土) 18:02:59 ID:6vMNnicg
zsh使え

227 :224:2006/11/18(土) 18:20:24 ID:IVoEU4qc
bashでおねがいしますm(_ _)m

228 :login:Penguin:2006/11/18(土) 22:20:15 ID:BOjrTH30
$ cat test.sh
#!/usr/bin/env bash

seq 1 $1 > /tmp/hogehoge.tmp
exec 3<&0 </tmp/hogehoge.tmp
while read line; do
tstvar1=$line
done
exec 0<&3 3<&-

echo while loop last num is $tstvar1
$ ./test.sh 5
while loop last num is 5

リダイレクト or パイプだとサブシェルが起きちゃうからファイルに落とさないとむりぽ.

229 :224:2006/11/18(土) 22:28:24 ID:IVoEU4qc
そかー、サブシェルになっちゃってたんですねえ。
すっきり&たすかりましたm(_ _)m


230 :login:Penguin:2006/11/18(土) 23:17:36 ID:dOjBUY29
ど初心者の質問で申し訳無いんだけど、単語を2列ずつにする
のってどうすればいいんですか?↓こんなファイルを

apple
but
chance
data
e-mail
funny

↓このようなファイルに変えたいんだけど、、、

apple but
chance data
e-mail funny

231 :login:Penguin:2006/11/18(土) 23:27:29 ID:qmA4jFhb
>>230
sed -ne 'N;s/\n/ /;p'

232 :login:Penguin:2006/11/18(土) 23:41:43 ID:qEn0qBZD
>>230
column -c 16 ファイル
はだめなんだろな。。。

233 :login:Penguin:2006/11/18(土) 23:42:31 ID:2K6k+fAl
paste - -


234 :login:Penguin:2006/11/18(土) 23:43:40 ID:KEL72rWc
>>224
bsh系で挙動が違うものの代表格だな。

kshだと、局所化されない。
bsh(V7やSolarisなど)は、局所化される。
bashも局所化される。

一方↓の場合、
while read hoge
do

done < fugafile

bsh(V7やSolarisなど)は、局所化される。
ksh、bashだと、局所化されない。



235 :login:Penguin:2006/11/19(日) 01:07:47 ID:75ySYxGK
>>231 >>233
ありがとうございます!めっちゃ感動しました

>>232
実はCygwinでやってるのだけれどcolumnコマンドが入ってなくて・・・

236 :login:Penguin:2006/11/19(日) 11:08:03 ID:PNiLk3lU
>>233
その手は知らなかった。

237 :login:Penguin:2006/11/21(火) 17:25:32 ID:RPVTOsSL
シェル関数について質問なのですが、シェル関数実行時に標準出力をファイル等にリダイレクトした場合には、
その関数はサブシェルで動作するとなっているのですが、何度試してもカレントシェルでの動作になります。
これは正常な動作なのでしょうか?
それともシェル関数をサブシェルで動作させるには他に何か条件があるのでしょうか?
因みにシェルはbashを使っています。

238 :あほ初心者:2006/11/22(水) 00:12:00 ID:IxrPWlIp
すいません
while文を使用したループで[条件1]もしくは[条件2]の場合ループを抜けるという
or条件を指定したいんですけど、
やり方が判らないです。。。。


どなたか教えてください。
↓↓↓の条件の[ $a -lt 3 ]に[&b_flg = "OFF"]というor条件を追加したい感じです。


-----------------
#!/usr/bin/

a=1

while [ $a -lt 3 ]
do
a=`expr $a + 1`
done

239 :login:Penguin:2006/11/22(水) 00:14:15 ID:bnqD2I+t
while [ $a -lt 3 -o b_flg = "OFF" ]

man test

240 :login:Penguin:2006/11/22(水) 00:16:08 ID:Q3Q+e0H3
whileで指定するのは、ループを「続ける」条件。

241 :login:Penguin:2006/11/22(水) 00:22:03 ID:bnqD2I+t
>>240
裏を取れば終了条件。
応用力0すか?

242 :login:Penguin:2006/11/22(水) 00:31:45 ID:8zJkxMvj
単に訂正しただけっしょ。

243 :login:Penguin:2006/11/22(水) 00:32:08 ID:JDMO7VWz
初めまして。突然失礼します。
学校の課題なのですが・・・

「ディレクトリ、/usr/binにある全ての実行可能ファイルのman一行出力をテキストファイルに書き出す。ファイルの数は膨大なので、スクリプトを書いて処理すること。」

このシェルをつくらないといけないんですけど
どなたか教えてください><

244 :login:Penguin:2006/11/22(水) 00:47:21 ID:2GKTJH4U
そりゃいかんだろ。しかも、何にも知らない学生に出すような課題じゃないし、せいぜい悪あがきすることだ。

245 :あほ初心者:2006/11/22(水) 00:49:03 ID:IxrPWlIp
レス有難うございます。

>>239
これやってみたら無限ループしちゃいました(泣)

>>240

カウンターが3未満の場合、かつフラグが"OFF"の間ループさせたいのです・・・・。

246 :login:Penguin:2006/11/22(水) 00:57:36 ID:jTQUwjrV
>>243
その課題、前にどっかのスレで見たな。
過去に同じ質問をしたおバカな先輩がいるみたいだな。w


247 :login:Penguin:2006/11/22(水) 01:29:46 ID:tazRDaIV
>>243
シェルって言うな。
教えてやんない。

248 :login:Penguin:2006/11/22(水) 01:48:04 ID:hxP9MaWC
>>243
ls /usr/bin | (while read f ; do whatis $f ; done) > shell_tte_iuna_baka.txt

249 :login:Penguin:2006/11/22(水) 09:10:37 ID:+iDbTTrl
>>239
×b_flg = "OFF"
◯$b_flg = "OFF"
でしょ。

>>245
>かつフラグが"OFF"の間
"かつ"ならor条件じゃなくand条件でしょ。
while [ $a -lt 3 -a $b_flg = "OFF" ]


250 :login:Penguin:2006/11/22(水) 09:55:53 ID:V6McRbrX
自分がスクリプト書くときは、繰り返す場合いっつもforつかいます。
それは、なんらかのバグがあったときにforならあるところまでで必ず止まるという
安心感があるからです。

ところが、このスレではwhileを使っている人を結構見掛けるのですが、
どういう時に繰り返し処理をwhileで書こうと考えているのでしょうか?

251 :login:Penguin:2006/11/22(水) 10:23:48 ID:UPqdXOUd
>>250
なんだなんだ?確認するが「シェル」スクリプトの話でいいんだよね?

forとwhileじゃ意味がずいぶん違うじゃん。whileは変数を束縛しないでしょ。
それと、実行前に範囲が決まらない処理なんていくらでもある。

252 :login:Penguin:2006/11/22(水) 10:27:53 ID:V6McRbrX
>>251
例えばtest1、test2...みたいなファイルを消す場合は

for i in `seq 1 1 9`; do rm test$i ; done
rm -f test??

みたいな感じでシェルスクリプト書いてるんですよ。
なんかバグってwhileで意図しないファイルまで消されてしまうような気がして、
あんまりwhileを使いたくないんです。気分的に。

ただ、whileならではの利点みたいなものが見えれば、whileを勉強する意欲が
湧くかなって思ったので、そのwhileの魅力みたいなモノがあれば教えていただければ
と思いました。

253 :login:Penguin:2006/11/22(水) 10:29:59 ID:hxP9MaWC
>>250
for(i = 0; i < MAX; i++) {
    printf("infinite loop\n");
    $i = 0; /* this code is fatal bug */
}

上記の通り、バグで止まるかどうかという意味ではforも同じです。
使い分けは、ループの意味で分けるのが可読性の観点で好ましいかと。
一定回数カウント、もしくはイテレータで繰り返してループするものにforを、
回数不定で特定の条件を満たすまでループするものにwhileを、というのが
一般的かと思われ。

254 :login:Penguin:2006/11/22(水) 10:38:06 ID:hxP9MaWC
ごめんCのこと書いた。

255 :login:Penguin:2006/11/22(水) 10:40:40 ID:V6McRbrX
>>253-254
なるほど、whileの使い分けとしては回数で止めるか、条件で止めるかということですか。

でもなんだろう、この自分の中の漠然としたwhileに対する不安感は、やっぱり
使ったことが無いからなのかもしれないですね…
whileの練習もかねて意識して使うようにしてみます。
ありがとうございましたm(_ _)m

256 :login:Penguin:2006/11/22(水) 14:15:34 ID:pcMmUayC
変数に"/"が入っている文字列を"/"部分だけ
"\/"にしたいのですが、
sedでできません。
誰か良い方法をご存知でしょうか?

test=test1/test2
sed "s/\//$test/g"

【実行結果】
sed: 1: "s/\//test1/test2/g": bad flag in substitute command: 't'


257 :login:Penguin:2006/11/22(水) 14:45:17 ID:o0UyRkyX
一番手っ取り早いのは、
sed "s|/|$test|g"


258 :login:Penguin:2006/11/22(水) 20:58:02 ID:/ICllq1f
誰も突っ込まないのは…釣り?


259 :login:Penguin:2006/11/22(水) 21:47:57 ID:bnqD2I+t
>>258
アホか。

260 :login:Penguin:2006/11/22(水) 22:14:13 ID:o0UyRkyX
しまった。つられた。

test=$(echo $test | sed "s/\\//\\\\\//g")
バッククォートなら、
test=`echo \$test | sed "s/\\\\//\\\\\\\\\\//g"`


261 :login:Penguin:2006/11/23(木) 00:05:41 ID:cxW9On4t
折角のLinux板なので
${test//\//\\/}
なんつーbash限定の方法は如何?


262 :login:Penguin:2006/11/23(木) 07:59:05 ID:CuFvrJz+
sugeeeeee

263 :login:Penguin:2006/11/23(木) 17:33:38 ID:RM/e3Lly
ぜんぜんすごくない。
典型的なキモい拡張の代表格じゃん。


264 :login:Penguin:2006/11/23(木) 18:51:01 ID:CuFvrJz+
>>263
別にお前がすごいと思おうが思わないだろうが関係ないよ。
俺がすごいと思っただけだから。

265 :login:Penguin:2006/11/23(木) 21:37:51 ID:9rWiEH/g
>>264
そして、そんなお前を俺はダセェと思ったんだ。


266 :login:Penguin:2006/11/23(木) 21:45:03 ID:i/t/5yj6
bash 限定なら便利だよね。

267 :login:Penguin:2006/11/24(金) 15:37:53 ID:QetvQUTA
こんにちは。

19/Nov/2006
19/Nov/2006
20/Nov/2006
21/Nov/2006
21/Nov/2006
22/Nov/2006

なファイルがあり、それぞれ数えて

19/Nov/2006 2
20/Nov/2006 1
21/Nov/2006 2
22/Nov/2006 1

としたいのですが、どすればいいでしょうか?ヒントでも良いので
お願いします!



268 :login:Penguin:2006/11/24(金) 15:50:58 ID:q4M0kGa+
uniq -c

269 :login:Penguin:2006/11/24(金) 15:56:39 ID:QetvQUTA
>>268
こんなに早く解答を頂いて、本当にありがとうございます!
とても助かりました。

270 :login:Penguin:2006/11/24(金) 18:24:46 ID:oYJh4kFu
test="A<タブ>B<タブ>C"
echo "$test" | while read in line
do
echo "$line"
done

を実行すると、
B<タブ>C
となってしまいます。

A<タブ>B<タブ>C
と得るにはどうしたらよいでしょうか?


271 :login:Penguin:2006/11/24(金) 19:13:41 ID:ZfQxSWxT
>>270

1. while read line

2. echo "$in<タブ>$line"

3. IFS='
'

好きなの使え

272 :あほ初心者:2006/11/25(土) 00:30:44 ID:PS7K2G+h
>>249

返事遅れてスイマセン。。。。
書いてある条件でやったらできました。-aや-oの指定方法理解できました。

有難うございました

273 :login:Penguin:2006/11/26(日) 05:31:22 ID:AL6bt30h
sedはignorecaseでのマッチングはできないんでしたっけ?

274 :login:Penguin:2006/11/26(日) 08:58:39 ID:pXTU5C4T
>>273
/regexp/I
とか
s/regexp/replacement/I
とか


275 :login:Penguin:2006/11/26(日) 12:59:06 ID:AL6bt30h
>>274
どうも。GNU拡張だったみたいですね。

276 :login:Penguin:2006/11/26(日) 13:11:11 ID:FneAj50i
sed、awk、tar、cpioはgnu版が一番。


277 :login:Penguin:2006/11/26(日) 13:14:41 ID:LjpahU1Z
GNU 版以外になんかあったっけ。

278 :login:Penguin:2006/11/26(日) 16:06:21 ID:bXQDH3xo
awkはgawkだよね < 正式名称(?)
tarもgtarだ

sedとcpioは?

279 :login:Penguin:2006/11/26(日) 20:31:37 ID:gEHgbYsL
>>278
gsedとicpo

280 :login:Penguin:2006/11/27(月) 00:15:49 ID:UE44ZgMS
>>278
http://www.gnu.org/software/tar/
別に gtar が正式名称ってわけじゃない。
OS 標準の tar が別にある場合に
それと区別するために
gtar というコマンド名でインストールされることがある、
ってだけ。

sed も cpio もそのまんま。
http://www.gnu.org/software/sed/
http://www.gnu.org/software/cpio/

281 :login:Penguin:2006/11/27(月) 01:47:31 ID:bWyCbzl1
ggrep …ぐぐれっぷ。

282 :login:Penguin:2006/11/27(月) 02:14:33 ID:B8mdaK4S
BSD系はGPL汚染を避けるために独自のunix toolそろってるよね。
今でも完璧にGPLフリーなの?

283 :login:Penguin:2006/11/27(月) 02:24:39 ID:UE44ZgMS
>>282
C コンパイラは gcc 使ってなかったっけ。
まぁ、詳細は UNIX 板で聞いてくれ。

284 :login:Penguin:2006/11/27(月) 02:25:13 ID:UE44ZgMS
GPL 汚染を避けるためってより
元からあるのを使い続けてるだけ。

285 :login:Penguin:2006/11/27(月) 02:46:22 ID:cP0Kjc7q
sedでもなんでもいいですけど、
ABC
DEF
GHI
という改行入りの文字列を
ABCDEFGHI
としたいのですが、
231 を真似て、
sed -ne 'N;s/%\n//;p'
としてみましたが、
ABC
と一行の場合は、空白になってしまいました。

どうすれば実現できますか?


286 :login:Penguin:2006/11/27(月) 03:00:07 ID:OelJATmM
>>285
while read line;
do
echo -n "$line"
done <<END
ABC
DEF
GHI
END

echo
----
とかではあかんの?

#>>285さんもお仕事中ですか?
#私の方は目途が付いたのでそろそろ仮眠入ります(=.=)

287 :login:Penguin:2006/11/27(月) 07:10:55 ID:Jc9GP2Cc
> 280さん
そうなんだ
正式名称ってわけではないのっすね
Solarisでびっくりした記憶が

むぅ
ねむい


288 :login:Penguin:2006/11/27(月) 07:50:47 ID:bqAw+xNf
>>285
tr -d "\n"

289 :login:Penguin:2006/11/27(月) 22:38:33 ID:0CtuQywK
アホな初心者なんだけど教えて!

$Aと$Bにはそれぞれ時刻が(xx:xx:xx)の形式で格納されているんだけど
これを$Aと$Bの比較を行いそれぞれ条件分岐で表現させたいんだが
どうすればいいだろう?

if文でずっと考えていたんだが
文字列と数列演算の比較しか調べても出てこなかった。

290 :login:Penguin:2006/11/27(月) 22:54:05 ID:Bw+6GoCc
>>289
$A と $B を date コマンドで変換して比較するとか。

date -d "$A" '+%s'

291 :login:Penguin:2006/11/27(月) 23:06:21 ID:Gl6W36sR
xxの部分が必ず二桁であるなら、言い換えれば、コロン除いて必ず6桁であるならば、

[ "`echo \$A|sed \"s/://g\"`" -eq "`echo \$B|sed \"s/://g\"`" ]
とか。

bash依存でいいなら、
[ ${A//:} -eq ${B//:} ]



292 :login:Penguin:2006/11/27(月) 23:09:28 ID:bqAw+xNf
>>289
:を削除すればいい

293 :login:Penguin:2006/11/28(火) 00:06:04 ID:9U2/5wlL
感動した

294 :login:Penguin:2006/11/28(火) 00:23:02 ID:fFcPBnEd
あるファイルの一部(何行もある)を違うファイルに書き換えるのはどうやるの?
例えば、

aaa aaa aaa
aaa aaa aaa
abc 1 2
abc 3 4
bbb bbb bbb

というファイルを

abc 1 10
abc 3 20

と言うファイルを使って

aaa aaa aaa
aaa aaa aaa
abc 1 2 10
abc 3 4 20
bbb bbb bbb

にしたいんだけど。。
どえらく行があって普通にsedの置換する行を書かせて実行したら
一日で終わらないくらい時間がかかってしまって。。。
もしくは、行単位で置換じゃなくて、数行単位で置換は出来ないのでしょうか?

偉い人教えてください。

295 :login:Penguin:2006/11/28(火) 00:37:14 ID:ve7hOhUi
sed -e 's/abc 1 2/abc 1 2 10/gc' -e 's/abc 3 4/abc 3 4 20/gc' <input.txt
とか。

296 :login:Penguin:2006/11/28(火) 00:54:27 ID:S83lGj9/
>>295
そのabc 1 2ってところがファイルの内容によって変わるから-eでは指定できなくて
困ってんじゃないの。

俺ならperlに逃げるが、...
どうしてもsedでやるなら、「2番目のファイルから>>295のようなsedスクリプトを
生成する」というスクリプトをsedなりawkなりで書くんだろうな。


297 :login:Penguin:2006/11/28(火) 01:38:28 ID:hlMS5leM
294だけどそれを数だけ書いて実行したらどえらく時間がかかってしまって…

298 :login:Penguin:2006/11/28(火) 02:13:27 ID:S83lGj9/
マルチ。
ttp://pc8.2ch.net/test/read.cgi/tech/1112553783/

速度向上の話はシェルスクリプトの話というよりアルゴリズムの話なのでは。
そっち方面のスレの方が相手にしてもらえる。

遅いだろな。>>296-297の話だと「1番目のファイルの行数×パターンファイルの行数」
回だけパターンマッチを繰り返すんだからさ。

パターンが正規表現じゃなく固定文字列&対象フィールド固定でいいみたいだから、
ハッシュ表の応用が吉。2番目のファイルのパターン指定部分をkeyとして、
dbmとかRDBとかいろいろ速い方法がある。

299 :login:Penguin:2006/11/28(火) 07:24:19 ID:tF5D3BVE
タグで抽出してからいじれ

300 :login:Penguin:2006/11/28(火) 15:20:17 ID:OR43oAVg
いずれにせよ行指向なシェルスクリプト+αにゃ不向きだな。
置換したい行の位置が変わってもよければまだなんかありそうだが。

301 :login:Penguin:2006/11/30(木) 15:18:39 ID:qADJb4/Z
シスログなどのファイルからエラー項目を取り出して、
対象となるデーモンをリスト化したファイルとマッチさせて
対象があれば正という処理をしたいんですが
参考となるスクリプトを掲載したHPはありますか?

考えられるキーワードでググっても出てこないので
困ってます。

302 :login:Penguin:2006/11/30(木) 15:29:18 ID:VjTlzCpk
grepで済むと思うが

303 :login:Penguin:2006/11/30(木) 15:48:37 ID:qADJb4/Z
で、問題はこれを5分間隔でやっているので
その間に発生したエラーログのみ監査対象が限定されるのです。

シスログの日付とlocaltimeを比較しないとダメなんです。

304 :login:Penguin:2006/11/30(木) 19:53:42 ID:5H/Ib3vS
ならdateとgrepで済むと思うが

305 :login:Penguin:2006/11/30(木) 20:45:11 ID:bn6C4MA9
>>303
最近のsyslogdなら、名前付きパイプに対応してる。
FIFO経由で順次処理の方が良いんじゃね?


306 :login:Penguin:2006/12/01(金) 19:53:40 ID:gsraXxcw
ところで、シスログなどのファイルをリストとして読み込むには
皆どう処理してる?

307 :login:Penguin:2006/12/01(金) 23:24:27 ID:+exVUFbt
>>294
awkで書いて見た。久しぶりに使ったけど便利だな。
BEGIN{
while( getline p < ARGV[1] >0){
split(p,a," ")
word[ a[1] + a[2] ] = a[3]
}
ARGV[1] =""
}
{
if( word[ $1 + $2 ] != "" ) {
print $0 " " word[$1 + $2]
} else print $0
}


308 :login:Penguin:2006/12/02(土) 11:18:13 ID:MFbNlyXD
>>307
ちょっとだけ修正
word[$1 + $2]は
word[$1 + " " + $2]の方がいいかも
word[$1 + $2]だと "abc" + "1"が"abc1"になるので
"abc" + "1"と"ab"+"c1"が両方とも"abc1"になってしまう。
>>294のように文字数が一定なら問題ないけど。
まあ実用にするんだったらもっとあちこちいじらないとダメだな。

309 :login:Penguin:2006/12/02(土) 14:12:26 ID:9wM9eGR+
>>307,308
それマルチ
http://pc8.2ch.net/test/read.cgi/tech/1112553783/448
http://pc8.2ch.net/test/read.cgi/tech/1112553783/453-456

つーかよく仕様を読み取ったな。
あっちのスレで追加ヒントを出されたけど
全く法則性をつかめなかった。IQ低いんだな>オレ

310 :login:Penguin:2006/12/02(土) 15:15:50 ID:IOXyzmke
一万行あったら終らない。

311 :login:Penguin:2006/12/02(土) 16:40:12 ID:h1TrJh+k
スクリプトでなんともできない量なんだったら、
いっそCで組むなりDBにいっぺんつっこんでなんかで処理するなりしたほうが。

>>303
1. いっぺんログ(a)を全部コピる(b)
2. 5分たったら(b)の行数分だけ(a)からはじいて更新行だけ抜く(wcなりtailなりdiffなり)
3. 抜いたものに処理かまして1.に戻る

312 :login:Penguin:2006/12/02(土) 17:04:04 ID:6y2Ykjot
以下のような配列から

20061201120000 **** ***** ****
20061201130000 **** ***** ****
20061201132000 **** ***** ****
20061201132100 **** ***** ****

while文で上のリストを読み込んだときに
左1番目の日付記録と現在の記録を比較して
5分以内のみを取り出して別のファイルに読み込ませる
ということを行いたいです。

whileとifの組み合わせでうまくいかないんですが
皆さんならどう書きますか?

313 :login:Penguin:2006/12/02(土) 17:28:33 ID:h1TrJh+k
まずは自分がどう書いたかだ。

314 :308:2006/12/02(土) 18:00:30 ID:RMFwKrIK
>>308
おおボケかましてた。
>word[$1 + $2]だと "abc" + "1"が"abc1"になるので
"abc" + "1" は 1 だった。
+を抜いて word[$1 " " $2]こうしないと
BEGIN{while(getline < ARGV[1]) word[$1 " " $2] = $3; ARGV[1] = ""}
{ if(word[$1 " " $2]){ $4 = word[$1 " " $2]
#ここも追加
}else delete word[$1 " " $2];
print $0
}

END{for( s in word) print s "=" word[s];}
これで見るとif(word[$1 " " $2])の時にwordに追加されるようで
でかいファイルでやってたらメモリが足りなくなる。でdelete を追加。
>>294のデータでのテストならちゃんとした結果が出るが
実際のデータでやってたらおかしな結果になったんだろうな。
危ない危ない。もうない事を祈ってorz

315 :login:Penguin:2006/12/02(土) 18:08:46 ID:HEbI++rQ
ふつーに word[$1, $2] でいいのではないかと。
多次元配列のように見えるけど、実体は word[$1 SUBSEP $2] という
組み込み変数 SUBSEP で連結しただけの1次元配列。


316 :login:Penguin:2006/12/02(土) 21:01:28 ID:6kGljnD5
こんな感じかな?

gawk 'BEGIN{ filt=strftime("%Y%m%d%H%M%S",systime()-300) } $1>=filt{ print }'  < 元ファイル > 新ファイル名

317 :login:Penguin:2006/12/03(日) 00:26:39 ID:A8uHmA87
>>312
(d=`date -d -5min +%Y%m%d%H%M%S`; while read l r; do if [ "$l" -gt "$d" ]; then echo "$l $r"; fi; done) < list > other

318 :312:2006/12/03(日) 13:51:58 ID:N72hre3c
>317
ありがとうございます。

私は今こんなスクリプトで書いていますが検討もつきません。


cat /var/log/errlog | sed -e "s/Jun/1/g" | sed -e "s/Nov/11/g" | sed -e "s/://g" | awk '{print $1$2$3}'

これらをwhileでまわしてどう比較させるのか、まったくわからん・・

319 :login:Penguin:2006/12/03(日) 14:14:55 ID:73paMa8k
>>312と違うじゃねーか

320 :login:Penguin:2006/12/03(日) 14:16:41 ID:73paMa8k
ああ現在の記録の方か

321 :login:Penguin:2006/12/03(日) 14:28:51 ID:0bKgPd66
質問です。

a.aaaa.aaaa.aaaa.a
b.b
cccccc.c.c.cc.ccccc

のような内容のファイルがありまして、最後の.から右側だけを取り出したいのですが、
sedだとどうやるんでしょうか。

$ sed -e '/^(.*)\.(.*)/\2'

のようなやり方だと、後方参照の数字が分からないで困ってます。


322 :login:Penguin:2006/12/03(日) 15:45:30 ID:Wi7dHq2/
\.([^\.]+)$

323 :login:Penguin:2006/12/03(日) 16:23:52 ID:/7urMGDU
それ何てAA?

324 :login:Penguin:2006/12/03(日) 16:24:47 ID:Wi7dHq2/
\.([^\.]+)$ プギャー

325 :login:Penguin:2006/12/03(日) 17:48:15 ID:/7urMGDU
>>324
ご本人殿、馬鹿に付き合ってくれてありがとう

326 :321:2006/12/03(日) 17:50:37 ID:0bKgPd66
>322
ありがとうございます。

しかし、

$ cat list | sed -e 's/\.\([^\.]+\)$/\1/'
a.aaaa.aaaa.aaaa.a
b.b
cccccc.c.c.cc.ccccc

となってしまいます。何故だろう。

327 :login:Penguin:2006/12/03(日) 17:56:48 ID:Wi7dHq2/
>>326
括弧をエスケープしている理由は?

328 :login:Penguin:2006/12/03(日) 17:59:35 ID:73paMa8k
sed 's/^.*\.//g'

329 :login:Penguin:2006/12/03(日) 18:00:43 ID:73paMa8k
あgいらんわ

330 :login:Penguin:2006/12/03(日) 18:24:02 ID:wqiGXln8
foreach line (`cat file`)
foreach> echo $line:e
foreach> end

とかいう技がある。csh/zsh だけどね。

331 :login:Penguin:2006/12/03(日) 23:38:29 ID:tvcBgjra
IFS=.
while read line
do
set set ${line}
eval "echo \"\$$#\""
done

POSIX な sh なら動くと思われ。
取り敢えず、ash/ksh/bash それと emulate sh/emulate ksh な zsh では確認。


332 :login:Penguin:2006/12/04(月) 16:05:09 ID:+d1incKQ
cut -d\. -f2- list
が最短?

333 :login:Penguin:2006/12/04(月) 17:04:06 ID:CaDaOOn9
>>332
課題を勘違いしているんじゃない?
ピリオドの個数は不定。おれなら
>>328だな。



334 :321:2006/12/04(月) 17:16:11 ID:IolELO07
>328
すげー。ありがとう。

335 :login:Penguin:2006/12/05(火) 17:59:40 ID:IE2lurje
>>333
> ピリオドの個数は不定。
だから -f 2- なんだと思うが


336 :login:Penguin:2006/12/05(火) 18:03:00 ID:IE2lurje
あ、ごめん「最後の.から」か

337 :login:Penguin:2006/12/05(火) 19:48:57 ID:W6tEWDj4
rev | cut -d. -f1 かな。


338 :login:Penguin:2006/12/05(火) 23:19:56 ID:wgUuRSHI
いろいろ覚えるの面倒だからなんでもawkでやってしまう。
jgawk -F. "{print $NF}"


339 :login:Penguin:2006/12/06(水) 00:12:40 ID:CvZE1xbv
\.([^\.]+)$ プギャー


340 :login:Penguin:2006/12/06(水) 11:42:56 ID:F61ky2gC
>>339
うわっ、勉強になる。

341 :login:Penguin:2006/12/08(金) 21:51:15 ID:OUKkAuJR
カレントディレクトリにあるflvをflv2mpeg4を使ってaviに変換するために
以下のようなスクリプトを書いています。
#!/bin/sh
for file in `ls`
do
case "$file" in
*.flv)
flv2mpeg4 $file `echo $file|sed -e "s/\.flv$//"`.avi
;;
esac
done

しかし、flvのファイル名にスペースがあると(cat vs dog.flvみたいな)
dog.flvというファイルを変換しようといてしまいます。空白を含むファイル名
も正常に変換するにはどのように書けばよいのでしょうか?
初歩的な質問かと思いますが宜しくお願いします。

342 :login:Penguin:2006/12/08(金) 22:45:09 ID:K296GRSh
てか、なんでcase "$file"と自分からquoteしておきながら、
flv2mpeg4 $fileの方はquoteせんのんのん?不思議や。

343 :login:Penguin:2006/12/08(金) 23:15:36 ID:0k4TWnD+
>>341
for file in *.flv
do
flv2mpeg4 "$file" `basename "$file" .flv`.avi
done

344 :login:Penguin:2006/12/08(金) 23:56:18 ID:ssJkS4Av
>>343
`…` もクオートせんと、単語分割されるかと。
"$(…)" を使うか、可搬性をあげたいなら
basename=`…` と、一旦変数に格納するか。

ま、俺だったら
for file in *.flv
do
flv2mpeg4 "$file" "${file%.flv}.avi"
done
だな。


345 :341:2006/12/09(土) 00:39:41 ID:1jyOluzm
うほっ出来ました。
目的のことよりもたくさんの知らないノウハウを得ることが出来ました。
皆さん本当にありがとうございました。

346 :login:Penguin:2006/12/10(日) 00:18:58 ID:Mc1jnefY
画像とかで名前だけ違って中身が同じファイルがあることがよくあるので
ファイルのサイズが同じファイルがあれば表示するようなのを
つくろうと思っているんですが、可能ですよね?

347 :login:Penguin:2006/12/10(日) 00:23:09 ID:UGTkob0M
>>346
ls -lなりstatなりでサイズを取得しつつ、
sort (適当なフィールド) |uniq -d とかすればいいんじゃね。

サイズ同じで実は違うファイルって言うレアケースも、
md5とかのハッシュ使えば判別できるだろ。

348 :login:Penguin:2006/12/10(日) 00:45:09 ID:Mc1jnefY
>>347
サイズをうまいこと受け取ることができるか不安ですが
ありがとうございます。やっぱりできそうですね。

重複を自動で消すのもかんがえましたが手違いがあったら恐いので
サムネイルでも確認しながら手動で消すことにします。

349 :login:Penguin:2006/12/10(日) 06:51:16 ID:MWK4NznI
>>348
サムネイルで確認すると言うことは画像ビューアを使うと言うことだよね?
それなら、重複画像検索機能つきの画像ビューアを使った方がはやいかも。
重複画像判定アルゴリズムを再発明する必要はないと思う。

350 :login:Penguin:2006/12/10(日) 07:04:36 ID:b4TTam1n
cmp では何か問題ある?

351 :login:Penguin:2006/12/10(日) 07:21:30 ID:MWK4NznI
>>350
>>346に書いているだけの内容ならcmpで十分だと思うけど、Exifを削除しただけで
同じ画像にもかかわらず違うファイルと判定されるので、>>346はすぐに限界に気が
つくと思う。

352 :login:Penguin:2006/12/10(日) 19:07:23 ID:PO4Qw5VE
>>346
つ findimagedupes


353 :login:Penguin:2006/12/11(月) 13:41:55 ID:lI3TknAe
>>352
おぉぉぉ、これは便利そうな。
精度と速度のバランスがどれくらいか分からないけど、Shellスクリプトから使える
のは何よりもありがたい。

354 :login:Penguin:2006/12/12(火) 00:25:50 ID:as9nLGl7
>>353
md5sum位取ったほうがいいと思う。

355 :login:Penguin:2006/12/12(火) 17:31:57 ID:o5CvLJw/
「夜23時からから朝の7時以外ならcommand実行」
というスクリプトを書きたいのですが、いい方法ないでしょうか?


356 :login:Penguin:2006/12/12(火) 17:34:12 ID:RcAGTw46
>>355
`date +%H` を比較。

357 :login:Penguin:2006/12/12(火) 18:50:49 ID:RHWRLnjb
>>349 >>351
わかりました。
そのような既存のソフトは結構あるようなので
そういうのを使います。

358 :login:Penguin:2006/12/12(火) 20:23:22 ID:IQmW0Qdp
>>355

 #!/bin/sh
 test `date +%H -d '+ 1 hour'` -gt 8 || exit
 ...



359 :login:Penguin:2006/12/12(火) 20:24:26 ID:IQmW0Qdp
>>358 はウソ。あまり考えずに書いてしまった。スマソ

360 :355:2006/12/13(水) 00:12:01 ID:0m8saZaP
>356
>358
ありがとう。

>359
参考になりますよ

361 :login:Penguin:2006/12/13(水) 00:28:02 ID:wD1iJX11
あるディレクトリにファイルが沢山入っていて、
更新時間が早いファイル順に並べて(ls -t)、そのうちの上から20%のみを移動させたい
のですが、いい方法はないでしょうか?

それt、lsって絶対パスでファイル名を表示させるオプションはないでしょうか?



362 :login:Penguin:2006/12/13(水) 00:37:26 ID:HWFZg9B3
>>361
for i in `find .`;do `pwd`/$i;done

363 :login:Penguin:2006/12/13(水) 00:43:43 ID:+9i4LQPP
>>362
なんで全ファイルを実行してるのかよくわからんが
素直に find `pwd` でよくね?

364 :login:Penguin:2006/12/13(水) 00:59:38 ID:oKdbScyz
>>355
case文使うとすっきりと書けるかも。まぁ、書き方次第だけど。
ttp://www.tsden.org/takamiti/shText/shText040.html#H445

>3 の 参考リンクに入ってないのね。
Bourne Shell 自習テキスト
ttp://www.tsden.org/takamiti/shText/shText.html

>>361
> 上から20%
ls -t | head -n $((`ls -1 |wc -l`*20/100))

> 絶対パスでファイル名を表示させる
ls じゃないけど。
alias fullpath='find "$PWD" -maxdepth 1 -iname '
とか。

365 :login:Penguin:2006/12/13(水) 01:28:13 ID:2eV8BPJU
>>384
「Bourne Shell 自習テキスト」は、リダイレクトのところが誤解を与える説明になっている。
というか、間違っている。

366 :361:2006/12/13(水) 13:04:20 ID:9APFlcGm
ありがとう


367 :login:Penguin:2006/12/14(木) 00:30:25 ID:QtGEecw2
ディレクトリに多くのファイルが入っていて、とある日付より前のファイル、
例えば「最終修正時刻が2006年12月01日より以前のだけを抜き出す(表示)」
ということをしたいのですが、シェルスクリプトで何とかならないでしょうか?


368 :login:Penguin:2006/12/14(木) 00:57:03 ID:QOHqlL4t
touch -t 200612010000 /tmp/hoge.$$ && find /dir \! -newer /tmp/hoge.$$ && rm /tmp/hoge.$$


369 :login:Penguin:2006/12/16(土) 19:09:54 ID:bwKTijT0
>>367
こんなのみつけた
ttp://d.hatena.ne.jp/bonlife/20061130/1164879026

つーか、もれも今日の日付-1日をcp rm したいww


370 :login:Penguin:2006/12/16(土) 19:35:09 ID:bwKTijT0
date --date '1 day ago' +%Y%m%d

なんだよ!あるんじゃん!計算しそうになったよウワァァァァァァヽ(`Д´)ノァァァァァァン!

371 :login:Penguin:2006/12/17(日) 00:03:59 ID:XYESYa/3
GNU date は超便利。
man をじっくり読んでみることを勧める。

ttp://www.linux.or.jp/JM/html/GNU_sh-utils/man1/date.1.html

372 :login:Penguin:2006/12/17(日) 15:45:21 ID:waTrWC3J
【やりたい事】
2ちゃんねる過去ログの任意のレス番カキコを手動あぼーんしたい。

【やりかけている解決法】
2ちゃんねるログは1行1レスの書式なので、まずあぼーんしたいレス番をファイルdeathnoteに
書き連ね、それを読み込んで指定行ごとに置き換え処理をするスクリプトabonerを作る。

ファイルAの中身(例:
1
3
5
---------------------------------

スクリプトabonerの中身:
#!/bin/bash
INS="deleted<> <> <> <>"
for i in `cat $1`
do
sed -i.bak -e "${i}s:rst:${INS}:" $2
done
----------------------------------

$ ./aboner deathnote xxx.dat
これで一応望みの結果は得られるのだが、どうもスマートじゃない。
実際処理時間は、300kB程度の1000到達ログの400件あぼーん処理を
Athlon3000+で約10秒。
sed以外(awk,perl)は使えません。
forで毎度sedを呼び出さず、sed一度で済む方法があれば教えてください。


373 :login:Penguin:2006/12/17(日) 16:02:41 ID:ma/9yUXs
sed 's/$/s:rst:deleted<> <> <> <>:/' dethnote | sed -f- xxx.dat

rst って文字列を置換してるようなのでそうしてるけど、rst って何だ?


374 :372:2006/12/17(日) 16:37:55 ID:waTrWC3J
>>373
即レス感謝です。
すいません。rstはテスト用の適当な文字列で無意味です。


一行で出来るとは素晴らしい。処理の負荷も格段に減らせそうです。
提示していただいた式をヒントに、自分の目的を完全に満たすように更に詰めて。
後でまた報告します。

重ねてありがとうございました!

375 :login:Penguin:2006/12/17(日) 19:07:29 ID:kFxhwkRU
OS X のdateは、GNU date じゃないので注意....

自分で作ったものだとPerl で timelocal 使って計算しているな〜

376 :login:Penguin:2006/12/17(日) 19:22:38 ID:BBDLOkoZ
この板で他の OS の話持ち出されても。

377 :login:Penguin:2006/12/17(日) 19:56:17 ID:+OjoWrzp
>>375のようないかにもLinuxしか知りませんてのはこの板だから許されるんだから
おおめに見てやろうや。

378 :login:Penguin:2006/12/30(土) 19:13:34 ID:adXoO7Rz
bashのスクリプトで
ファイルの容量が一定以上の場合指定の処理を行う
という記述はどのようにすればいいでしょうか
わかるかたいましたらお願いいたします。

379 :login:Penguin:2006/12/30(土) 19:36:50 ID:4fg7i+ry
>>378
du 見るとか?

380 :login:Penguin:2006/12/30(土) 20:02:13 ID:P/BrJqjU
>>378
find使うとか?

381 :login:Penguin:2006/12/30(土) 20:06:52 ID:YV5QCFu5
>>378
expr使うとか?


382 :login:Penguin:2006/12/30(土) 20:55:02 ID:NVlno1NV
>>378
stat してみるとか?

383 :login:Penguin:2007/01/01(月) 02:35:15 ID:gGttB+5K
>>378
duの出力を見るとか?

384 :login:Penguin:2007/01/02(火) 18:40:10 ID:Y0JKQGy+
標準エラー出力は 2>/dev/null とかで捨てることができます。
でもシェル内部コマンドだとこれが有効でないようです。
echo aaa > test.txt
chmod 000 test.txt
echo aaa > test.txt
bash: test.txt: 許可がありません
echo aaa > test.txt 2>/dev/null
bash: test.txt: 許可がありません

echo の場合も標準エラー出力を捨てたいのですが、
なにか方法はありますか?

385 :login:Penguin:2007/01/02(火) 18:48:22 ID:KMUyfSJk
それ、echoじゃなくてbashのエラーだと思われ。

386 :login:Penguin:2007/01/02(火) 21:09:23 ID:yDyfLOy+
exec 2>/dev/null


387 :login:Penguin:2007/01/03(水) 01:24:17 ID:Ox0JiAuq
>>384
なぜ chmod 000 ?

388 :login:Penguin:2007/01/03(水) 01:29:25 ID:WLOPTjPE
>>384
外部コマンドでもいっしょだよ。
/bin/echo aaa >test.txt 2>/dev/null
とかやってみ。

389 :login:Penguin:2007/01/03(水) 01:43:53 ID:/NxK5E4v
内部、外部関係ないですね。
シェルでリダイレクトする部分でエラーになるんですね。

chmod 000 の意味はとくになくて、"w"のビットを
落としたかっただけです。

横着せずに echo する前に適切に chmod することにします。

390 :login:Penguin:2007/01/03(水) 01:43:57 ID:OuzmBlen
>>388
?


391 :login:Penguin:2007/01/03(水) 01:45:03 ID:OuzmBlen
>>389
>>386無視かよ。一生正月休みのない仕事やってろ

392 :login:Penguin:2007/01/03(水) 01:49:23 ID:WLOPTjPE
>>390
何?

393 :login:Penguin:2007/01/03(水) 01:54:26 ID:/NxK5E4v
>>386,391
すんません、exec 2>/dev/nullでうまくいきますね。
サンクス。

394 :login:Penguin:2007/01/03(水) 08:39:41 ID:OuzmBlen
>>392
おかしなこと言ってるな。と思って。

395 :login:Penguin:2007/01/03(水) 08:46:01 ID:WLOPTjPE
>>394
どこがおかしい?

396 :login:Penguin:2007/01/03(水) 08:49:12 ID:OuzmBlen
>>395
>>389の序盤に全て書いてある。

397 :login:Penguin:2007/01/03(水) 08:57:26 ID:WLOPTjPE
>>396

>>389
> 内部、外部関係ないですね。
> シェルでリダイレクトする部分でエラーになるんですね。
のこと?
まさにこれを言いたかったんだけど。

398 :login:Penguin:2007/01/03(水) 09:07:53 ID:OuzmBlen
>>397


399 :login:Penguin:2007/01/03(水) 09:40:15 ID:Ox0JiAuq
>>398
内部 - bash 組み込みコマンドのecho
外部 - /bin/echo

400 :login:Penguin:2007/01/03(水) 09:42:36 ID:OuzmBlen
>>399
ああ、思い出した。
何検討違いなこと言ってんだ。と言うお話だった。



401 :login:Penguin:2007/01/05(金) 00:43:02 ID:SpssQH6A
質問です。

ファイル名が1行につき1つリストアップされているファイルfilelistが
あって、for文でそれを処理したいとき、以下のようにするとスペースを
含むファイル名のものをうまく処理できません。
何か良い回避方法ありますか?

for i in `cat filelist`
do
ファイルに対して何か処理
done

引数として渡した場合は「"$@"」を使えばいいんですけど・・・


402 :login:Penguin:2007/01/05(金) 00:57:47 ID:SePWUXtZ
>>401
for i in "`cat a.txt`"
do
echo "$i"
done
とか?

403 :login:Penguin:2007/01/05(金) 10:08:32 ID:J9H1NsPK
>>401
(
while read filename
do
"${filename}" に対して何か処理
done
) < filelist


404 :login:Penguin:2007/01/05(金) 10:11:34 ID:lTMToYro
IFS いじるとか。

405 :login:Penguin:2007/01/05(金) 20:17:26 ID:KSH0pMyZ
>>403
対象がファイル名ならあまり心配はないかもだけど一応
read -r filename

406 :login:Penguin:2007/01/05(金) 20:21:02 ID:dDYuFLde
while read line
do
python youtube-dl "$line"
done < "$@"

こんな感じのは?
俺がyoutubeからリストで落とすときに使ってるやつw

407 :401:2007/01/06(土) 03:01:07 ID:Gq/KqTu1
すいません遅くなりました。

>>402
これだと1回で一度にa.txtのすべての行を処理するようです。
ただ、引数として改行を渡す方法は始めて知りました。
これはこれで後で使わせていただきます。

>>404
おっしゃりたいことは分かるような気がするのですが、実現できず。
精進します・・・

>>403,405,406
なるほど。readを使うのは考えつきませんでした。
これで意図したとおり動作しました。

みなさんありがとうございます。

408 :login:Penguin:2007/01/09(火) 17:23:42 ID:EYsJqTIr
今初めてShell Scriptを作成しています。
バックアップ用のShell Scriptなのですが、

フルバックアップディレクトリ内のファイルとバックアップ対象ディレクトリ内のファイル群を比較し、
  1. 変更前の古いファイル(差分)を抽出して「昨日の日付名のディレクトリ」に追い出し、
  2. 変更後の新しいファイル(新規作成ファイルを含む)をフルバックアップディレクトリに追加して、最新の状態にしたいです。

更新されたファイルをチェックして、古いものを昨日のディレクトリへ移し、最新のファイルを最初に作成したバックアップディレクトリに追加するという処理をしたいです。
最新のファイルが存在するバックアップディレクトリは、バックアップが実行されるたびに、その実行日名にリネームします。

で、今こんな感じなのですが、ご助言を頂けないでしょうか?

#/bin/sh
back=backup
kyou=$(date '+%y%m%d')
kinou=`date --date '1 days ago' '+%y%m%d'`
mkdir /$back/$kyou
if test -d /$back/$kinou -a -e /$back/$kinou ; then
#mv /$back/$kinou/* /$back/$kyou/
rsync -vrpogtu --delete /data/ /$back/$kyou
else
rsync -vrpogtu --delete /data/ /$back/$kyou
fi

1.バックアップ元とバックアップ先のファイル群を比較する方法が分かりません。
2.比較の結果の変更前の古いファイル(差分)だけを抽出して昨日のディレクトリにコピー
する方法が分かりません。
3.変更後の新しいファイル(新規作成も)をフルバックアップに追加して最新の状態にする
方法が分かりません。
よろしくお願いします・・・
# 当方本当にシロウトです。

409 :login:Penguin:2007/01/09(火) 19:23:46 ID:pUBkJWsW
>>408
rsyncとかbontmiaでぐぐると幸せになれると思う。



410 :login:Penguin:2007/01/09(火) 20:08:36 ID:EYsJqTIr
>>409
rsyncもpdumpfsも知っているのですが、このbontmiaって言うのは何ですか?
ググったのですが、「これさえあれば他のバックアップツールはたぶんいらない」とか
「まさに rsync + pdumpfs なバックアップツール」とかそんな事しか書いてないので
具体的にどういう動作をするのか分かりません。
それから、2007/01/08/data みたいな深い階層がイヤで
070108 みたいなフォルダに差分抽出更新バックアップをかけていきたいのです。
そういうソフトが無いのでShell Script書くしかないと思っています・・・

411 :login:Penguin:2007/01/09(火) 20:10:49 ID:EYsJqTIr
>>409
Archive structure
The archives is placed in a directory structure like this:

2003/05/06/04:00/
2003/05/07/04:00/
2003/05/08/04:00/
2003/05/08/05:00/
2003/05/08/06:44/

これはひどい・・・・時間まで入ってさらに階層が深くなってるOTL

412 :login:Penguin:2007/01/09(火) 20:19:26 ID:EYsJqTIr
Windowsにはこれと同等の事をしてくれるソフトウェアがあります。

Fabre
http://hp.vector.co.jp/authors/VA004777/fabre.html
です。
これと同等の事をLinuxのShell Scriptでやりたいのですが、
お力をお貸し頂けないでしょうか?

413 :login:Penguin:2007/01/09(火) 20:47:25 ID:WQQJu8++
>>412
希望する仕様の詳細が不明だけど、
1. diff -rq sourcedir backupdirで変更されたファイル一覧を作成
2. 1 の出力から、sourcedirだけに存在するものをのぞけばファイルリストができるから、
それらを cp -p で backupdir2 にコピー
3. rsyncでbackupdirを最新版のバックアップに
4. ディレクトリ名は適当にリネーム


414 :login:Penguin:2007/01/09(火) 21:22:06 ID:EYsJqTIr
>>413
アドバイスありがとうございます。
[root@host root]# mkdir test
[root@host root]# cd test/
[root@host test]# mkdir dir1 dir2
[root@host test]# touch dir1/a.txt dir1/b.txt dir2/a.txt dir2/c.txt
[root@host test]# diff -rq dir1/ dir2/
dir1/だけに発見: b.txt
dir2/だけに発見: c.txt
[root@host test]#
このようになるわけですが、b.txtを除くわけですよねぇ。しかし
"dir2/だけに発見: "という文字列が邪魔で、その出力結果を例えば・・・
# tmp=`diff -rq dir1/ dir2/`
# cp -p $tmp backupdir2
のような事が出来ません。(それプラスに、1レコードずつ処理させる方法が・・・)
ん〜と、1レコードずつ処理させるには・・・ファイルに落としてしまって・・・
# diff -rq dir1/ dir2/ > list.txt
# for i in `cat list.txt` ; do cp -p dir2/$i backupdir ; done
ってやるんですかねぇ・・・?1レコードずつ処理させる方法がコレであってるなら
後は邪魔な文字列を消す方法をお願いします・・・

415 :login:Penguin:2007/01/10(水) 01:54:14 ID:LIhvffG+
>>414
こんな感じか
LANG=C
DIR1="dir 1"
DIR2="dir 2"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done
リストにはディレクトリも出てくるから cp には -r もつけた方がいい

416 :login:Penguin:2007/01/10(水) 01:58:50 ID:yw0ncsb2
>>408
いまいち仕様がよくわかんないんだけど、
rsync の --copy-dest とか --link-dest あたりじゃだめ?

417 :login:Penguin:2007/01/10(水) 17:27:06 ID:schDu+VD
>>415
わけがわからないですが、とりあえずコピペして実行してみます。

>>416
pdumpfsと同じような動作をするようですのでダメです。
pdumpfsがなぜいけないかというと
1.ディレクトリが深すぎる。 2007/01/08/ のように掘るのではなくて
070108/ と1個作ってくれるとありがたいです。
2.全てのファイルが各日付フォルダの中にある。
ココが一番困るところで、更新したファイルのみが過去のフォルダに残っていってくれると
この日にこのファイルを更新したのだと分かりやすくていいのですが・・・
ハードリンクで更新したファイルも更新してないファイルも全部残っているでしょう?
それがまずいんです。
もしよろしければ
Fabreの仕様
http://hp.vector.co.jp/authors/VA004777/report/fabre2.html
をお読みくださいませんか?
私の方からも簡単に説明いたしますと・・
まず一回目実行した時にLinuxのdateコマンドの # date '+%y%m'で得られる形式の
フォルダが作成され、そこにバックアップ対象フォルダ内のファイル及びフォルダが
全てコピーされます。最初の1回だけはタダのコピーです。
その後2回目の実行(1日過ぎて)で、また日付フォルダが作成されます。
一回目が070110(今日)なら、二回目は070111フォルダが作成され、
バックアップ元の更新されたファイル、追加されたファイルが070110フォルダに
追加され、070110の中身が全て070111(明日)フォルダに移動されて、当日更新した
ファイルの、更新前の古いファイルのみが070110(今日)フォルダに残ります。
そして明後日実行した時に、070112フォルダが作成され、070111フォルダに
バックアップ元の更新されたファイル(差分)のみが追加され、070111の内容が全て
070112フォルダに移動され、明日更新したファイルの更新前の古いファイルのみが
070111(明日)フォルダに残ります。以後この繰り返しです。
ココの方が分かりやすいかも http://www.vector.co.jp/magazine/softnews/030806/n0308062.html
ちょっと説明が難しいですかね・・・私の口から言うよりサイトを見て頂いた方が分かりやすいかもです。

418 :login:Penguin:2007/01/10(水) 17:33:20 ID:yw0ncsb2
>>417
1はスクリプトの組み方しだい。
2は、いわば --move-dest みたいな機能があればいいのかね。
rsync ソースいじってみたら?
開発元に送ったら組み込んでくれるかもよ。

419 :login:Penguin:2007/01/10(水) 17:58:29 ID:XxKrpdwb
>>417
日本語メッセージは扱いにくいのでロケールをCにして英語メッセージにする
diff -rqの出力は3種類。DIR1だけにあるファイル、DIR2だけにあるファイル、両方にあって内容が異なるファイル。
2番めと3番めのパターンだけを抽出して、sedの正規表現で望む形式に変換

特に難しいことはない。あと数行足せばやりたいことが完結するはず

420 :login:Penguin:2007/01/10(水) 19:26:20 ID:schDu+VD
>>418
既に完成されたソフトウェア(pdumpfs)なので、それを改造するなんてそんなスキル
ありません。--move-dest とは?
http://www.google.com/search?num=50&hl=ja&safe=off&q=move-dest&lr=lang_ja
rsyncのソースをいじるなんてとんでもない。C言語を少しかじった事がある程度ですよ?
そんな人間がそんな事してるときっと破壊するwwww
>>419 なるほど、それで>>415様がLANG=Cしてるのね。ちなみにsed使った事ありませんし、正規表現も全く知りませんので不可能です。
で、自分なりに書いてみたスクリプトがこれ!
backup.sh
#/bin/sh
kyou=`date '+%y%m%d'`
kinou=`date --date '1 days ago' '+%y%m%d'`
list=`date '+%y%m%d'-list`
mkdir -p /backup/$kyou
if test -d /backup/$kinou -a -e /backup/$kinou ; then
./list.sh >> ./$list
mv -f /backup/$kinou/* /backup/$kyou/
for targ in `cat ./$list` ; do mv /backup/$kyou/$targ /backup/$kinou/ ; done
rsync -av /data/ /backup/$kyou/
else
rsync -av /data/ /backup/$kyou/
fi
同じディレクトリ内に list.sh
#/bin/sh
LANG=C
DIR1="/data/"
DIR2="/backup/`date --date '1 days ago' '+%y%m%d'`"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done  どうですか?(行数の制限で改行がきつい^^;)


421 :login:Penguin:2007/01/10(水) 20:36:43 ID:8kc1szcz
>>420
pdumpfsの階層が深いとは自分も思う。
ので、それを改造した版を数年実運用しています。
ハードリンクの方もどうにかなるんじゃないかと。

422 :login:Penguin:2007/01/10(水) 21:23:12 ID:schDu+VD
[root@vine backupset]# ./backup.sh
mv: ``/backup/070111//backup/070110/PineNet.txt'' を stat できません: そのようなファイルやディレクトリはありません

となっちゃいました。あと少しで完成なのにっ 惜しい!!!!
PineNet.txtだけを更新して、dateコマンドでシステムの日付を明日にして
シェルスクリプトを実行してみたところ、その更新したファイルのファイル名はとれてる
のですが、どうやらディレクトリ、フルパスが余計なようです?多分。。

恐れ入りますが、ファイル名だけを取得するにはどのように改良すればよろしいのでしょうか?
もう少しで完成しそうなのでお付き合い頂けるとコレに勝る喜びはありません。

423 :login:Penguin:2007/01/10(水) 21:28:34 ID:KG4OWone
>>422
basename

424 :login:Penguin:2007/01/10(水) 22:33:04 ID:schDu+VD
>>423
ありがとうございます!コレで完成!と思ったのですが・・・
[root@vine backupset]# ./backup.sh
mv: ``/backup/070111/070111-list'' を stat できません: そのようなファイルやディレクトリはありません

backup.sh
#/bin/sh
kyou=`date '+%y%m%d'`
kinou=`date --date '1 days ago' '+%y%m%d'`
list=`date '+%y%m%d'-list`
mkdir -p /backup/$kyou
if test -d /backup/$kinou -a -e /backup/$kinou ; then
    ./list.sh >> ./$list
    basename ./$list > ./$list
    mv -f /backup/$kinou/* /backup/$kyou/
    for targ in `cat ./$list` ; do mv /backup/$kyou/$targ /backup/$kinou/ ; done
    rsync -av /data/ /backup/$kyou/ >> ./$kyou-rsync.log
else
    rsync -av /data/ /backup/$kyou/
fi

同じディレクトリ内に list.sh
#/bin/sh
LANG=C
DIR1="/data/"
DIR2="/backup/`date --date '1 days ago' '+%y%m%d'`"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done
もうちょぃ〜とで完成なんですが、何が悪いんでしょうか?よろしくお願い致します。

425 :login:Penguin:2007/01/10(水) 22:37:59 ID:schDu+VD
おっと、操作手順は
まず backup.shを実行
これは正常に成功して、/backup/070110/ の中に /data/の内容がrsyncでフルコピー
されました。
そして
# date 011122052007
とかやって、明日の日付にシステムを変更しました。
さらに、/data/PineNet.txt ファイルを修正して上書き(つまり更新)しました。
その状態で
# ./backup.sh
を実行すると上記のようになりました。

426 :login:Penguin:2007/01/11(木) 05:58:05 ID:Wc2SZsMb
>>424 なんかぐちゃぐちゃだな・・・
ちゃんと試してないから責任は持たんけどこんな感じだろ。
backup.sh:
#/bin/sh
DATADIR=/data
BACKUP_BASEDIR=/backup
KYOU=`date '+%y%m%d'`
KINOU=`date --date '1 days ago' '+%y%m%d'`
BACKUPDIR_KYOU=${BACKUP_BASEDIR}/${KYOU}
BACKUPDIR_KINOU=${BACKUP_BASEDIR}/${KINOU}
BACKUP_TMPTAR=${BACKUP_BASEDIR}/${KYOU}-tmp.tar
CWD=`pwd`
if [ -d ${BACKUPDIR_KYOU} ]; then
echo Backup directory for today ${BACKUPDIR_KYOU} already exists. Aborting.
exit -1
fi


427 :login:Penguin:2007/01/11(木) 05:59:01 ID:Wc2SZsMb
if [ -d ${BACKUPDIR_KINOU} ]; then
echo Saving changes from yesterday...
mv -f ${BACKUPDIR_KINOU} ${BACKUPDIR_KYOU}
mkdir -p ${BACKUPDIR_KINOU}
rm -f ${BACKUP_TMPTAR}
touch ${BACKUP_TMPTAR}
cd ${DATADIR}
${CWD}/list.sh ${BACKUPDIR_KYOU} . | while read i; do
tar uf ${BACKUP_TMPTAR} "$i"
done
cd ${BACKUPDIR_KINOU}
tar xvf ${BACKUP_TMPTAR}
cd ${CWD}
rsync --delete -av ${DATADIR}/ ${BACKUPDIR_KYOU}/ >> ./${KYOU}-rsync.log
else
echo First-time to run the script. Making a full backup...
mkdir -p ${BACKUPDIR_KYOU}
rsync -av ${DATADIR}/ ${BACKUPDIR_KYOU}/ >> ./${KYOU}-rsync.log
fi
echo Done.

428 :login:Penguin:2007/01/11(木) 05:59:45 ID:Wc2SZsMb
list.sh:
#/bin/sh
LANG=C
if [ $# != 2 ]; then
exit
fi
DIR1="$1"
DIR2="$2"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2\:" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done

429 :login:Penguin:2007/01/11(木) 07:12:51 ID:Yy3UVr2t
>>426
rsyncは--deleteしない方がいい。でないと、削除されたファイルがどこにも残らない。
それか、削除されたファイルも前日のバックアップに含める方がいい。

430 :login:Penguin:2007/01/11(木) 15:11:14 ID:HFTeqEfF
技術のない奴程、ディレクトリが深いとか文句を言い、
技術のある奴程、あまりいじらず、そのまま想定された使い方をする

431 :login:Penguin:2007/01/11(木) 15:32:58 ID:jLeCsuJN
ちゃんとチェックしてないけどこんな感じ?
`find ...` ってあふれるとマズいんだっけ。

#/bin/sh
BACK=/backup
KYOU=`date '+%y%m%d'`
KINOU=`date --date '1 days ago' '+%y%m%d'`
mkdir $BACK/$KYOU

if [ ! -d $BACK/$KINOU ]; then
rsync -v -a /data/ $BACK/$KYOU
else
rsync -v -a --link-dest=$BACK/$KINOU /data/ $BACK/$KYOU
cd $BACK/$KINOU
for i in `find . -type f`; do
[ $i -ef ../$KYOU/$i ] && rm $i
done
for i in `find . -depth -type d`; do
rmdir --ignore-fail-on-non-empty $i
done
fi


432 :login:Penguin:2007/01/11(木) 15:54:52 ID:Zf+fVL9G
>>431
へえ、rsync --link-destってそうやって使うのか、勉強になった。俺の長いスクリプト無駄orz
Linuxのハードリンクの利点も生かせるし、無理に元の仕様にあわせずrsync --link-dest
そのまま使った方がいいな。検索したらそのままのがあった。
ttp://slashdot.jp/~ruto/journal/362588

for i in `find ...`はファイル名に空白があるときおかしくなるっぽい。
find ... | while read で回してるのはそのため。

433 :login:Penguin:2007/01/11(木) 15:59:24 ID:jLeCsuJN
>>432
あぁ、空白があったか。
このくらいなら find の -exec に押し込んじゃってもいいかも。

434 :login:Penguin:2007/01/11(木) 17:16:55 ID:XF9G0sx9
特殊ファイルのことを考えてないけど
rsyncを使わずに素直に書いてみた。

#!/bin/bash
src=${1%%/}
dst=${2%%/}
today=`date +%y%m%d`
yesterday=`date -d 'yesterday' +%y%m%d`
mkdir -p "$dst/$today"
find "$src" -type f | while read i; do
name=${i##$src}
tn=$dst/$today$name
yn=$dst/$yesterday$name
td=`dirname "$tn"`
if [ ! -e "$td" ]; then
mkdir -p "$td"
fi
if [ ! -e "$yn" ]; then
cp -p "$i" "$tn"
elif [ "$i" -nt "$yn" ]; then
cp -p "$i" "$tn"
else
mv "$yn" "$tn"
fi
done

435 :login:Penguin:2007/01/11(木) 17:26:23 ID:jLeCsuJN
>>420
> --move-dest とは?
rsync -v -a --move-dest=$BACK/$KINOU /data/ $BACK/$KYOU
で済んだらいいのにな、って話。
開発元に投げたら作ってくれるかもよ。
http://samba.anu.edu.au/rsync/bugzilla.html

>>432
> 俺の長いスクリプト無駄orz
「俺」が誰かわからんからどのスクリプトのことかわからん。

436 :424:2007/01/11(木) 22:00:07 ID:qzcPBdsk
>>426
初めてシェルスクリプトと言うのをほとんど無学で書いたので、そりゃーぐちゃぐちゃですよ。
可能な限りトレースしてみましたが、
if [ -d ${BACKUPDIR_KYOU} ]; then
echo Backup directory for today ${BACKUPDIR_KYOU} already exists. Aborting.
exit -1
で、1日2回以上実行した場合は最新に更新しないんですね。1日に1回しか実行できないと。
それより1日に何回でも実行できますが(基本的には1日に1回しか実行しないけど)、
その実行をするたびに/dataディレクトリの状態を${KYOU}ディレクトリへ反映した方がいいかな。

${CWD}/list.sh ${BACKUPDIR_KYOU} . | while read i; do
ここらへんも良く分からないOTL。

>>429
そうですそうです。前日のバックアップディレクトリに含めるんです。

>>430
お恥ずかしい限りです。精進します・・・

>>431>>434
もう全然分からないOTL

>>435
そのコマンド一発で一気に出来てくれると助かりますねぇ。
しかし開発元に投げるって、そんな事したことが無くて全然投げ方とか分かりません。
それに英語で書く必要があるんですよねえ。英語できなくて・・・。
もっとシェルスクリプトの書き方、各コマンドを知るって事をしないとダメですね。
$kyou とか私は記述していますが、 ${KYOU}のように皆さんは記述されていますね。
{ } で囲んだ方が見やすいとは思いますが、大文字にしないといけないのでしょうか?
しなくてもいいなら ${kyou}でもいいと思うのですが、見易さの観点から大文字ですか?

437 :login:Penguin:2007/01/11(木) 22:05:53 ID:jLeCsuJN
>>436
たとえば $kyou の直後に空白を入れず x と表示したいときに
echo ${kyou}x と書かなきゃいけない。
変数名を大文字にするのは、まぁ、慣習だ。

だれでも最初ははじめてだよ。

438 :login:Penguin:2007/01/11(木) 22:19:57 ID:jLeCsuJN
>>436
> それより1日に何回でも実行できますが(基本的には1日に1回しか実行しないけど)、
> その実行をするたびに/dataディレクトリの状態を${KYOU}ディレクトリへ反映した方がいいかな。
そうなるとだいぶ話が変わってくるな。
からっぽのディレクトリを作ってそこにコピーするのと
内容が入ってるディレクトリを更新するのとでは
やり方はかなり違う。
そういう仕様は先に言ってほしい。

> >>431>>434
> もう全然分からないOTL
どこがわからない?

439 :login:Penguin:2007/01/11(木) 22:36:21 ID:ryWqaD7B
だから素直に pdumpfs を改造すれば良いのに。

440 :424:2007/01/12(金) 00:33:12 ID:LG5Wdg1W
>>437
なるほどなるほど、って事はこれからは${KYOU}って書きますね〜ありがとうございます。

>>438
http://hp.vector.co.jp/authors/VA004777/fabre.html
ぶっちゃけこのソフトと同じ動きをしようと思っているんですが・・・
私一人の力ではsedとか正規表現とか分からなくて、アルゴリズムもそんなに強くないので
協力をお願いしています。仕様・・ん〜・・このサイト見ても詳しい事は分からないのかな・・

分からないところは聞いて教えてもらうようなところではないほど基本的なところなので
自分で学びます。具体的にはrmdirのオプションとかrsyncの--link-destの動きとか・・・。
で、
name=${i##$src}
src=${1%%/}
dst=${2%%/}
↑これは教えていただけませんかねぇ・・・調べにくそうなので・・

ん〜細かいところ分からないところ多いですが、もっとシェルスクリプトを学んでから
質問しないと皆様に悪いです。あまりにも私のレベルが低すぎるので。それも聞かなくても
自分で解決できるところも多々あります。時間を見つけて学びます。
C言語のfor文やif文、while文とは勝手が違って困惑しております^^;
基本的なコマンドをまずは知り尽くさないとダメですね。

シェルが分かったらLinuxに明るくなれそうな気がしたもので・・・。
ただ専門学校の勉強(情報専門学校ですw)もあって時間がなかなか微妙なので
まとまった時間が欲しい〜。資格試験の勉強とかでシェルスクリプトの勉強する時間が・・

441 :login:Penguin:2007/01/12(金) 00:59:54 ID:2F+P/e1j
>>440
> name=${i##$src}
> src=${1%%/}
> dst=${2%%/}
man bash で ## とか %% で検索すれば出てくるよ。
具体的には Parameter Expansion のとこ。

身の上話には興味ありません。

442 :login:Penguin:2007/01/12(金) 01:02:30 ID:GSHPBNFo
学生ほどまとまった時間がとれる身分はないのにみすみす逃すとは何ぞな


443 :login:Penguin:2007/01/12(金) 01:22:18 ID:ovCGtQUd
>>436
>それより1日に何回でも実行できますが(基本的には1日に1回しか実行しないけど)、
>その実行をするたびに/dataディレクトリの状態を${KYOU}ディレクトリへ反映した方がいいかな。
それをすると例えば、今日の1回目と2回目の実行の間に削除されたファイルは
${KINOU}にも${KYOU}にも残らなくなる。いくつかシナリオ考えてみるといい。
一日一フォルダの仕様をやめれば自然に解決できるけど。
Fabreっていうソフトで一日に複数回バックアップを実行するとどうなるの?

444 :login:Penguin:2007/01/12(金) 01:34:25 ID:U4rFYhBs
シェルスクリプトの中でsedで置換したファイルを作成したいんだけど、

#!/bin/sh

sed -e "s/abc/ABC/" testfile > testfile1


こうしてもtestfile1の内容はtestfileのままになってしまいます。
プロンプトから実行すればうまくいくのですが。。

解決策おしえてください。


445 :login:Penguin:2007/01/12(金) 01:55:54 ID:ovCGtQUd
>>444
sed -i

446 :444:2007/01/12(金) 02:02:45 ID:U4rFYhBs
うーん。自己レスします。何故かRedhat9だと普通にできて
ES3だとできない。

447 :login:Penguin:2007/01/12(金) 02:28:57 ID:2F+P/e1j
>>444
なんかの環境変数が違うのかな。
それかカレントディレクトリが違うとか。

448 :login:Penguin:2007/01/12(金) 02:44:04 ID:GSHPBNFo
まさか改行コードとか

449 :424:2007/01/12(金) 03:25:37 ID:LG5Wdg1W
>>441
教えてくださりありがとうございます、読んでみます。

>>442
うちの専門学校は忙しいんですよ。

>>443
Fabreで1日に複数回実行した場合は・・・
まず1回目実行した場合は
070112A
というフォルダが作成されて、フルバックアップ
次は 070113A 070114A と言う風になるのですが
1日に複数実行すると
070113A 070113B 070113C のようにアルファベットがドンドンついていきます。
このアルファベットは分かりにくいし1日のバックアップをそんなに残す必要は無いので
やめて、070113フォルダを最新に更新し続けるって事でいきたいなと。

450 :login:Penguin:2007/01/12(金) 04:26:45 ID:P1PDcxdt
>>449
>1日に複数実行すると
>070113A 070113B 070113C のようにアルファベットがドンドンついていきます。
そうなってる理由の一つが>>443なんだろう。元の作者は考えて作ってるんだから、
そこだけ勝手に変えたら破綻するだけ。
なぜ破綻するかはシェルプログラミングの問題じゃなく設計の問題。
仕様を先に決めろと言われてるのはそういうことだ。

451 :424:2007/01/12(金) 08:09:02 ID:LG5Wdg1W
>>450
なるほど。
学校でも設計やりますが、ぶっちゃけ仕様書を書くより先にプログラムを作って
それから仕様書を書きたくなりますが、そうじゃなくてしっかり仕様を決めて、それから
って事ですか・・。
と言う事はつまり、やっぱりA、B、Cと作っていかないと1日のうちに削除されたファイルが
バックアップするのを日をまたげば残されますが、日をまたがずに複数回バックアップした
場合に消滅しちゃうって事ですね・・・。しかし日付を取得するだけでも精一杯なのに
順番にA B Cと取得って・・・
for targ in A B C D E F G ・・・ Z ; do hogehoge ;
ってやるんですかねぇ・・・

452 :424:2007/01/12(金) 08:14:11 ID:LG5Wdg1W
書き忘れましたが、もう1つ勝手に変えてるところがあります。

Fabreではバックアップする際、ディレクトリ構造ごとバックアップします。
つまり/data/foo/var/hoge/hoge.xls
が更新された場合は
/backup/foo/var/hoge/hoge.xlsと保存されると言う事ですが
私が書いたシェルスクリプトだと
/backup/hoge.xls
とディレクトリ構造が消滅します。まぁ単純にディレクトリ構造を保持する方法が
分からなかったのと、ディレクトリまで掘らなくてもいいんじゃない?と
思ったからなんですが・・・。

それから、WindowsXPのデフォルト設定だとファイルを「更新してない」のに
開くだけで更新日付が変わってしまい、内容が同じなのにタイムスタンプが違う
というだけでバックアップ対象に含まれちゃうんですが、Fabreではこういうことが
おきないみたいです。この辺のこともどういうアルゴリズムなのか分かる方
いらっしゃいますか?

453 :login:Penguin:2007/01/12(金) 11:35:37 ID:ovCGtQUd
>>451
一日に26回以上実行したらどうすんの?
>>452
>ディレクトリまで掘らなくてもいいんじゃない?
バックアップ対象に同名のファイルが複数あったらどうすんの?
>Fabreではこういうことがおきない
タイムスタンプでなく内容を比較してるのでは?知らんけど。

他の人が貼ってるやつで十分動くから、実用に使いたいだけならそれ使えば?
勉強のためにやってるならいいトレーニングになるかもね。

454 :login:Penguin:2007/01/12(金) 12:32:47 ID:qjap1L0P
>>453
Z→AAだろ。
なんにせよ、発想もやり取りも場当たり的だね。破綻するよ。
バックアップは確実に取れてなんぼ。

455 :login:Penguin:2007/01/12(金) 12:35:12 ID:2F+P/e1j
CVS とかその手のやつの方が要求満たしたりしないかな。

アリモノを上手く使う方法を考えた方がいいよ。
スキルないのにいろいろやりすぎ。

456 :login:Penguin:2007/01/12(金) 12:38:26 ID:qjap1L0P
そうそう。
ディレクトリの階層が深いと言われているけど、それも理由があるよ。
毎回のバックアップディレクトリが全て同じ階層に並んだら
後々、色々と面倒なことが起こるんだよ。

457 :login:Penguin:2007/01/12(金) 12:47:35 ID:qjap1L0P
>>456
なんか Fabre とやらを見てみたけど、どうなの?
最新のバックアップフォルダが消えたらほぼ全滅じゃん。

458 :login:Penguin:2007/01/12(金) 13:35:16 ID:GSHPBNFo
いますごい自演を見た

459 :login:Penguin:2007/01/12(金) 14:12:44 ID:qjap1L0P
? どこがどう自演なのかさっぱり

460 :login:Penguin:2007/01/12(金) 16:00:36 ID:C3zXrohG
自作自演というより、多重人格だなw


461 :login:Penguin:2007/01/12(金) 16:18:33 ID:XHaWtrFv
459は、456なのかな、457なのかな。
精神科医さん、よろしく診断おながいします。

462 :424:2007/01/12(金) 16:35:41 ID:LG5Wdg1W
>>453
>一日に26回以上実行したらどうすんの?
はっ! と思ったけど>>454がZ→AAでなるほどっ!と思ったw。
っていうか一日にそんなにたくさん実行しないと思いますけど・・・。
>バックアップ対象に同名のファイルが複数あったらどうすんの?
すっかり抜けていました。確かに、同名のファイルが他のディレクトリにあった場合は
おかしくなりますね、下手したら上書き。片方消えちゃいますね。。。あちゃー
だからFabreは階層も保存対象なんだ・・・。なるほどなるほど。抜けだらけですね。
>タイムスタンプでなく内容を比較してるのでは?知らんけど。
内容を比較する事はdiffコマンドで出来ますか?
>他の人が貼ってるやつで十分動くから
どれが一番いいですかねぇ・・・ぶっちゃけ完璧にトレースする事が出来ないので
どれを選んでいいか分からないです・・・。まぁ勉強のためでもありますけど、
とりあえずは動く事が急務かな・・・。
>>456
>後々、色々と面倒なことが起こるんだよ。
面倒な事とは?少し具体的な例をあげて教えていただけ無いでしょうか?
その場合はバックアップ元に最新の全データが残っているので大丈夫です。
しかしバックアップ元と最新のバックアップフォルダの両方が同時に消えるって事は・・・
そうそうないと思うんですが・・・それを言ったらミラーリングだって同時に消えたら?
って事になるわけで・・・。

とりあえず皆様の話から
1.階層を省いてバックアップは不可能、階層付でバックアップする
2.一日に複数回実行した場合はバックアップ先の${KYOU}のディレクトリを最新に更新する
つまり1日に複数回実行した場合、その日のうちに更新したファイルは残らない事になるけど
ぶっちゃけそこまで細かい単位で残す必要は無い(1日単位で十分)ので。

となると、1個問題が・・・ list.shで出力されるファイルリストからファイル名の部分を除いた
そのファイルまでのパスのみを抜き出したtempファイルも出力して
# mkdir ${temp}
を実行しないといけませんよねぇ・・・。となるとまだsedとか正規表現が・・・分からないOTL

463 :424:2007/01/12(金) 16:38:37 ID:LG5Wdg1W
>>462
>その場合はバックアップ元に最新の全データが残っているので大丈夫です。
以下は
>>457
>最新のバックアップフォルダが消えたらほぼ全滅じゃん。
へのレスです。抜けてましたすみません。

464 :login:Penguin:2007/01/12(金) 17:09:04 ID:qjap1L0P
自演の意味が分かった。アンカーミスくらいスルーしてくれ。

>>462
一つのディレクトリに大量のファイル・ディレクトリがあると
ファイルシステムにもよるが、パフォーマンスがすこぶる悪くなる。
それと、スクリプトで * なんて指定しようものなら、
引数が長過ぎって怒られることもしばしば。
cugwin の方が顕著に起こるね。

また、バックアップディレクトリとオリジナルが同時に消えても
pdumpfs なんかだと大丈夫でしょ。

465 :424:2007/01/12(金) 18:23:13 ID:LG5Wdg1W
>>464
なるほど・・・そういう理由があるんですか・・・
でもそれはLinux系OSを使う場合ですかねぇ?
私がバックアップするファイルはWindowsのファイルなんですが、
LinuxのSambaで
backup data の二つを見えるように設定して
backupはSambaからだとRead Only。dataは自由に書き換えてOK
Windows版のrsyncでバックアップしてもいいし、"ばっちり同期"っていうソフトを使って
バックアップしてもいいし、とにかくWindows側からLinuxのSambaサーバに毎日
自動的にdata ディレクトリと同期を取る。
後はLinuxサーバが自動的にdataディレクトリの中をbackupディレクトリへ
毎日差分で保存していくと。そういう使い方をしますが、それでも、やっぱりパフォーマンスが
すこぶる悪くなるんですかねぇ。

466 :login:Penguin:2007/01/14(日) 03:43:28 ID:hrd0bfGL
ディレクトリ内で「rm *」と入力すると「rm: `.' や `..' は削除でき
ません」と表示されるんだけど、表示させないようにするにはどうすればいい?

467 :424:2007/01/14(日) 04:09:06 ID:xucnhoE2
>>466
# rm -rf *
って実行したらそれ表示されないけど・・・・

468 :login:Penguin:2007/01/14(日) 04:27:28 ID:TnmlbjBR
# rm -rf /
じゃないの?

469 :424:2007/01/14(日) 04:44:18 ID:xucnhoE2
シェルスクリプトって、C言語のfor文みたいな命令は無いのですか?
例えば、ある一連の処理を50回実行したいとかいった場合に
for(i=0;i<50;i++){
一連の処理
}
と言う具合に出来ないでしょうか?

470 :login:Penguin:2007/01/14(日) 05:07:50 ID:ceP06q+s
>>469
http://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO-7.html

471 :424:2007/01/14(日) 05:35:44 ID:xucnhoE2
>>470
ありがとうございます。

#/bin/sh
for i in `seq 1 100`;
do
/root/backup.sh
date --set '1day';
done

で、出来ました。1日に1回実行するから、最初は1日ずらしてはbackup.shを
実行していたのですが、手間がわずらわしくなって、シェルスクリプトでこれも
やっちゃえるんじゃない?とか思ったので。
シェルスクリプトって凄いですね。これ人間の手で手動で100回やってたら
途方も無い労力・・・・

472 :login:Penguin:2007/01/14(日) 09:36:48 ID:+7O9gpFP
>>469
for ((i=0;i<10;i++)); do echo $i; done;
がつかえる。

473 :424:2007/01/14(日) 12:40:25 ID:xucnhoE2
>>472
おおお!まさにこれ!こっちの方がC言語しか知らない私にはあってます!
ありがとうございます。
ところで、最後の done の後には ; はいらないんじゃ?無くても動きましたよ。

こういう風にした方がseqコマンドに依存しないんだ・・・

474 :login:Penguin:2007/01/14(日) 12:42:11 ID:/t47kKMl
でも bash 依存なので、#!/bin/sh じゃなくて #!/bin/bash と書こうね。

475 :424:2007/01/14(日) 12:44:40 ID:xucnhoE2
>>474
いや、#/bin/sh で動作しましたよ
って書こうと思ったけど
/bin/sh は /bin/bashへのシンボリックリンクでした。なるほどです。

476 :424:2007/01/14(日) 13:57:05 ID:xucnhoE2
家の掃除が面倒です。毎回決まった作業をします。
シェルスクリプトで出来ませんか?

477 :login:Penguin:2007/01/14(日) 14:11:44 ID:ceP06q+s
>>476

#!/bin/bash
rm -rf ~

これを毎日cronで回せばいい。

478 :424:2007/01/14(日) 14:20:44 ID:xucnhoE2
>>477
wwww
家→homeディレクトリ
だからhomeの掃除→homeディレクトリ内のファイルを全削除
だからそうなるのか・・・w いや、冗談に付き合ってくれてありがとうw

479 :login:Penguin:2007/01/14(日) 15:49:54 ID:aKEUOG0O
>>473
tcshの方が合ってるんじゃないか?

480 :login:Penguin:2007/01/14(日) 16:38:34 ID:+7O9gpFP
>>473
じゃあ、操はもらった。

481 :424:2007/01/14(日) 20:24:17 ID:xucnhoE2
>>480
はぁ?w

482 :login:Penguin:2007/01/14(日) 21:34:39 ID:+7O9gpFP
C言語しか知らない私

483 :424:2007/01/14(日) 21:45:06 ID:xucnhoE2
>>482
面白い事を言っているのかもしれませんが、ネタの意味が分かりません。
なので笑えません。申し訳ない。

484 :login:Penguin:2007/01/14(日) 22:46:33 ID:OBZ/18Sv
カスが

485 :login:Penguin:2007/01/18(木) 07:40:47 ID:TIv0wXG8
Fedoraを使用してシェルの勉強をしています
文字列関連でわからないところがあり 行き止まってしまいましたのでお力を貸していただけないでしょうか

質問なのですが
testディレクトリの中に存在しているファイルの名前をExistenceFile.txt
に吐き出してあげようと思っています
testディレクトリにある多くのファイル名は 「xxxxx ffffff rrrrrr」 というように半角スペースが所々に入ってしまっております
その状態で下記を実行しますと

#!/bin/sh
FILE=`find /test -typef`
for I in $FILE
do
FILE_NAME=`basename "$I"`
echo $FILE_NAME >> ExistenceFile.txt
done

結果が
20060712
backup
file
等とスペースがあるところで改行されてしまいます
これを 改行なしで1行でExistenceFile.txtに吐き出す方法はありませんでしょうか


486 :login:Penguin:2007/01/18(木) 07:53:50 ID:8c0Vf/8/
find /test -type f | while read I; do

487 :login:Penguin:2007/01/18(木) 07:57:51 ID:olwbHUJd
>>485
find /test -type f -printf '%f\n' >>ExistenceFile.txt

488 :login:Penguin:2007/01/18(木) 08:15:38 ID:TIv0wXG8
ありがとうございます
findの後にいろいろつけたらいけそうな気がしてきました


489 :login:Penguin:2007/01/18(木) 09:54:27 ID:XQRzhywB
>>487
findの -printf ってすげぇ便利だね。
初めて知った。

490 :login:Penguin:2007/01/21(日) 02:21:35 ID:ghTDpHMf
xxxx from xxx.xxx.xxx.xx(xxxはIP)
hoge
tcp/ip
とかこんなのがたくさん書かれてあるファイルがあります。
その中から xxx.xxx.xxx.xxのIPの部分だけを抽出したいのですが
それをやるにはsedでどのようにすればよいのでしょうか?
1レコードずつ取り出してfor文で回して処理したいのです。

491 :login:Penguin:2007/01/21(日) 03:05:34 ID:9+Sse8vK
>>490
sed でのやり方はわからないけど
awk 使うと簡単だと思う。

492 :login:Penguin:2007/01/21(日) 03:37:59 ID:BjKyxjKB
sed -e 's/^.*from //g'

493 :login:Penguin:2007/01/21(日) 04:29:07 ID:lWHcz2jx
grep -o -P '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

GNU grep 限定。
範囲チェックはしてない。


494 :login:Penguin:2007/01/21(日) 13:47:55 ID:iD0A2i+i
マルチに答える奴かっこわるい

495 :login:Penguin:2007/01/21(日) 16:19:44 ID:ghTDpHMf
マルチじゃないですよ。

496 :login:Penguin:2007/01/23(火) 01:28:07 ID:hmxMcsrh
はわわ〜

497 :login:Penguin:2007/01/23(火) 22:52:57 ID:yZ01wUCk
いやそっちのマルチじゃなくって。

ダウンを5名勧誘すると
問屋になれてダウンの売り上げの18%が
懐に入るようになるやつの方。

498 :login:Penguin:2007/01/24(水) 00:09:06 ID:1/cr3eFo
>>497
他人のボケを潰してまで言いたいボケかね。

499 :login:Penguin:2007/01/29(月) 15:30:34 ID:qD+Ol7pJ
UNIX板の方から来ました。

797 :名無しさん@お腹いっぱい。 :sage :2007/01/29(月) 14:38:20
若干スレ違い気味な気もしますが

(p)ttp://x68000.q-e-d.net/~68user/unix/pickup?iconv

> 入力ファイルに無効な文字 (-f で指定した文字コードと矛盾するようなデータ) が
> 含まれていた場合、iconv はエラーとして終了する。FreeBSD の iconv では
> -c オプションを指定することで、無効な文字を無視して無視して続行することができる。
> 他の iconv では必ずエラーで終了してしまうようだ。

Linux で、変な文字を無視しつつ文字コードの変換をしたいときにはどうするのがベストでしょうか。
(個人的に馴染のある言語の) php で iconv//IGNORE をする、という手は思いついたのですが。

これ、相談させてください。

とりあえず今は
~/php/bin/php -r 'while (($line = fgets(STDIN)) != NULL) { echo iconv("Shift_JIS", "UTF-8", $line); } '
としてしのぎました。

500 :login:Penguin:2007/01/29(月) 15:33:59 ID:0RsnjQyh
>>499
Linux の iconv にも -c あるみたいだけど
それじゃだめなん?

501 :login:Penguin:2007/01/29(月) 16:16:33 ID:qD+Ol7pJ
うわまじだ、できました。
man iconv だけ見て実際に試してませんでした。
お騒がせしました。

502 :login:Penguin:2007/02/01(木) 10:23:06 ID:c0AyEF+O
ある空のディレクトリを複数用意してそこにユーザが自由にユーザが
ファイルをUPするとします。ファイルが何も入っていないディレクトリを
抽出するようなスクリプトを作りたいのですが、

if [ ! -f /TESTDIR/* ];then

こんな感じで書いていたら最初はうまくいってたのですがファイル数が
多くなったらtoo many arg...のエラーでてうまくいかなりました。

何か良い方法ありますか?


503 :login:Penguin:2007/02/01(木) 10:29:45 ID:7FjmZE6L
>>502
find /TESTDIR -maxdepth 0 -type d -empty

504 :login:Penguin:2007/02/01(木) 10:31:16 ID:7FjmZE6L
>>503
ちょっと違うか。
でもまぁ、find で空ディレクトリ一覧は出せるよ。

空のディレクトリのみ削除したいなら
いきなり rmdir しちゃうとか。

505 :login:Penguin:2007/02/01(木) 10:32:56 ID:7FjmZE6L
>>502
> if [ ! -f /TESTDIR/* ];then
これだと /TESTDIR/.test なんてファイルがあったらだめだな。

506 :502:2007/02/01(木) 13:37:30 ID:c0AyEF+O
>>505
そうでした。うかつです。
>>503
-maxdepth 0をつけるとなぜかファイルが入ってるディレクトリも
抽出されたのでfindで出来るというレスをヒントに

find /TESTDIR -type d -empty

で一見うまくいってるかも?です。少し様子見します。
ありがとうございます。

507 :502:2007/02/01(木) 13:53:02 ID:c0AyEF+O
と、思ったら失敗しました。

TESTDIRの下にディレクトリa,b,c,d...と初期にこちらで用意した
ディレクトリがありその初期ディレクトリで空のもののみを抽出した
かったのですが、ディレクトリaの下に通常のファイルの他に
空ディレクトリとか作られると

find /TESTDIR -type d -empty

でやるとディレクトリaの下の空ディレクトリも抽出されてしまいます。。

508 :502:2007/02/01(木) 14:48:33 ID:c0AyEF+O
自己レス
find /TESTDIR -maxdepth 1 -type -d
でうまくいきました。ありがとうございました。

509 :login:Penguin:2007/02/01(木) 14:50:50 ID:S77RcpST
find /TESTDIR -prune -type d -empty


510 :login:Penguin:2007/02/01(木) 21:48:28 ID:sTUB8jxJ
du

511 :login:Penguin:2007/02/01(木) 23:28:13 ID:ZVcHJobk
>>510
多分だめ(な場合がある)だろ。

LinuxのFS(たとえばext3)って、ファイルがないディレクトリのサイズは「必ず」0なのか?

他のUNIXでよくあるのは、いっぱいファイルを作った(当然ディレクトリのサイズ増大)後で、
ファイルを全部削除しても、ディレクトリ自体はすぐにはtruncateされない場合がある
ってな実装戦略なんだが。(この戦略は決してサボリじゃなく合理的理由がある)

512 :511:2007/02/01(木) 23:56:02 ID:ZVcHJobk
>>511みたいな複雑なケース以前にもっと単純に...

>>510
duだと、サイズ0のファイルが存在しても、それはないものとして数えられちゃうよね。

やっぱduのようにサイズを計るツールでファイル数を計るのは無理あるんじゃね?

513 :login:Penguin:2007/02/02(金) 03:11:38 ID:9L/PFxQe
find でやるのが正解だと思うけれど ls -A も使える。

for dir in /TESTDIR/*/ /TESTDIR/.*/ ;
do
count=`ls -A "$dir" | wc -l` ;
if [ $count -eq 0 ] ;
then echo "$dir": empty ;
fi ;
done

/TESTDIR/.*/ だと /TESTDIR/. と /TESTDIR/..
もマッチしちゃうけど。

514 :login:Penguin:2007/02/02(金) 07:25:12 ID:3bXppBjS
duで最小サイズのディレクトリを見付けfindする。

515 :login:Penguin:2007/02/02(金) 17:41:07 ID:DTfUN+wD
hogeを5秒後に起動したい

#!/usr/bin/sh
sleep 5 && hoge

516 :login:Penguin:2007/02/02(金) 18:05:04 ID:8alDMpKt
>>515
誤爆か?

3分後にカップラーメンを食べたい

#!/usr/bin/sh
sleep 3m && play /usr/share/sounds/login.wav

517 :login:Penguin:2007/02/02(金) 23:21:43 ID:DTfUN+wD
じゃあこれでいい?

3秒後にhogeを起動したい

#!/usr/bin/sh
sleep 3s && /usr/bin/hoge

518 :login:Penguin:2007/02/02(金) 23:25:24 ID:/lWC69nr
お前らatを知らんのか。

519 :login:Penguin:2007/02/02(金) 23:43:39 ID:tuwscbyy
atは許可されないと使えないわけだが。


520 :login:Penguin:2007/02/02(金) 23:59:13 ID:WEnZhawj
atd 動いてないかもしんないし。

521 :login:Penguin:2007/02/03(土) 00:00:23 ID:Lfu3L5NI
指定した時刻に電源がオンになるようなのはできますか?

522 :login:Penguin:2007/02/03(土) 01:40:12 ID:fL2Na2GQ
シェルスクリプトで、という意味?
普通はbiosとかの役割だと思うけど。

523 :login:Penguin:2007/02/03(土) 11:12:20 ID:6nwwXG2H
>>521
Wake On Ringコネクタにキッチンタイマーをつなげ。

524 :login:Penguin:2007/02/04(日) 01:35:42 ID:LvsFC69b
つ nvram-wakeup
これで次起きたい時刻をセットしてマシン落とせば(もしくはサスペンドすれば)おけ。


525 :login:Penguin:2007/02/12(月) 13:31:38 ID:SMeHWOZn
7za x *
というふうに*(ワイルドカード)が使用できないので
なんとかスクリプトで出来ないかとやってみたがダメ。
今いるディレクトリにある.7zすべてを展開したいけど
なして?
#!/bin/bash
for i in $*
do
7za x $i
done

$ ./7za.sh '*.7z'
Incorrect command line

526 :login:Penguin:2007/02/12(月) 13:38:29 ID:CD7jXCIx
シングルクオートで括ってるから?

527 :login:Penguin:2007/02/12(月) 22:43:07 ID:fALdmZ2l
だな

528 :login:Penguin:2007/02/14(水) 21:07:43 ID:kfyu3aZW
シェルスクリプトの練習のために、ftpでrsyncの様な事をする(つもりの)ものを書いてみました。
添削、助言などいただけると嬉しいです。定数定義等は省略してあります。

SERVER_FILE_LIST=$( ftp -n "${SERVER_ADRESS}" << END 2>>${LOGFILE_NAME}
user ${FTP_USERNAME} ${FTP_PASSWORD}
cd ${SERVER_DIR}
ls -l
END
)

SERVER_FILE_LIST=$(echo "${SERVER_FILE_LIST}"| awk '{print $9}')
UPFILE_LIST=$( ls -1 |sed "/^${LOGFILE_NAME}$/d" )

for SERVER_FILE in ${SERVER_FILE_LIST}
do
UPFILE_LIST=$(echo "${UPFILE_LIST}" |sed "/^${SERVER_FILE}$/d" )
done

for UPFILE in ${UPFILE_LIST}
do
ftp -i -v -n ${SERVER_ADRESS} << END >>${LOGFILE_NAME}
user ${FTP_USERNAME} ${FTP_PASSWORD}
cd ${SERVER_DIR}
bin
put ${UPFILE}
quit
END
done

529 :login:Penguin:2007/02/14(水) 21:48:24 ID:/I11T7H/
じゃあ俺も。ようつべからflvを拾ってくるスクリプト(要wget)。
パラメータは http://www.youtube.com/watch?v=XxXxXxXxXxX みたいなのをつける

#!/bin/sh
if [ "$1" = "" ] ; then exit 1 ; fi
YTURL=`echo $1|grep http://www.youtube.com/watch`
if [ -z $YTURL ] ; then exit 1 ; fi
VIDEOID=`echo $YTURL | cut -d = -f 2`
if [ -z $VIDEOID ] ; then exit 1 ; fi
INDEX=`mktemp YouTube.XXXXXXXX`
wget -q "$YTURL" -O $INDEX
if [ -s $INDEX ] ; then
YTURL=`grep "/player2.swf?" $INDEX | \
cut -d \" -f 2 | \
cut -d ? -f 2 `
wget "http://www.youtube.com/get_video?$YTURL" -O $VIDEOID.flv
fi
rm -f $INDEX

530 :login:Penguin:2007/02/15(木) 04:53:05 ID:Hg/Fwxgo
>>529
youtube-dl便利だぞ

531 :login:Penguin:2007/02/15(木) 08:15:32 ID:gox/9ooE
ようつべよりぐぐるの動画を……

532 :login:Penguin:2007/02/15(木) 08:20:07 ID:gox/9ooE
なんかちょっとgoogleっぽいIDが出た。

533 :login:Penguin:2007/02/15(木) 10:12:16 ID:IJ3FcxR6
GUIが好きならDemocracyPlayerオススメ。

534 :528:2007/02/15(木) 12:45:31 ID:w0BybIhd
タイムスタンプファイルサイズも比較しないレベルの低いのはヌルーっすかwww

変なことは書いていないと肯定的に考えるべきか…

535 :login:Penguin:2007/02/15(木) 13:24:50 ID:LfPH5BoW
つーか読むのめんどい。
多少汚くても
自分がやりたいことが実現できてるなら
それでいいんじゃね?
どっかわからない・うまく動かないとこがあるなら言ってよ。

536 :528:2007/02/15(木) 14:19:37 ID:w0BybIhd
>>535
それはそうですね。一応、使えてるのでOKかも。
mputがうまくいかなかった理由(ファイル名を”で囲う)がわかったのでforも一個減らせたし。
さて次はタイプスタンプでも取得するか。

537 :login:Penguin:2007/02/15(木) 14:59:35 ID:1HhpQr6V
du -a /usr/local/bin | gawk '{printf "%s\n", $0}'

コマンドラインから 動作。

ファイルに書いて、ファイルを実行すると gawkで
gawk: cmd. line:1: {printf "%s\n", $0}
' in expression:1: ^ invalid char '

エロ意人おしえてください

538 :528:2007/02/15(木) 15:06:03 ID:w0BybIhd
>>537
エロくない人だけど動きましたよ

539 :login:Penguin:2007/02/15(木) 15:28:35 ID:ooDXnCch
printf("%s\n",$0) にしてみるとか

540 :login:Penguin:2007/02/15(木) 15:49:24 ID:1HhpQr6V
>>538
>>539
レスさんきゅ。

gawk: cmd. line:1: printf ("%s\n", $0)
' in expression:1:             ^ invalid char '

いやぁ、動作しないのがおかしいんだけどね・・・。
おかしいなぁ。

いい忘れたが
元はといえば、Solaris HPで動作したシェルスクリプトがまったく動作しない。

ソラリス、HP:OK

CentOS4.4:NG

541 :540:2007/02/15(木) 16:24:13 ID:1HhpQr6V
自分のCentOS4.4では 動作しないが
実際動作させる環境(RHEL)で動作したから、クローズです。

gawk awkが違うってことだな。

542 :login:Penguin:2007/02/15(木) 16:49:04 ID:zT9bgmHM
たぶん改行コードが腐ってる。awk のせいではない。


543 :login:Penguin:2007/02/15(木) 21:15:18 ID:gox/9ooE
シェルが腐ってて''の中の\nを解釈しちゃうのかね。

544 :login:Penguin:2007/02/16(金) 09:20:41 ID:+PZTEw3U
違う。改行コードが CR+LF になっているので、awk の引数が
{....} ではなく {.....}CR になって構文エラーになる。


545 :login:Penguin:2007/02/16(金) 22:12:22 ID:/EU/hyDk
YouTubeとかGreasemonkeyで良いじゃんって思うんだけど
w3mで見れないし

546 :login:Penguin:2007/02/22(木) 00:04:52 ID:8/cpZrIn
初めてのシェルスクリプトです。自信ないけど見てください。
mktempで作成した一時ファイルは削除した方がいいのでしょうか。エラー処理とかよくわかりません。

使用例
echo 'http://shupoxxx.2.dtiblog.com/?page=0' | ./urlcollector.sh '/\?page=[0-2]' | grep 'jpg$'

#!/bin/sh
# urlcollector.sh
REGEX=$1
TMPFILE=`mktemp /tmp/urlcollector.sh.XXXXXX`
DL_FILE=`mktemp /tmp/urlcollector.sh.XXXXXX`

download() {
    while read LINE; do
        if grep `echo "$LINE" | sed -e 's/?/\\\\?/'` $DL_FILE; then
            :
        else
            echo "DEBUG:$LINE" 1>&2
            echo "$LINE" >> $DL_FILE
            lynx -dump -image_links "$LINE" | grep -o 'http://.*$' |
            tee -a $TMPFILE | grep -E "$REGEX" | download
        fi
    done
}
download # let's do it!
cat $TMPFILE | sort -u

547 :login:Penguin:2007/02/22(木) 01:32:51 ID:I6i5DnCh
エラー処理は

 set -e
 trap '...終了時の掃除処理...' 0 1 2 3 14 15

あたりを冒頭にかくよろし。

548 :login:Penguin:2007/02/22(木) 10:19:06 ID:PGB0Kf4J
>>547
urlcollector.sh: line 1: ...終了時の掃除処理...: command not found

trap 'echo ...終了時の掃除処理...' 0 1 2 3 14 15



549 :login:Penguin:2007/02/22(木) 17:37:30 ID:IB5Lfolq
>>546
それだと相対パスのリンク取れないけどそれでいいならいいか。
俺なら手抜きでこうやる。

URL=http://hogehoge.jp

wget -nv -nd -r -w1 --delete-after $URL 2>&1 | awk '{sub("^URL:","",$2); print $2;}'



550 :login:Penguin:2007/02/28(水) 03:56:45 ID:KugGv7KW
if文で「(AかつB)またはC」を条件にしたい時
if [ ( A -a B ) -o C ] という構文は
解釈してくれないようなのですが、どのように
表現したらいいのでしょうか?
とりあえず
if [ A -a B ] ; then
...
elif [ C ] ; then
...(同じコマンド)
としているのですが・・・。


551 :login:Penguin:2007/02/28(水) 07:40:43 ID:gjXTuKQD
>>550
if [ A -o C ]; then
if [ B -o C ]; then
...
fi
fi

552 :login:Penguin:2007/02/28(水) 10:06:56 ID:J/P3bKEE
>>550
解釈する。

ただし、ほとんど全てのシェルで括弧はサブシェルを意味するから、
if [ \( A -a B \) -o C ]; then
と書く必要があるよねえ。

160 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)