いちばん失敗した人決定戦

Serversman@VPSで日次バックアップを作成するためのスクリプトを書いています。

特定のディレクトリの中に、日付を名前とするディレクトリを作って、
その中にバックアップを取りたいのですが、dirの使い方がよく分かりません。

http://www.appleple.com/blog/unix/backup-with-cr …
リンク先の、

dir=$(date +"%Y-%m-%d-%H%M")
mkdir $dir
cd $dir
mysqldump --default-character-set=utf8 -u {ユーザ名} -p{パスワード} ablogcms > ablogcms.sql
tar zcfv httpdocs.tgz ../../httpdocs
cd ../
find . -name "20*" | sort -r | while read deldir; do let num="${num=0}+1"; if test $num -ge 10; then rm -rf $deldir;fi; done;

このスクリプトの場合、日付ディレクトリがルートに作られてしまいますよね。
そうでなく /mnt/smdisk ディレクトリの中に日付ディレクトリを作りたい場合、
スクリプトの最初の部分に一行加えて、

cd /mnt/smdisk ←付け足した行
dir=$(date +"%Y-%m-%d-%H%M")
mkdir $dir
cd $dir
(以下同じ)

のようにすれば、目的が達成できますでしょうか?

見よう見まねで付け焼き刃的な勉強をして書いてきたのですが、
どうにも分かりませんでしたので教えて頂ければ助かります。
よろしくお願いいたします。

A 回答 (2件)

まず, このスクリプトでは


mkdir $dir
としていますが, $dir は絶対パスにはならないので, ディレクトリは「この mkdir を実行する時点でのカレントディレクトリ」に作られます. 「この mkdir を実行する時点でのカレントディレクトリ」がどこかは知りませんが, そのあとの tar で ../../httpdocs としているのでおそらくルートディレクトリとは違うのではないでしょうか.

そして,
cd /mnt/smdisk
を追加すると「tar 以外」は大丈夫な感じがします. 逆に tar は適切なディレクトリをとれないのでまずそうな気がする.

そもそもこのスクリプト自体無駄に cd してるように思えます. cd せず
dir=$(date +"%Y-%m-%d-%H%M")
mkdir $dir
mysqldump --default-character-set=utf8 -u {ユーザ名} -p{パスワード} ablogcms > $dir/ablogcms.sql
tar zcfv $dir/httpdocs.tgz ../httpdocs
find . -name "20*" | sort -r | while read deldir; do let num="${num=0}+1"; if test $num -ge 10; then rm -rf $deldir;fi; done;
くらいにはすべきだし, 最後の find のパイプラインも怪しいのでもうちょっとすっきりさせたいところ.
    • good
    • 0
この回答へのお礼

こんなに早くアドバイスをありがとうございます!

>「tar 以外」は大丈夫な感じがします.
そうですね、tarの行を見落としていました。
うっかり、このままコピペする勢いだったので助かりました。

教えて頂いたばかりか、エレガントに書き換えて頂くなど何とお礼を申し上げていいか!
最後のfindも考えてみます。

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

お礼日時:2012/06/06 16:47

本来の目的について何も書いてなかった....



とりあえず
backuproot=/mnt/smdisk
として
dir=$(date +"%Y-%m-%d-%H%M")

dir=$backuproot/$(date +"%Y-%m-%d-%H%M")
に変え, 最後の find でカレントディレクトリを表す . を $backuproot に置き換えればできるんじゃないかな. dir という変数名はなんか気にいらないので変えた方がいいかもしれんけど.

あと, 最後の find のところは while を使わない方がいいんじゃないかなぁ. 多分
find $backuproot -name "20*" | sort -r | sed -e '1,10d' | xargs rm -rf
でいけそうな気がする (けど動作確認は自己責任でお願いしますね). ついでにいうとこの find で本当にいいのかどうか微妙だし (もうちょっとオプションを付けたりして限定しておくべきかもしれない), あるいはそもそも find じゃなくて ls に適当なオプションを付ければそれでいいだけなのかもしれない.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!