А команда удалить файлы старше X дней, но оставить последние 2 файла - PullRequest
0 голосов
/ 23 октября 2019

Мне нужна помощь с командой для удаления файлов на сервере.

У меня есть какая-то папка архива. имена файлов в форме app-XXXXXX.tar.gz, где XXXXXX - дата резервного копирования. Например, app-231019.tar.gz

Мне нужно удалить файлы старше 14 дней, но не последние 2 файла.

Я нашел команду

find /folder +14 -type f -delete

но он мне не подходит

  1. Фильтр «старше 14 дней» следует применять на основе имени файла, а не даты записи на сервер.
  2. Я не могу найти команду, как установить ограничение, чтобы последние 2 файла не удалялись, даже если они старше 14 дней.

1 Ответ

0 голосов
/ 23 октября 2019

Не могли бы вы попробовать следующее:

dir="dir"   # replace with your pathname
fortnightago=$(awk 'BEGIN {print strftime("%y%m%d", systime() - 86400 * 14)}')
# If your date command supports -d option, you can also say as:
# fortnightago=$(date -d "14 days ago" +%y%m%d)

for i in "$dir"/app-*.tar.gz; do
    if [[ $i =~ app-([0-9]{2})([0-9]{2})([0-9]{2})\.tar\.gz ]]; then
        yy="${BASH_REMATCH[3]}"
        mm="${BASH_REMATCH[2]}"
        dd="${BASH_REMATCH[1]}"
        if (( $yy$mm$dd <= $fortnightago )); then
            printf "%d%d%d%c%s\n" "${yy#0}" "${mm#0}" "${dd#0}" $'\t' "$i"
        fi
    fi
done | sort -rn -k1 | tail -n +3 | cut -f 2 | xargs rm --

[Объяснение]

  • Сначала он извлекает строку даты и переставляет ее в "% y"% m% d "порядок числового сравнения.
  • Печать имен файлов старше 14 дней с добавлением даты в 1-м поле.
  • Затем сортировка имен файлов по 1-му полю в убывающемorder (сначала самый последний файл).
  • Затем пропустите первые две строки, чтобы сохранить их.
  • Вырежьте имена файлов как список удаления.
  • Имена файлов будут переданыxargs с командой rm.

В качестве альтернативы, если perl является вашим вариантом, вы можете сказать:

perl -e '
    $dir = "dir";
    @t = localtime(time() - 86400 * 14);
    $fortnightago = sprintf("%02d%02d%02d", $t[5] - 100, $t[4] + 1, $t[3]);
    @ary = map { $_->[0] }
    sort { $b->[1] <=> $a->[1] }
    grep { $_->[1] <= $fortnightago }
    map { [ $_, m/app-(\d{2})(\d{2})(\d{2})\.tar\.gz/ && "$3$2$1" ] }
    (<$dir/app-*.tar.gz>);
    unlink splice(@ary, 2);
'

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...