В #! / Bin / bash. Команда Unix для получения даты первого дня недели в месяце

Если устройство содержит поддерживаемую файловую систему, fsck должен работать. Устройство может быть целым жестким диском, например / dev / sda, или разделом, или дискетой (кто-нибудь помнит, что это было?), Например / dev / fd0, или даже файлом на другом жестком диске, например ~ / hdimage.img . Для дисководов обычно используется весь дисковод, поэтому нет причин для разбиения на разделы, поэтому файловая система создается на / dev / fd0. Обычно жесткие диски делятся на разделы, а файловые системы встраиваются в разделы. Однако, если вы хотите использовать весь диск как один раздел и вам не нужно загружаться с него, вы можете создать файловую систему прямо на устройстве (mke2fs / dev / sdb), смонтировать ее и скопировать на нее много файлов, тогда fsck / dev / sdb должен работать. Это было названо конфигурацией «superfloppy». Я думаю, что старые диски iomega емкостью 100 МБ также обычно форматировались таким образом. На диске даже не обязательно должна быть файловая система - на нем может быть один файл. Я часто делаю tar-файлы нужного размера, чтобы они поместились на DVD, и записываю их на диск. После этого диск нельзя смонтировать, но tar -xvf some / where / myfile / dev / sr0 извлекает myfile с диска.

8
06.03.2017, 16:41
4 ответа

В ksh93:

$ printf '%(%F)T\n' 'next month, first Monday'
2017-04-03

bash, начиная с 4.2 теперь поддерживает %(<формат)T в своем printf байтине, но не способность разбирать этот вид выражения даты.

Если бы вам пришлось использовать bash и вы хотели использовать этот %(<формат>)T, вы могли бы сделать это без форка с помощью чего-то вроде:

printf -v code '%(
  t=$((%s + (12 - %-H) * 60 * 60))
  increment=$((8 - %u))
  current_month=%m)T' -1
eval "$code"
until
  t=$((t + increment * 24 * 60 * 60)) # next Monday around mid-day
  printf -v code '%(date=%F month=%m)T' "$t"
  eval "$code"
  [ "$month" != "$current_month" ] # until be get to next month
do
  increment=7 # the first increment is the number of days
              # til Monday. Next increments are just a week.
done
echo "$date"
12
27.01.2020, 20:08

Предполагая дату GNU (для этого -d вы используете сами) и zsh -подобную оболочку для {1..7} :

$ for i in {1..7} ; do \
    LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
  done | awk '/Mon/ {print $1}'
2017-04-03

Замените awk Пн с любым днем ​​недели (используйте LC_ALL = C , чтобы получить названия месяцев на английском языке независимо от языкового стандарта пользователя). Кроме того, может быть лучше сохранить это в переменной, если вы будете запрашивать каждый день недели:

$ days=$(for i in {1..7} ; do \
           LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
         done)

$ for i in Mon Tue Wed Thu Fri Sat Sun ; do \
    echo "${days}" | awk "/${i}/"'{print $1}' ; \
  done
2017-04-03
2017-04-04
2017-04-05
2017-04-06
2017-04-07
2017-04-01
2017-04-02
10
27.01.2020, 20:08

PHP действительно упрощает синтаксический анализ дат с текстовым вводом, если он доступен в вашей системе.

Пример:

bash-[522]$ php -qr 'date_default_timezone_set("UTC"); echo date("d-m-Y\n", strtotime("first monday of next month"));'
03-04-2017

У меня есть эта функция в моем .bashrc:

get_date ()
{
    text="$*";
    php -qr "date_default_timezone_set(\"UTC\"); echo date(\"d-m-Y\n\", strtotime(\"$text\"));"
}

Которая я могу использовать как:

bash-[523]$ get_date first monday of next month
03-04-2017

Редактировать Добавление опции для использования cal

Почти каждая система, имеющая bash будет иметь cal . Календарная программа. Вы можете получить список даты для первого дня каждого дня недели, запустив комбинацию cal , date и awk следующим образом:

 cal -hN $(date -d 'next month' +%b' '%Y) | grep -v $(date -d 'next month' +%b) | awk -v date=$(date -d 'next month' +%Y-%m-) '{ printf "%s: "date"%02i\n", $1, $2; }'

Это даст вам следующий результат:

Su: 2017-04-02
Mo: 2017-04-03
Tu: 2017-04-04
We: 2017-04-05
Th: 2017-04-06
Fr: 2017-04-07
Sa: 2017-04-01

Измените $ 2 на $ NF в инструкции awk, чтобы получить дату последнего появления каждого дня месяца.

2
27.01.2020, 20:08

Вы можете просто перечислить все дни следующего месяца с рабочими днями:

# for i in `seq 1 93`; do date '+%Y-%m-%d %w' -d "+$((i - 31)) days"; done | sed 's|0$|7|g' | grep `date +"%Y-%m" --date="$(date +%Y-%m-15) 1 month"`
2021-02-01 1
2021-02-02 2
2021-02-03 3
2021-02-04 4
2021-02-05 5
2021-02-06 6
2021-02-07 7
2021-02-08 1
2021-02-09 2
2021-02-10 3
2021-02-11 4
2021-02-12 5
2021-02-13 6
2021-02-14 7
2021-02-15 1
2021-02-16 2
2021-02-17 3
2021-02-18 4
2021-02-19 5
2021-02-20 6
2021-02-21 7
2021-02-22 1
2021-02-23 2
2021-02-24 3
2021-02-25 4
2021-02-26 5
2021-02-27 6
2021-02-28 7

Добавьте это, чтобы получить первое воскресенье месяца: | grep 7$ | head -n 1

Вот и все


Не по теме :получить последнюю пятницу месяца: | grep 5$ | tail -n 1

Не по теме :получи что-нибудь за этот месяц, поменяй 1 monthна0 month

0
30.01.2021, 19:51

Теги

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