Я не уверен, получает ли это прошлую дату в течение текущего дня, или это займет всего 30 или 31 день.
например
Если текущая дата - March 28th
1 месяц назад February 28th
, то что же произойдет, когда это произойдет March 30th
?
сценарий
Я хочу делать резервные копии некоторых файлов каждый день, скрипт будет сохранять эти файлы в пределах текущей даты в $(date +%Y%m%d)
формате, например 20150603_bckp.tar.gz
, затем, когда наступит следующий месяц, удалите все эти файлы в течение 1 месяца назад, кроме файлов 1-го и 15-го, так что это мое состояние:
past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
rm /path/of/files/${past_month}_bckp.tar.gz
echo "Depuration done"
else
echo "Keep file"
fi
Но я хочу знать, что произойдет, когда дата будет 30, 31 или даже в прошлом феврале? Это будет держать эти файлы? или удалить файлы первого дня?
Когда он будет 31-го, будет выполняться удаление, поэтому, если в прошлом месяце было только 30 дней, это удалит файл первого дня?
Надеюсь, я намекнул.
Ответы:
- 1 month
вычтет единицу из номера месяца, а затем, если полученная дата недействительна (February 30
например,), скорректируйте ее так, чтобы она была действительной. Так иDecember 31 - 1 month
естьDecember 1
, не ноябрьский день, аMarch 31 - 1 month
естьMarch 3
(если не выполнено в високосный год).Вот цитата со страницы информации для Gnu
date
(этоdate
версия, которая реализует этот синтаксис), которая включает в себя хорошее предложение, чтобы сделать арифметику более устойчивой:Еще одно предупреждение, также цитируемое на информационной странице:
источник
date
реализации; в моей книге это семантически нелогично. - Спасибо за указание на это, это приятно знать.Вместо того чтобы полагаться на имена файлов для очистки файлов резервных копий, вам будет безопаснее полагаться на их метаданные времени.
Например, вы можете удалить все файлы старше 30 дней с помощью этой команды:
В качестве бесплатного бонуса ежедневная работа позволит вам хранить файлы резервных копий в непрерывном месяце, что позволит лучше управлять дисковым пространством.
Для хранения 1-го или 15-го файлов вы можете либо сохранить их в другом каталоге, либо обновить команду find с параметром -not -name.
источник
Вы можете попытаться увидеть, как работает дата, следующим образом:
Поэтому я думаю, что, исходя из текущего месяца в прошлом месяце (не текущего, если это март), уменьшается количество дней с последнего месяца по сравнению с текущим месяцем.
Вы можете использовать следующий синтаксис для удаления файлов старше нескольких дней (в примере ниже 31 день). Одна строка для решения проблемы (это для простого подхода).
Для более детального подхода вы также можете сделать что-то вроде этого: 1. Найти количество дней для текущего месяца:
Нахождение количества дней за последний месяц:
echo "$ (cal $ (date +% m) $ (date +% y) | egrep -v" $ (date +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (date -d "+1 месяц назад" +% m) $ (date +% y) | egrep -v "$ (date +% y) | Su" | xargs | awk '{print $ NF}') | До нашей эры
Итак, теперь мы находим разницу между этими двумя месяцами:
echo "$ (cal $ (date +% m) $ (date +% y) | egrep -v" $ (date +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (date -d "+1 месяц назад" +% m) $ (date +% y) | egrep -v "$ (date +% y) | Su" | xargs | awk '{print $ NF}') | До нашей эры
Теперь давайте назначим некоторые переменные этим 3 шагам. Шаг 1 Имя переменной: FCM Шаг 2 Имя переменной: FLM Шаг 3 Переменная NAme: DCL
Проверьте, равен ли $ DCL 0 (ноль), и удалите, основываясь на разнице между $ FCM и $ FLM:
Вы также можете добавить переменную в «/ path / to / folde / with / arhives /».
Вывод: если вы хотите удалить файлы старше одного месяца (ровно), вам нужно отрегулировать точное количество дней, если вы используете команду «дата» и «+1 месяц назад».
источник