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

Как переместить данные adobe flash с одного компьютера на другой?
Автоматическое резервное копирование открытых вкладок Google Chrome при сбое
Загрузка нескольких файлов с ftp-сервера с помощью сценария bash
Outlook не удается сделать резервную копию pst (ошибка)?
Какая утилита может переместить загрузочный раздел Windows на другой жесткий диск? [закрытый]
Резервное копирование окон в работающей системе
Инкрементное копирование из Linux в общий ресурс windows
rsync только по пути / имени файла?
Является ли Windows 7 файл восстановления / резервного копирования образа сломанной на Windows 8?
Использование OneDrive в качестве резервной копии для моей библиотеки изображений
Где Dashlane хранит файл данных паролей?
"произошла внутренняя ошибка shile перечисления резервных наборов данных"
Насколько надежна Clonezilla для резервного копирования и восстановления Windows Vista Home Premium?
Как разделить большой файл резервной копии MySql на несколько файлов?
Повторное создание образов Windows 7

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

у меня есть этот скрипт 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

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

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

5
задан djsmiley2k
источник

6 ответов

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

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
отвечен Olli 2014-02-23 10:41:26
источник

вы можете попробовать это:

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

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

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

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

11
отвечен bmk 2017-10-26 15:47:24
источник

вот мое использование вдохновения из этого поста:

#!/bin/bash
# Thu Jun 28 13:22:53 CEST 2012
# ${DESTDIR}/files2keep.sh
# Keep the 3 yungest files
# mra at miracleas.dk , deployed on RHEL 6.
InitValues(){
TODAY=`date +"%Y%m%d"`
NOW=`date +"%H%M"`
DESTDIR=/mnt/dbdmp
LOGFILE=?{0}-${TODAY}-${NOW}.log
}
BackupFileMaintenance(){
KEEPFILES=(`ls -lrt ${DESTDIR}/*mysqldump.sql.gz| tail -n 3| awk '{print }'`)
    for i in `ls -lrt ${DESTDIR}/*mysqldump.sql.gz | awk '{print }'`; do
    preserve=0 
    #Check whether this file is in files array:
        for a in ${KEEPFILES[@]}; do
                if [ $i == $a ]; then
                preserve=1 
                fi 
        done 
    if [ $preserve == 0 ]; then
    echo $i; # then change this to "rm -f $i" after test
    fi
    done
}
InitValues
BackupFileMaintenance
exit
3
отвечен Martin Rønde Andersen 2012-06-28 14:34:12
источник

по поводу ответа от БМК, при наличии ls -t1 безопаснее, чем -r1 (Сортировать по времени изменения, а не произвольный порядок файлов)

также на некоторых версиях синтаксиса хвост tail -n +$number (опция-n необходима)

в качестве бонуса, сочетая оба find и ls, вот способ удалить файлы старше 30 дней, но сохранить по крайней мере 15 файлов:

ls -t1 $PT_MYSQLBACKUPPATH/|tail -n +16| xargs -n1 basename|xargs -n1 -I{} find $PT_MYSQLBACKUPPATH/ -mtime +30 -name {} -delete
3
отвечен Jocelyn 2013-06-02 17:31:19
источник

извините, что снова открываю этот старый поток, но у меня недавно была аналогичная проблема и я не мог найти хорошее решение.

В конце концов я решил это так:

cd /directory_where_things_need_removing
ls -tr1dQ * | head -n -31 | xargs rm -rf

важными частями являются ls-tr1dQ, где Q кавычек, решая проблему пробелов, и 1, который дает 1 решение в строке. голова-n -31, которая пропускает первые 31 строку (в моем случае = 1 месяц). обратите внимание - перед n и перед количеством строк, которые вы хотите сохранить. протестировано на scientific linux 6.5

0
отвечен baziel 2014-08-04 12:04:50
источник
ls -t /path/* | grep -v "$(ls -t /path/* | head -6)" | xargs rm -f
-1
отвечен jeffoule 2013-08-12 18:17:50
источник

Другие вопросы backup bash linux