※find でゴニョゴニョするより簡単
■目次
(1)準備
(2)実行
(3)if文を使う例
(3.1)実行
(1)準備
空のディレクトリ: kara
空じゃないディレクトリ: karajanai
を用意。
(2)実行
$ test -z "$(ls -A kara/)" ; echo $?
0
$ test -z "$(ls -A karajanai/)" ; echo $?
1
解説
「test」 コマンドは与えられた2つの数値を比較し結果を返すコマンド
「-z」は文字列の長さが0かどうか。真なら「0」、偽なら「1」が返される
「$(~~~)」ドル記号と括弧で囲んだコマンドは囲った中身をコマンドとして実行しその結果を出力
「ls」はファイルリスト一覧表示するコマンド、「-A」(大文字)はすべてのファイルを表示するオプション(ただし「.」「..」は表示しない)
「$?」は「終了ステータス (exit-status)」と呼ばれるコマンドの成否を表す特殊変数、コマンドが成功すると「0」、失敗の時は「1」となっている。
(3)if文を使う例(karatest.sh)
if [ -z "$(ls -A kara/)" ]
then
echo "Empty!"
else
echo "Not empty"
fi
(3.1)実行
$ sh karatest.sh
karadayo!
応用編
ディレクトリが空だった場合はバックアップを実行しないスクリプト
#!/bin/sh
mkdir /hogehoge ←マウントポイントの作成
mount -t nfs4 IPアドレス:/ /hogehoge || exit $? ←共有フォルダのマウント(失敗したら終了)
if [ -z "$(ls -A /hogehoge/)" ] ←フォルダが空かどうかチェック
then
echo "Dir is empty. Backup did not run."
exit ←空なら終了
fi
rsync -av --delete /hogehoge/ /backup ←バックアップ処理
umount /hogehoge ←共有フォルダのアンマウント
rmdir /hogehoge ←マウントポイント削除
解説
「||」は前のコマンドの終了ステータスが失敗だった時に続くコマンドを実行する。(「&&」だと前のコマンドが成功したときに続くコマンドが実行される。)
「exit」はスクリプトを中断させるコマンド、続けて数字(0か1)を書くとそれが終了ステータスになる。
「$?」が終了ステータスを表すということは、この場合は直前のコマンドのステータスが引き継がれるということか?(「||」で終了時に実行させるようになっているので「exit 1」と書いても良いのかも?
[ 引数 条件式 ] は「test」コマンドの省略形
if で test コマンドを記述する場合は [] で代用する場合が多い。記述方法は test コマンドの引数をそのまま [] の中に記述する形になる。
ただし、[ の直後と ] の直前には必ず半角スペースが必要となる (無いと正常に動作しない)。
※何故空フォルダの確認が必要か?
Linuxの場合、暗号化ドライブやネットワークドライブを「マウント」する必要があるわけですが、何らかの事情でマウントに失敗していた場合、しかしマウントポイントは用意してしまっているため、空のディレクトリが存在している状態になってしまうことありうるわけです。
そして、その空のディレクトリをバックアップする=バックアップがすべて空の状態に更新されてしまう(ファイルがすべて削除されてしまう)、という現象が起きる可能性が・・・
実際、そういう事故があったので。。。
どういう状況だったのかイマイチよく覚えていませんが、例えば、元サーバー側で、何らかの理由でデータ保存用HDDのマウントに失敗していた(暗号化ドライブのパスワードが分からず、マウントしないで起動してしまったとか?)状態だと、マウントポイント(ディレクトリ)は元サーバー内に存在しているけれど、その中身は空という状態になります。そのフォルダをバックアップしてしまうと、バックアップ側も空になってしまうわけですね。
そのせいで、データが消失したことが・・・(元サーバーが故障して、「なぁに、バックアップがあるから大丈夫さ」と思ったら、バックアップも空だったという・・・orz)
※これらのやり方が正しいセオリーなのか分かりません、自分なりに考えながら手探りでやっているため、間違いや他にもっと良い方法がある可能性がありますので、悪しからずご了承願います。。。(笑)
コメント