Я настроил ежедневное задание cron для резервного копирования моего сервера.
При резервном копировании моей папки команда резервного копирования создает 2 файла: сам архив .tar.gz и файл .info. json как следующие:
-rw-r--r-- 1 root root 1617 Feb 2 16:17 20200202-161647.info.json
-rw-r--r-- 1 root root 48699726 Feb 2 16:17 20200202-161647.tar.gz
-rw-r--r-- 1 root root 1617 Feb 3 06:25 20200203-062501.info.json
-rw-r--r-- 1 root root 48737781 Feb 3 06:25 20200203-062501.tar.gz
-rw-r--r-- 1 root root 1618 Feb 4 06:25 20200204-062501.info.json
-rw-r--r-- 1 root root 48939569 Feb 4 06:25 20200204-062501.tar.gz
Как написать скрипт bash, который будет хранить только последние 2 архива и удалит все остальные резервные копии (targ.gz и info. json).
В этом примере это будет означать удаленные 20200204-062501.info. json и 20200204-062501.tar.gz.
Редактировать:
Я заменяю -name на - wholename в скрипте, но когда я его запускаю, он, очевидно, не имеет никаких эффектов. Старые архивы все еще там, и они не были удалены.
скрипт:
#!/bin/bash
DEBUG="";
DEBUG="echo DEBUG..."; #put last to safely debug without deleting files
keep=2;
for suffix in /home/archives .json .tar; do
list=( $( find . -wholename "*$suffix" ) ); #allow for zero names
if [ ${#list[@]} -gt $keep ]; then
# delete all but last $keep oldest files
${DEBUG}rm -f "$( ls -tr "${list[@]}" | head -n-$keep )";
fi
done
Редактировать 2:
если я запускаю скрипт @sorin, действительно ли он удаляет все, если я верю выводу скрипта?
Папка архива перед запуском скрипта:
https://pastebin.com/7WtwVHCK
Сценарий, который я запускаю:
find home/archives/ \( -name '*.json' -o -name '*.tar.gz' \) -print0 |\
sort -zr |\
sed -z '3,$p' | \
xargs -0 echo rm -f
Вывод сценария:
https://pastebin.com/zd7a2zcq* 10 36 *
Редактировать 3:
Команда find /home/archives/ -daystart \( -name '*.json' -o -name '*.tar.gz' \) -mtime +1 -exec echo rm -f {} +
работает и выполняет работу.
Помечено как решенное