Цикл с определенным шагом в длинной строке даты и времени в bash - PullRequest
1 голос
/ 03 мая 2019

У меня есть список файлов с подстрокой ГГГГММДДЧЧ (пример: 2016112200 означает 2016 год 22 ноября в 00 часов). Эти файлы: temp_2016102200.data, temp_2016102212.data, temp_2016102300.data, temp_2016102312.data, ..., temp_20170301.data. И У меня также есть другое семейство файлов, заменяющее temp на wind.

Для каждой строки ГГГГММДДЧЧ я хочу создать tar с temp и соответствующим ему файлом wind. Я не хочу останавливать этот процесс, если один или оба файла отсутствуют.

Моя идея состояла в том, чтобы сделать цикл с 12 до 12 часов, но у меня возникли некоторые проблемы, потому что для указания даты, которую я сделал: b=$(date -d '2016111400' +'%Y%m%d%H'), но bash сообщает мне, что это недопустимая дата ...

Спасибо.

1 Ответ

2 голосов
/ 03 мая 2019

Это не bash говорит вам, что формат даты неправильный: date говорит вам. Не все, что вы вводите, является командой bash .

Как комментирует Камил, вы должны разделить его так, чтобы дата могла его проанализировать. Формат YYYY-mm-dd HH:MM:SS является анализируемым. Использование bash раскрытия параметров для извлечения соответствующих подстрок:

$ d=2016111400
$ date -d "${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:00:00"
Mon Nov 14 00:00:00 EST 2016

Теперь, когда вы хотите добавить 12 часов, вы должны быть осторожны, чтобы сделать это в нужном месте в строке даты и времени: если вы добавите + символ после времени, он будет быть проанализирован как смещение часового пояса, поэтому поместите относительную часть сначала или между датой и временем.

$ date -d "+12 hours ${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:00:00"
Mon Nov 14 12:00:00 EST 2016

Как цикл, вы можете сделать:

d=2016111400
for ((i=1; i<=10; i++)); do
  # print this datetime
  date -d "${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:00:00"
  # add 12 hours
  d=$( date -d "+12 hours ${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:00:00" "+%Y%m%d%H" )
done
1 022 * * выходы: * +1023 *
Mon Nov 14 00:00:00 EST 2016
Mon Nov 14 12:00:00 EST 2016
Tue Nov 15 00:00:00 EST 2016
Tue Nov 15 12:00:00 EST 2016
Wed Nov 16 00:00:00 EST 2016
Wed Nov 16 12:00:00 EST 2016
Thu Nov 17 00:00:00 EST 2016
Thu Nov 17 12:00:00 EST 2016
Fri Nov 18 00:00:00 EST 2016
Fri Nov 18 12:00:00 EST 2016

ОК, более приятный способ зацикливания

start=2019043000
end=2019050300

plus12hours() {
  local d=$1
  date -d "+12 hours ${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:00:00" "+%Y%m%d%H"
}

for (( d = start; d <= end; d = $(plus12hours "$d") )); do
  printf "%d\t%s\n" "$d" "$(date -d "${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:00:00")"
done
2019043000  Tue Apr 30 00:00:00 EDT 2019
2019043012  Tue Apr 30 12:00:00 EDT 2019
2019050100  Wed May  1 00:00:00 EDT 2019
2019050112  Wed May  1 12:00:00 EDT 2019
2019050200  Thu May  2 00:00:00 EDT 2019
2019050212  Thu May  2 12:00:00 EDT 2019
2019050300  Fri May  3 00:00:00 EDT 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...