web-dev-qa-db-ja.com

ディレクトリ内の特定のmtime値に一致するファイルの名前を変更します

毎日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
domaniqs

古いバックアップを削除する方法は問題ありません。私の意見では、ファイルの名前を変更するよりも優れています。それについて最も醜いのは、パイプの長いチェーンです。これは、例ではほとんど目的を果たしませんが、ラインが長くなりすぎます。 { ... }のブロックを使用して次のように記述します。

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は、正しく使用すれば奇妙なエラーを発生させません。 -execの代わりにfindを使用して、execへのパラメーターに誤りがありました。パラメータを正しく取得するには、man findを読みながら、少し遊んでください。

1
janos