シェルとUNIXコマンドの覚え書きメモ

標準エラー出力のリダイレクト
 cronなどに使うために、標準エラー出力を標準出力にリダイレクトしたい場合には、次のようにします。

command infile.txt > out.log 2>&1

dateコマンドとロギング
 サーバーアプリケーションのログなどで処理時刻を出力したいときには、 dateコマンドの書式を利用して次のように書くことができます。

echo "処理完了:`date '+%Y/%m/%d %H:%M:%S'` " >> job.log

書式の中に空白を含む場合には、 このようにシングルクォートを忘れずにつける必要がありますよ。

ftpを自動スクリプトで行う
 ftpコマンドで対話的なやりとりをせず、全自動でファイルの送受信をするには、 次のようなシェルスクリプトを書けばOKです。

%  cat | ftp -n "falcon.center.nsnhnkmmkk.co.jp" >> $LOGFILE 2>&1 << EOF
user sysadmin wanonano
lcd "/path/of/local/dir"
cd "path/of/remote/dir"
bin
put local_file.dat remote_file.dat
dir remote_file.dat
quit
EOF

sendmailでメールを送信する
 テキストファイルの内容をメールで送信するには、

/usr/lib/sendmail -f FROMアドレス -t TOアドレス < textfile

とすればOKです。なおこのtextfileの書き出しを

Subject: メールのタイトル

メールの本文
...

とすれば、Subjectが指定できます。(To:なども同様に指定できます)

tarでファイルを作らずにコピー

cd /the/path/of/dir2(展開先)
tar cvf -  -C ~/the/path/of/dir1 temp | tar xf -
               ↑展開元

tarコマンドはOSによってオプションが微妙に異なることもあるので、 詳しくは、マニュアルで。

cpでディレクトリを複製する際に、ファイルの日付を更新しない
cpコマンドに-pオプションをつけると、編集時刻などを元のファイルに合わせます。

cp -pr srcdir destdir

曜日によって処理を分岐する

yobi=`date +%w`
if test $yobi = 1 -o $yobi = 3 -o $yobi = 5; then
  echo 111
else
  echo 222
fi

dateコマンドの「%w」書式は、曜日を日曜日=0、月曜日=1…の整数で返します。

作成してから一定日を過ぎたファイルを消しこむ
例えば、ディレクトリ$LOGDIRの下にある、ファイル名が*.logに該当し、 最後の編集から14日以上過ぎたファイルを削除するには、 次のようにします。「\;」がポイントです。

find $LOGDIR -name '*.log' -mtime +14 -exec /bin/rm -f {} \; >> tmp.out

なお、「-type d」とするとディレクトリを指定することができ、 /bin/rm -f の代わりに/bin/rm -rf とするとディレクトリも削除できますが、 このとき重大な注意をひとつ。findの削除条件に起点ディレクトリ (上の$LOGDIR)が該当してしまった場合、起点ディレクトリ自体が消えてしまうので要注意!

作成日が現在より一定期間以前・以後のファイルを抽出する

find . -mtime -2

mtimeオプションの+は指定した日数より古いファイル、 -は新しいファイルの意味です。従って上記は、 カレントディレクトリにある、2日以内に編集されたファイルを表示します。
なお、算数の常識に反して、+は省略できないので大注意! +も-もつけないと、「丁度2日前に編集されたファイル」 という意味になり、+をつけるのとは意味が変わってきます。

ヒアドキュメントを使ったファイル作成
ヒアドキュメントはテキストファイルを書き出すのにとても便利です。

cat > $PARFILE << EOF
file=$DESTFILE
buffer=10000000
tables=(SCOTT.EMP)
EOF

ここでよくあるミスは、「cat」の代わりに「echo」を使ってしまうことです。 これははまると結構悩みます。

よくcdするディレクトリのタイプ数を短く
 よくcdコマンドで移動するディレクトリがかなり階層の深いところにある場合、 なるべくタイプ数を減らして行くには? 例えばホームディレクトリから(シンボリック)リンクを張る、 というような方法もありますが、Cシェルのcdpath 変数を使うと、もっと簡単にできます。 例えば、~/the/deep/dir/name1 と ~/motto/d/ee/p/dir/name2 によく移動する場合、

set cdpath = ( $HOME/the/deep/dir $HOME/motto/d/ee/p/dir )

これを.cshrcに書いておくと、カレントディレクトリがどこであっても、 「cd name1」「cd name2」だけで目的のディレクトリに行けます。

BACKSPACEキーを有効にする
下の1行をログインスクリプトに書いておきます。

stty erase ^H

bashのalias
Csh系のシェルを従来使っていて、Linuxなどでbashに初めて触って戸惑うのが、 aliasコマンドの書式が違うことです。 bashでは、エイリアスと本体の間に'='が必要です。また、起動時に後ろにパラメータを渡すことはできません。

alias ec31=/usr/local/eclipse-3.1.1/eclipse

Misc. Topics Top

(first uploaded 2002/01/05 last updated 2006/04/01, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル