Создание ежедневного 6-часового ряда дат (4 временных -шагов в день )с помощью команды linux «date»

Как уже сказано в ответе на вопрос, который вы связали, mvможет добавлять суффиксы к файлам, которые в противном случае были бы перезаписаны перемещаемым файлом, с номером, чтобы дать им уникальное имя файла:

mv --backup=t <source_file> <dest_file>

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

Однако это добавит суффиксы вроде .~1~, что кажется не тем, что вам нужно:

$ ls
file.pdf
file.pdf.~1~
file.pdf.~2~

Вы можете переименовать эти файлы на втором этапе, чтобы получить имена в формате, подобном file_1.pdfвместо file.pdf.~1~, например. вот так:

rename 's/((?:\..+)?)\.~(\d+)~$/_$2$1/' *.~*~

При этом все файлы, которые заканчиваются нежелательным суффиксом резервной копии (, сопоставляются с шаблоном оболочки*.~*~)и позволяют инструменту renameпопытаться сопоставить регулярное выражение ((?:\..+)?)\.~(\d+)~$в имени файла. Если это совпадает, он захватит индекс из суффикса.~1~-как вторая группа($2)и, необязательно, если имя файла имеет расширение перед этим суффиксом, например .pdf, которое будет захвачено первой группой ($1). ]. Затем он заменяет полную совпадающую часть имени файла на _$2$1, вставляя захваченные значения вместо заполнителей.

В основном он будет переименовывать, например. file.pdf.~1~до file_1.pdfи something.~42~до something_42, но он не может определить, имеет ли файл несколько расширений, поэтому, например. archive.tar.gz.~5~станетarchive.tar_5.gz

2
08.09.2020, 13:32
2 ответа

Вы должны беспокоиться о переходе на летнее время. Например, мой часовой пояс — Канада/Восточная, а:

$ d=$(date -d "2020-03-08 00:00:00")
$ echo $d
Sun Mar 8 00:00:00 EST 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Mar 8 07:00:00 EDT 2020
#........^^

и

$ d=$(date -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 EDT 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Nov 1 05:00:00 EST 2020
#........^^

Убедитесь, что вы указали UTC для часового пояса.

$ d=$(date -u -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 UTC 2020
$ d=$(date -u -d "$d + 6 hours")
$ echo $d
Sun Nov 1 06:00:00 UTC 2020
#........^^

Так:

fmt='%d-%m-%Y %H:%M'
d=$(date -u -d "1998-01-01 00:00:00")
for i in {1..1825}; do 
    # print the current date
    date -u -d "$d" "+$fmt"
    # add 6 hours
    d=$(date -u -d "$d + 6 hours")
done

Я настоятельно рекомендую вам использовать формат даты ISO ГГГГ -мм -дд :, который является однозначным форматом даты, и он сортируется одинаково в лексическом и хронологическом порядке.

1
18.03.2021, 23:06

С помощью GNU dateвы можете добавлять постоянно -увеличивающееся количество часов к начальной точке

start="$(date +'%Y-%m-%d')"
for i in {0..1825}
do
    date --date "$start +$((i*6)) hours" +'%d-%m-%Y %H:%M'
done

Шестичасовой интервал остается постоянным, но в моем регионе (часовой пояс Великобритании )фактическое время смещается вследствие переключения между летним и зимним временем.

24-10-2020 00:00
24-10-2020 06:00
24-10-2020 12:00
24-10-2020 18:00
25-10-2020 00:00
25-10-2020 05:00    ← Six hours on from midnight because the clock goes back one hour at 03:00
25-10-2020 11:00
25-10-2020 17:00
25-10-2020 23:00

В вашем вопросе не указано, хотите ли вы, чтобы интервалы были в полночь, 6:00, полдень и 18:00, независимо от возможного переключения между летним/зимним временем, или вы хотите, чтобы интервалы были фиксированными и составляли точные шестичасовые интервалы.

Используйте date --utcвместо простого date, чтобы гарантировать создание серии даты и времени, которые кажутся разделенными на шесть часов, независимо от часового пояса.

0
18.03.2021, 23:06

Теги

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