シェルスクリプト総合 その13
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2008/10/16(木) 00:48:38スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0518名無しさん@お腹いっぱい。
2008/12/21(日) 17:31:31\/┏┷┓\/
。┃お┃。
゙ # ゚┃断┃; 。
; 。 ・┃り.┃・ #
。 ;゙ #┃し.┃# 。
゙・# : ┃ま┃。 ; 。
.;:# ゙。゚┃す┃゚ 。 #
; 。;; ゙.:。┗┯┛。 # : #
. ハ,,ハ |
. ( ゚ω゚ ) |
:/ つΦ
0519名無しさん@お腹いっぱい。
2008/12/21(日) 21:35:57シェルで代用とはどういう事ですか?
0520名無しさん@お腹いっぱい。
2008/12/21(日) 22:53:31シェルで代用もご存知ない方には聞いていません。
ハイ、次のもっと優秀な回答者
↓
0521名無しさん@お腹いっぱい。
2008/12/21(日) 23:17:51Emacsスレか?
0522名無しさん@お腹いっぱい。
2008/12/22(月) 01:26:400523名無しさん@お腹いっぱい。
2008/12/22(月) 10:13:410524名無しさん@お腹いっぱい。
2008/12/22(月) 10:23:110525名無しさん@お腹いっぱい。
2008/12/22(月) 15:25:41不便なのでシェルを作ろうと思うのですが、
具体的にはどう作ればいいですか?
0526名無しさん@お腹いっぱい。
2008/12/22(月) 15:32:500527名無しさん@お腹いっぱい。
2008/12/24(水) 22:22:39うまいこといきますか
ちなみにディレクトリ名は日本語だったりスペースありだったり()あったりです。
0528名無しさん@お腹いっぱい。
2008/12/24(水) 22:38:09改行がないなら、findして、/の個数を数えて、最大値でも出せばどうかね?
0529名無しさん@お腹いっぱい。
2008/12/24(水) 22:57:34find ./ -type d だと再帰的になってしまうので
ls -l | egrep '^d' | awk ' { print $8 } '
みたいにしたら、スペース込みのディレクトリ名の場合8カラム目以降消えてしまうし
0530名無しさん@お腹いっぱい。
2008/12/24(水) 23:00:070531名無しさん@お腹いっぱい。
2008/12/24(水) 23:18:57ちっと出直してきます
0532名無しさん@お腹いっぱい。
2008/12/25(木) 06:51:30(-depthはあっても-maxdepthがないfindは存在する)
0533名無しさん@お腹いっぱい。
2008/12/25(木) 07:54:35-depth 1 -type d で要求は満たす。
-maxdepth 1 を指定すれば効率はよくなるだろうけど、
ないと無理という根拠が不明。
0534名無しさん@お腹いっぱい。
2008/12/25(木) 07:56:58おいおい、何か勘違いしてないか?
-depth に引数は付かない。
全く要求を満たさない。
試してから書けよな。
0535名無しさん@お腹いっぱい。
2008/12/25(木) 08:02:07一般のfindの-depthじゃ、>>534 の言う通り、無理なんだよ。(例:Solaris)
0536名無しさん@お腹いっぱい。
2008/12/25(木) 08:13:340537名無しさん@お腹いっぱい。
2008/12/25(木) 08:49:500538名無しさん@お腹いっぱい。
2008/12/25(木) 12:01:090539名無しさん@お腹いっぱい。
2008/12/25(木) 13:53:10はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日はもう来なくていいから。
0540名無しさん@お腹いっぱい。
2008/12/25(木) 16:31:480541名無しさん@お腹いっぱい。
2008/12/25(木) 22:30:580542名無しさん@お腹いっぱい。
2008/12/25(木) 22:31:230543名無しさん@お腹いっぱい。
2008/12/25(木) 22:34:56.で始まったりすると面倒じゃね
0544名無しさん@お腹いっぱい。
2008/12/25(木) 22:50:31標準bourne shellにこだわらなければ、
.で始まるファイルをファイル展開に含める方法があるシェルが最近は多い。
0545名無しさん@お腹いっぱい。
2008/12/25(木) 22:59:070546名無しさん@お腹いっぱい。
2008/12/25(木) 23:06:48..aaが含まれない。
.* *で.と..を省いた方がまだいい。
0547名無しさん@お腹いっぱい。
2008/12/26(金) 06:44:520548名無しさん@お腹いっぱい。
2008/12/26(金) 22:53:28find hogedir -type f | wc -l
とかしか無いの?
かっこいいのないのかね
0549名無しさん@お腹いっぱい。
2008/12/26(金) 23:10:570550名無しさん@お腹いっぱい。
2008/12/27(土) 03:40:29hogedir 以下にディレクトリがあっても空とみなすの?
0551名無しさん@お腹いっぱい。
2008/12/27(土) 04:20:31$ cat a.dat
111
AAA
BBB
CCC
222
$ cat b.dat
AAA
BBB
CCC
$ cat c.dat
DDD
EEE
FFF
で、以下のように実行(hogeコマンドはあくまでイメージです)すると、
-------------------------
$ hoge -t a.dat -s b.dat -d c.dat
111
DDD
EEE
FFF
222
-------------------------
上のようになるコマンドはありますでしょうか?
そのようなコマンドがない場合、みなさんだったらどのようにこの置換えを行いますか?
0552名無しさん@お腹いっぱい。
2008/12/27(土) 09:37:21-sにあるものを
対応する-dの行で置き換えるってこと?
$ cat b.dat
BBB
AAA
なら、
111
EEE
DDD
CCC
222
ってこと?
0553名無しさん@お腹いっぱい。
2008/12/27(土) 10:20:010554名無しさん@お腹いっぱい。
2008/12/27(土) 12:05:09case `ls -A hogedir` in '') 空の場合の処理;; esac
の方が、wcがいらない分まし。
0555名無しさん@お腹いっぱい。
2008/12/27(土) 14:40:01違います。すいません説明がたりませんでした。
ある領域に一致するものを、別の領域に置き換えるという意味です。
>>552の場合は、一致しないので置き換えないようになります。
0556名無しさん@お腹いっぱい。
2008/12/27(土) 14:41:290557名無しさん@お腹いっぱい。
2008/12/27(土) 16:36:16b.datの内容(3行全部)に完全に一致する部分を、
c.datの内容で置き換えるってことか。
0558名無しさん@お腹いっぱい。
2008/12/27(土) 16:45:17妥当だろうか。
ディレクトリのハードリンクについては考えないことにする。
0559名無しさん@お腹いっぱい。
2008/12/27(土) 16:45:550560名無しさん@お腹いっぱい。
2008/12/27(土) 16:50:31→ ディレクトリを含まないディレクトリ (通常ファイルはたくさんあっていい)
0561名無しさん@お腹いっぱい。
2008/12/27(土) 17:37:58だから、全然妥当じゃないねw
0562名無しさん@お腹いっぱい。
2008/12/27(土) 20:47:01MacOS XのHFS+→ファイルを作ると . へのンク数+1
Linuxのext3→ファイルを作ってもリンク数は増えない
となった。
0563名無しさん@お腹いっぱい。
2008/12/27(土) 20:57:40そのとおりです!
0564名無しさん@お腹いっぱい。
2008/12/27(土) 22:35:22おおむね妥当というか、定番の方法。
ただし、ダメなことがあるので、そのショートカットは省略できるように
色々なツールがオプション持ってるけどね。
0565名無しさん@お腹いっぱい。
2008/12/27(土) 22:45:04なんでやねん。
それは、ディレクトリが「leaf」かどうかを判断する方法であって、
「空」かどうかの判断にはなっていない。
ディレクトリ中に普通のファイルが存在しても、リンクカウントは2のままなんだから。
0566名無しさん@お腹いっぱい。
2008/12/28(日) 09:20:08それだとrmdirしてみるくらいしか思いつかないなぁ。
0567名無しさん@お腹いっぱい。
2008/12/28(日) 12:50:040568名無しさん@お腹いっぱい。
2008/12/28(日) 13:14:220569名無しさん@お腹いっぱい。
2008/12/28(日) 14:45:240570名無しさん@お腹いっぱい。
2008/12/28(日) 17:03:01awk駆使するしかないかなー。
何気にあってもいいような気がするんだけど、そんなコマンドないんだよねー。
0571名無しさん@お腹いっぱい。
2009/01/05(月) 01:38:25/home/hoge
ディレクトリにある全てのファイルの改行コードを全部LF変更して上書きするシェルスクリプトを書きたいのですが、どう書けばよいでしょうか??
nkf -w -Lu samble.txt > sample.text
のようにやればよいのは知っているのですが、全ファイル一気に処理したい場合どうすればよいか分かりません。
ご教示いただけると幸いです。
0572名無しさん@お腹いっぱい。
2009/01/05(月) 01:39:17↓
LFに変更
です。。
0573名無しさん@お腹いっぱい。
2009/01/05(月) 02:19:31> nkf -w -Lu samble.txt > sample.text
> のようにやればよいのは知っているのですが
あかんで!
perl -iでも使えば。Encode/jcodeで変換して。
シェルスクリプトなら、
for i in *.txt; do
nkf -w -Lu $i > $i.--$$--
# 必要ならば yes no | mv -i $i $i.org
mv $i.--$$-- $i
done
0574名無しさん@お腹いっぱい。
2009/01/05(月) 07:44:10以下で桶。
↓
#!/bin/sh
cd /home/hoge
for file in *.txt
do
out_file=`basename "$file" .txt`.text
nkf -w -Lu "$file" > "$out_file"
done
>>573
> あかんで!
↑
なんであかんの?w
.txtと.textを読み落したか?w
上書きはしないよw
0575名無しさん@お腹いっぱい。
2009/01/05(月) 08:08:460576名無しさん@お腹いっぱい。
2009/01/05(月) 08:54:26% nkf -w -Lu --in-place=.bak *.txt
じゃね
0577名無しさん@お腹いっぱい。
2009/01/05(月) 09:53:01それはへ理屈。
>>573 の回答を見れば、.txtを.txtに変換しようとしてるので、
質問を読み間違えてるのは明らか。
しかも、スペース入りファイル名があると正常動作しないし。
知ったか回答者の典型。
0578名無しさん@お腹いっぱい。
2009/01/05(月) 12:43:33tr -d "\r" < input.txt > output.txt
で改行コードが変換できる。
0579名無しさん@お腹いっぱい。
2009/01/05(月) 18:58:46という命題は真ですか?
0580名無しさん@お腹いっぱい。
2009/01/05(月) 19:44:540581名無しさん@お腹いっぱい。
2009/01/05(月) 19:50:14ハイ、次の回答者。
0582名無しさん@お腹いっぱい。
2009/01/05(月) 20:03:210583名無しさん@お腹いっぱい。
2009/01/05(月) 20:39:020584名無しさん@お腹いっぱい。
2009/01/05(月) 21:00:140585名無しさん@お腹いっぱい。
2009/01/05(月) 21:15:470586名無しさん@お腹いっぱい。
2009/01/06(火) 12:55:50似たようなもんだな。
0587名無しさん@お腹いっぱい。
2009/01/06(火) 13:48:060588名無しさん@お腹いっぱい。
2009/01/06(火) 14:13:16perlがあってもsedやawkは使うしもちろんシェルスクリプトも使う
オナニー万歳
0589名無しさん@お腹いっぱい。
2009/01/06(火) 14:29:480590名無しさん@お腹いっぱい。
2009/01/06(火) 14:31:13perlぐらいフツーっすよ
0591名無しさん@お腹いっぱい。
2009/01/06(火) 14:32:560592名無しさん@お腹いっぱい。
2009/01/06(火) 14:39:18awkがメイン
0593名無しさん@お腹いっぱい。
2009/01/06(火) 14:43:020594名無しさん@お腹いっぱい。
2009/01/07(水) 00:45:440595名無しさん@お腹いっぱい。
2009/01/07(水) 00:54:34どうもうまくいかない。
>telnet POP3.net 110 > mail
user MYID
pass MYPASS
retr 1
quit
Connection closed by foreign host.
>
となりうまくいくんだけど、
telnet POP3.net 110 << EOF
user MYID
pass MYPASS
retr 1
quit
EOF
というのをリダイレクトすると
Connected to POP3.net
Escape character is '^]'.
Connection closed by foreign host.
となり全然駄目。
ものすごい致命的な間違い、勘違いがありそう。
とりあえずこれから
man telnet
www.ietf.org/rfc/rfc1939.txt
を一通り読むんですが、その前に間違いを指摘して下さいな。
0596名無しさん@お腹いっぱい。
2009/01/07(水) 01:07:340597名無しさん@お腹いっぱい。
2009/01/07(水) 01:13:230598名無しさん@お腹いっぱい。
2009/01/07(水) 01:27:44netcat,nc初めて聞きます。調べておこう。
>>597
どうも助かります。
>telnetは標準入力じゃなくてttyを入出力とするからリダイレクト出来ない
となると、
>telnet hoge.net < `tty` という具合ですね。
別の端末から
>echo "user MYID" > /dev/あっち とか。
telnetをやるスクリプトを動かすスクリプトを書いて
上位からttyへ流し込むとか。
いろいろやってみますね。
どうもサンクスです。
0600名無しさん@お腹いっぱい。
2009/01/07(水) 08:36:31UNIX FAQにあるように echo と sleep で
間隔開けて1行ずつ出せばいけたかも
0601名無しさん@お腹いっぱい。
2009/01/07(水) 09:58:530602名無しさん@お腹いっぱい。
2009/01/07(水) 10:01:37>>599
0603名無しさん@お腹いっぱい。
2009/01/07(水) 11:04:240604595
2009/01/08(木) 22:29:27セキュリティ絡みでひっかかって駄目みたい。
ok
ok
ok
とくるからpassまではいけてるから、そっから先に
いろいろあるんだろうなあ。
ぐぐったらperlのスクリプトが沢山あったから、
参考にしてみます。
0605571
2009/01/09(金) 02:21:36御礼遅れてすいません。ありがとうございました!
--overwrite なんてオプションあったんですね。知りませんでした。
あとすいません、573の方が書いてくださったシェルスクリプトの--&&-- ってのはどういう意味でなのでしょう?
ご教示いただきたくm(_ _)m
0606名無しさん@お腹いっぱい。
2009/01/09(金) 07:14:00こりゃ便利です。移行もスムーズです!!!
0607名無しさん@お腹いっぱい。
2009/01/09(金) 07:16:59--&&-- じゃなく --$$-- な。
echo --$$--
ってやってみ。
別に .aho でも .baka でも .tmp でもいいんだろうが、
.bak だと同名のファイルが既に存在していて壊してしまうおそれが高いし、
.--$$-- ならその可能性は低いだろうと、それだけのこと。
0608名無しさん@お腹いっぱい。
2009/01/09(金) 10:07:01シェルってゆうな。クズ。
0609571
2009/01/09(金) 11:29:11すいません、あとひとつお聞きしたいのですが
outfile=`basename "$file" .txt` .text
で、
""は必要ですか??
試してみると
outfile=`basename $file .txt` .text
でもできました。
0610名無しさん@お腹いっぱい。
2009/01/09(金) 11:39:040611名無しさん@お腹いっぱい。
2009/01/09(金) 11:39:54" " は必要。
" "がないと、スペースとか、特殊記号を含んだファイル名で正常動作しない。
0612名無しさん@お腹いっぱい。
2009/01/09(金) 11:45:58思った方がいいので当面必要無くても常にダブルクォートを付けるルールを守ること
その意味で >>573 は失格
0613名無しさん@お腹いっぱい。
2009/01/09(金) 11:47:57> 特殊記号を含んだファイル名
問題になるな特殊記号って?
0614名無しさん@お腹いっぱい。
2009/01/09(金) 11:48:530615名無しさん@お腹いっぱい。
2009/01/09(金) 11:51:310616名無しさん@お腹いっぱい。
2009/01/09(金) 11:58:140617名無しさん@お腹いっぱい。
2009/01/09(金) 12:14:32てくるなら)普通にメタキャラクタのチェックしないと危険だろ。
0618sage
2009/01/10(土) 14:55:14■ このスレッドは過去ログ倉庫に格納されています