Не могли бы вы попробовать следующее:
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);
'
Надеюсь, это поможет.