我的 bash 脚本保留最后一个 x 文件并删除其余文件有什么问题?

Sco*_*ott 7 linux backup bash

我有这个 bash 脚本,它可以很好地按 cron 计划备份我的数据库:

#!/bin/sh

PT_MYSQLDUMPPATH=/usr/bin
PT_HOMEPATH=/home/philosop
PT_TOOLPATH=$PT_HOMEPATH/philosophy-tools
PT_MYSQLBACKUPPATH=$PT_TOOLPATH/mysql-backups
PT_MYSQLUSER=*********
PT_MYSQLPASSWORD="********"
PT_MYSQLDATABASE=*********
PT_BACKUPDATETIME=`date +%s`
PT_BACKUPFILENAME=mysqlbackup_$PT_BACKUPDATETIME.sql.gz
PT_FILESTOKEEP=14

$PT_MYSQLDUMPPATH/mysqldump -u$PT_MYSQLUSER -p$PT_MYSQLPASSWORD --opt $PT_MYSQLDATABASE | gzip -c > $PT_MYSQLBACKUPPATH/$PT_BACKUPFILENAME
Run Code Online (Sandbox Code Playgroud)

问题在于它会继续转储文件夹中的备份,而不是清理旧文件。这就是变量的PT_FILESTOKEEP用武之地。无论设置为多少,这就是我想要保留的备份数量。所有备份都带有时间戳,因此通过按名称 DESC 对其进行排序,您将首先获得最新的备份。

任何人都可以帮我完成 BASH 脚本的其余部分来添加文件清理吗?我缺乏 bash 的知识,我无法拼凑代码来完成其余的工作。

小智 11

你可以试试这个:

ls -r1 $PT_MYSQLBACKUPPATH/ | tail -n +$(($PT_FILESTOKEEP+1)) | xargs rm
Run Code Online (Sandbox Code Playgroud)

ls -r1 将按相反顺序列出所有文件,每行一个文件。

tail -n +$number 过滤掉列表的前 $number-1 个文件(分别显示从 $number 开始到最后一个的所有文件)。

xargsrm使用标准输入中的所有文件名执行。


Oll*_*lli 9

首先,请确保您位于正确的文件夹中:

if [ -z $PT_MYSQLBACKUPPATH ]; then
 echo "No PT_MYSQLBACKUPPATH set. Exit"
 exit 1
fi
cd $PT_MYSQLBACKUPPATH
if [ $? != 0 ]; then
 echo "cd to PT_MYSQLBACKUPPATH failed. Exit"
 exit 1
fi
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以删除早于 n 的文件:

find -mtime +14 -delete
Run Code Online (Sandbox Code Playgroud)

删除超过 14 天的文件。

对于您的问题,更复杂(虽然绝对不是最佳)解决方案:

# Get list of newest files. If newest files are first, use head -n 14 instead of 
# head.
files=(`ls | sort | tail -n 14`)
# Loop over all files in this folder
for i in *; do 
 preserve=0; 
 #Check whether this file is in files array:
 for a in ${files[@]}; do 
  if [ $i == $a ]; then 
   preserve=1; 
  fi; 
 done; 
 # If it wasn't, delete it (or in this case, print filename)
 if [ $preserve == 0 ]; then 
  echo $i; # test first, then change this to "rm $i"
 fi;
done
Run Code Online (Sandbox Code Playgroud)

  • 不要_永远_使用`for i in $(ls)`或`var=($(ls))`(提示:`for i in *`)除非你可以400%确定文件名永远不会包含空格或任何东西像那样。 (2认同)