特定のmtime値と一致するディレクトリのファイル名を変更する

特定の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

古いバックアップを削除する方法は素晴らしいと思いますが、ファイル名を変更するよりも優れています。最も醜いのは長いパイプチェーンで、あなたの例ではほとんど使用されていませんが、線が長すぎます。{ ... }次のブロックを使用して作成します。

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-execman find

おすすめ記事