Что случилось с моим сценарием удара, чтобы сохранить последние x файлы и удалить остальных?

У меня есть этот сценарий удара, который приятно создает резервную копию моей базы данных по расписанию крона:

#!/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

Проблема с этим состоит в том, что это будет продолжать выводить резервные копии в папке и не очищать старые файлы. Это то, где переменная PT_FILESTOKEEP входит. Безотносительно нумеруют, это установлено на, это - сумма резервных копий, которые я хочу сохранить. Все резервные копии являются временем, штампованным так путем упорядочивания им по имени, DESC даст Вам последнее сначала.

Кто-либо может помочь мне с остальной частью сценария Bash добавить уборку файлов? Моему знанию удара недостает, и я не могу соединить код, чтобы сделать остальных.

7
задан 09.05.2017, 22:05

2 ответа

Во-первых, убедитесь, что Вы находитесь в правильной папке:

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

Можно удалить файлы, более старые, чем n в случае:

find -mtime +14 -delete

Удаляет файлы, более старые, чем 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
9
ответ дан 07.12.2019, 14:28

Вы могли попробовать этого:

ls -r1 $PT_MYSQLBACKUPPATH/ | tail -n +$(($PT_FILESTOKEEP+1)) | xargs rm

ls -r1 перечислит все файлы в обратном порядке, один файл на строку.

tail -n +$number фильтрует первые файлы $number-1 списка (resp., отображает все файлы, начинающиеся с $number до последнего).

xargs выполнится rm со всеми именами файлов от стандартного входа.

11
ответ дан 07.12.2019, 14:28

Теги

Похожие вопросы