Как я могу получить относительную дату на основе относительной даты командой linux date?

Могу ли я получить «последний понедельник на основе 10 минут назад» командой linux date?

Например

  • Текущее время: 2016-02-09 00:05:00
  • ожидаемый результат: 2016-02-01 00:00:00

  • Создайте каталог с сегодняшней датой и переместите в него файлы
  • Выполнение программы в соответствии с последней измененной датой
  • Datecalc эквивалент для Linux
  • вырезать фрагмент файла в зависимости от времени написания строк
  • Как изменить язык для команды даты?
  • как прикасаться к файлам, таким как report-07/05/13
  • Резервное копирование файлов, которые были изменены после последней резервной копии
  • Что такое distro-agnostic способ определить дату установки ОС?
  • 4 Solutions collect form web for “Как я могу получить относительную дату на основе относительной даты командой linux date?”

    Если у вас есть faketime и ваша date динамически связана:

     faketime -f -10m date -d 'last monday' '+%F %T' 

    С ksh93 (только встроенные команды):

     printf '%(%F %T)T\n' "$(printf '%(%Y.%m.%d)T' '10 minutes ago')-0 last monday" 

    Здесь, если это было в прошлое воскресенье, а не в прошлый понедельник , вы могли бы сделать:

     date -d "$(date -d '10 minutes ago' +"%F -%u day")" 

    Или, если это было в прошлую субботу :

     date -d "$(date -d '10 minutes ago' +"%F -%w day -1 day")" 

    Но в прошлый понедельник или в любой другой день недели это связано с некоторой арифметикой:

     eval "date -d \"$(date -d '10 minutes ago' +'%F -$(((%u+5)%%7+1)) day')\"" 

    В противном случае вы всегда можете:

     d=$(date -d 'last monday'); sleep 600; printf '%s\n' "$d" 

    😉

    Вы можете сделать это за 2 сеанса. Вот быстрый скрипт оболочки bash:

     TIME_TEN_MINUTES_AGO=`date -d '-10 min' +%T` LAST_MON=`date -d 'last-monday' +%Y-%m-%d` echo "NOW: " `date "+%Y-%m-%d %T"` echo "Last Mon: " $LAST_MON $TIME_TEN_MINUTES_AGO 

    Это печатает:

     NOW: 2016-02-12 07:54:27 Last Mon: 2016-02-08 07:44:27 

    Не слишком элегантный, но это должно сделать трюк:

     #! /bin/bash export LC_ALL=C # makes sure we're using C locale even in subshells day_10_minutes_ago=$(date -d '-10min' +%a) # stores which weekday it was 10 minutes ago day_now=$(date -d +%a) # stores which weekday it is now if [ $day_10_minutes_ago = "Mon" ]; then # if ten minutes ago it was Monday if [ $day_now = "Mon" ] # if it's still Monday date -d '-1week 00:00' '+%F +%T' # prints the date and the time it was one week ago at 00:00 else # it can only be Tuesday before 00:10:00 AM date -d '-1week-1day 00:00' '+%F +%T' # prints the date and the time it was one week and one day ago at 00:00 fi else # it can only be Tuesday after 00:09:59 AM, Wednesday, Thursday, Friday, Saturday or Sunday date -d 'last-monday 00:00' '+%F +%T' # prints the date and the time it was last Monday at 00:00 fi 

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

     #!/bin/bash DAY=`date --date='-10 min' +"%a"` SEC=`date --date='-10 min' +"%s"` if [[ "$DAY" == "Mon" ]]; then DDIF="7" elif [[ "$DAY" == "Tue" ]]; then DDIF="1" elif [[ "$DAY" == "Wed" ]]; then DDIF="2" elif [[ "$DAY" == "Thu" ]]; then DDIF="3" elif [[ "$DAY" == "Fri" ]]; then DDIF="4" elif [[ "$DAY" == "Sat" ]]; then DDIF="5" elif [[ "$DAY" == "Sun" ]]; then DDIF="6" fi EPOCH=$(awk "BEGIN {print $SEC-(86400*$DDIF); exit}") date -d@"$EPOCH" 

    Что это значит, выясняется, какой день 10 минут назад падает. Выясняется, сколько дней прошло с понедельника. Затем умножается на многие дни на 86400 (количество секунд за один день) и вычитает его из Эпохи, основываясь на 10 минутах назад. Наконец, он преобразует значение эпохи в стандартный формат.

    Как я уже сказал, не обязательно простая, одна строка или элегантная.

    Linux и Unix - лучшая ОС в мире.