私は毎日単純なシェルコマンドセットを使ってmysqldumpを生成します。このスクリプトはcronデーモンによって呼び出されます。次のようになります。
presentdate="`date +%d-%m-%Y_%H:%M.%S`"
basedir="/var/db_my_backup"
mysqldump -u username -ppassword --all-databases |
gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz |
find -L $basedir/'*' -type f -mtime +7 exec rm -f {} \; |
chown -R user:group $basedir | (
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz.
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
cat
) | /bin/mail -s "Report from scheduled job for mysqldumps" root
私の興味は:どうすればよりエレガントにすることができますか? 7日後のファイルを選択して名前を変更する機能を構築できますか?私は次のような奇妙な警告を生成するので、findを使用するのは好きではありません。
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
このようなスクリプトでは、(少なくとも私にとっては)扱いにくいです。
ベストアンサー1
古いバックアップを削除する方法は素晴らしいと思いますが、ファイル名を変更するよりも優れています。最も醜いのは長いパイプチェーンで、あなたの例ではほとんど使用されていませんが、線が長すぎます。{ ... }
次のブロックを使用して作成します。
presentdate="`date +%d-%m-%Y_%H:%M.%S`"
basedir="/var/db_my_backup"
{
mysqldump -u username -ppassword --all-databases | gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz
find -L $basedir/'*' -type f -mtime +7 -exec rm -v {} \;
chown -vR user:group $basedir
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz.
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
} 2>&1 | /bin/mail -s "Report from scheduled job for mysqldumps" root
最後の2>&1
部分にはメールにエラー出力が含まれており、不要な場合は削除できます。また、詳細についてはいくつかのフラグを追加しました-v
。
コメント作成者が述べたように、find
正しく使用すると奇妙なエラーは発生しません。パラメータに問題があります。代わりにfind
使用してください。正しいパラメータを取得するには、以下をお読みください。exec
-exec
man find