Как работает опция «1 месяц назад» в команде date?

stty конфигурация является частью определенного терминала, Вы находитесь в, не глобальная установка. Необходимо будет добавить, что команда stty к конфигурации оболочки (например, ~/.bashrc), чтобы иметь его применяется каждый раз, когда Вы открываете терминал.

22
09.06.2015, 00:17
3 ответа

- 1 месяц вычитает единицу из номера месяца, а затем, если полученная дата недействительна (например, 30 февраля ), измените ее так, чтобы она была действительной. . Итак, 31 декабря - 1 месяц - это 1 декабря , а не день в ноябре, а 31 марта - 1 месяц - 3 марта ( если не выполнено в високосный год).

Вот цитата с информационной страницы для Gnu date (которая является версией date , которая реализует этот синтаксис), которая включает хорошее предложение сделать более надежная арифметика:

Нечеткость в единицах измерения может вызвать проблемы с относительными элементами. Например, 2003-07-31 -1 месяц может оцениваться как 2003-07-01, потому что 2003-06-31 является недопустимой датой. Чтобы определить предыдущий месяц более , вы можете запросить месяц до 15-го числа текущего месяца. Например:

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!

Другое предупреждение, также цитируемое на информационной странице:

Также будьте осторожны при манипулировании датами круглосуточными изменениями, такими как переход на летнее время. В некоторых случаях они прибавляли или вычитали от часов, поэтому часто бывает разумно принять всемирное время, установив для переменной среды TZ значение UTC0 перед выполнением календарных вычислений.

24
27.01.2020, 19:43

Вместо того, чтобы полагаться на имена файлов для очистки файлов резервных копий, безопаснее полагаться на их метаданные времени.

Например, вы можете удалить все файлы старше 30 дней с помощью этой команды:

/usr/bin/find /path/to/your/files -type f -ctime +30 -delete

В качестве бесплатного бонуса ежедневная работа позволит вам сохранять файлы резервных копий в текущем месяце, что позволит лучше управлять дисковым пространством.

Чтобы сохранить 1-й или 15-й файлы, вы можете либо сохранить их в другом каталоге, либо обновить команду поиска с параметром -not -name.

2
27.01.2020, 19:43

Вы можете попробовать посмотреть, как работает дата, по следующему:

date -d "$(date -d "Mar 31 2019" +%F) +1 month ago"
Sun Mar  3 00:00:00 EET 2019

Итак, я думаю, что на основе текущего прошлого месяца (не текущего, если это март ), уменьшается количество дней с последнего месяца по сравнению с текущим месяцем.

Вы можете попробовать следующий синтаксис для удаления файлов старше, чем число дней (в примере ниже 31 день ). Одна строка для решения проблемы (это для простого подхода ).

find /path/to/folder/with/arhives/ -mindepth 1 -mtime +31 -delete

Для более подробного подхода вы также можете сделать что-то вроде этого :1. Нахождение количества дней в текущем месяце:

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. Нахождение количества дней за последний месяц:

    echo "$ (cal $ (date +%m )$ (date +%y )| egrep -v "$ (date +%y )|Su" | xargs | awk '{print $NF}' )-"$ (cal $ (date -d "+1 месяц назад" +%m )$ (date + %у )| egrep -v "$ (date +%y )|Su" | xargs | awk '{print $NF}' )| до нашей эры

  2. Итак, теперь мы находим разницу между этими двумя месяцами:

    echo "$ (cal $ (date +%m )$ (date +%y )| egrep -v "$ (date +%y )|Su" | xargs | awk '{print $NF}' )-"$ (cal $ (date -d "+1 месяц назад" +%m )$ (date + %у )| egrep -v "$ (date +%y )|Su" | xargs | awk '{print $NF}' )| до нашей эры

Теперь давайте назначим некоторые переменные этим трем шагам. Шаг 1 Имя переменной :FCM Шаг 2 Имя переменной :FLM Шаг 3 Имя переменной :DCL

FCM=$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
FLM=$(al $(date -d "+1 month ago" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
DCL=$(echo "$FCM-$FLM" | bc)

Проверить, равен ли $DCL 0 (нулю )и удалить на основе разницы между $FCM и $FLM:

if [ $DCL -ne 0 ]; then
    if [ $DCL -lt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    elif [ $DCL -gt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    fi
else
    find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$FLM -delete
fi

Вы также можете добавить переменную в «/path/to/folde/with/arhives/».

Заключение :Если вы хотите удалить файлы старше одного месяца (ровно ),вам нужно настроить точное количество дней, если вы используете команду «дата» и «+1 месяц назад».

0
27.01.2020, 19:43

Теги

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