重命名目录中匹配特定 mtime 值的文件

重命名目录中匹配特定 mtime 值的文件

我使用一组简单的 shell 命令来每天创建 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.

相关内容