日別アーカイブ: 2011年10月22日, 00時30分

初めてのシェルスクリプト

 昨夜は電話でだが、生まれて初めて父親に踏み込んだ。
 伝えたのは:

・嫌いだとか避けたいだとかではない

・幼い頃、月に1度のペースで、深夜酔って暴れられたのが今でも思い出される

・声を聞いただけで、または実家の敷地内へ入っただけで、それらの恐怖感が蘇り気持ちが悪くなる

・酔って暴れた父親に、幼い僕がやめてと言ったとき「お前は関係ないから寝てろ」と言われたのが非常にショックだった

・父親の車の音が午後7時過ぎに聞こえた瞬間に、気持ちが塞がれた

・誰が悪い、誰のせいだという話をしているのではない。そういう事実があり、その時僕がどう感じたかを知っておいて欲しい

 横にたまたま嫁がいて、電話の様子を聞いてた。
 存外冷静に伝えられていたようだ。

参考文献:
・『毒になる親』 スーザン・フォワード:著 玉置悟:訳 毎日新聞社
 原題”TOXIC PARENTS -OVERCOMING THEIR HURTFUL LEGACY AND RECLAIMING YOUR LIFE-”

・『アダルト・チルドレンと癒し』 西尾和美 学陽書房

● 始めての

 シェルスクリプトを書いてみた。

#!/bin/sh
for dname in `find . -maxdepth 1 -type d`
do

if [ ”$dname” != ”.” ];
then
echo $dname
cp $dname/* ../all/
fi

done

 正常動作するまでに、2時間。

 息子とお嫁はすっかり昼寝を終えた頃、思ったとおりの動作。

● 日記を

 どうにかしなくてはと思い続ける。
 日記とは、学生時代に書いてたホームページの日記書きかけ含めて勘定すると200個ほどのファイル。

 日付がファイル名になっているので、
 このブログのカレンダーに関連付ければ、西暦を1998年とかにすれば
 ポツポツとカレンダーに下線がつくという寸法だ。

 で、複数のディレクトリにファイルを分けて保存してたので、
 それらを1つのディレクトリにコピーしたい。

 そんなの

● nautiusで

 マウスドラッグでやれば、複数のディレクトリに分散してるファイルといえども
 数分でコピーはできるのだが。

● こちとら

 秋休みで、お嫁も1才の息子も昼寝中なのだ。

 シェルスクリプトでできないかと思案。

 検索する。

● 覚えたこと。

○ for 変数名 in リスト; do; 〜; done

 これで foreach みたいなことができる。
 便利な感じだ。

○ リスト部分

 IMG*.JPGみたいな指定ができる。
 きっと、lsとかの結果も指定できるんだろうと踏んで、検索。

 使いたいのは、ディレクトリだけのリスト出力。
 ls のオプションを探すも徒労。

 find がいいようだ。

○ find -type d -maxdepth 1

 findコマンドは本当に「ファイルを探す」ためのコマンドなんだと知る。
 いままでは「-name 」オプションだけ知ってて、
 findなんだからオプションでわざわざ「-name」とするのが煩雑だなあぐらいにしか思ってなかった。

 「-type d」でディレクトリだけ探せという意味とは。
 find はファイル探しのコマンドなんだと実感、同時に「-name」オプションがある気持ちもようやく腑に落ちた。

○ 逆のアポストロフィーで実行結果を返す

 findでディレクトリだけのリストを表示させるコマンドラインは分かった。
 それを for 〜 in の所に指定する方法が分からずしばし彷徨う。

 これが「`」だった。
 おお。

○ if文

 条件式に「[」と「]」を使う。
 これって「test」コマンドの意味を表すのかな。←ここはまだ不明。

 演算子に「-ne」とかあるようだったけど、単純に「!=」で良いよう。

 [と”$dname”をくっつけたら、それはそれでエラー。
 $dnameが「dirname」を代入されているなら「[dirname」みたく扱われてしまって「[」がトークンとして認識されなくなるようだった。ふむー。

 [と”$dname”の間にスペースを入れてみたら動いた。

○ cp の行のエラー

 ずーっと意味不明だった。
 dirname/* というファイルは存在しません、みたいなことを言う。ん??

 ためしに直接「ls dirname/*」と打つと、ファイルのリストがダラダラ出てくる。
 なぜ?
 と思って、昼寝から覚めた妻子と外出、息子を風呂に入れ、布団で横になってるとひらめく。

 「cp ”$dname/*” ../all/」
 と打ってた「”」がいけないんじゃないか。

 コマンドラインで「”」で囲んだら、
 ワイルドカードとかそういうんじゃなくて、
 純粋にそういう名前のファイルを探しにいけという意味になるんでは?

 ためしにコマンドラインで
 「cp ”dirname/*” ../all/」

 と打つと、果たして同じエラーが。
 そこでシェルスクリプトを

 「cp $dname/* ../all/」

 に変えると無事動作した。
 なるほど。

 シェルスクリプトだ条件分岐だとは言え、
 書かれた1行1行はコマンドラインで入力しているコマンドなのだということか。

 だから”でトークン分けて見てくれなかったりするのか。
 ふむー