Я читаю черезРуководство по GNU coreutils, и я экспериментирую с date
командой. Вот что я нашел в тексте:
Команда
date
имеет опцию:-f datefile
- Разобрать каждую строку вфайл_датыкак и с
-d
и отобразить полученную дату и время. - это означает,
date
что нужно смотреть на каждую строку вфайл_даты и рассматривать его как строку даты для использования с целью отображения определенной даты.
- Разобрать каждую строку вфайл_датыкак и с
Вглава 29 (Форматы ввода даты), говорится:
Вывод команды
date
не всегда приемлем в виде строки даты не только из-за проблем с языком, но и из-за отсутствия стандартного значения для элементов часового пояса, таких как «IST». При использованииdate
для генерации строки даты, предназначенной для последующего анализа, укажите формат даты, который не зависит от языка и не использует элементы часового пояса, кроме «UTC» и «Z». Вот несколько способов сделать это:$ LC_ALL=C TZ=UTC0 date ︙
- это утверждение (особенно выделенная жирным шрифтом часть) подразумевает для меня, что я должен быть в состоянии поместить файл_датыкоманда
date
, подобная приведенной выше, иdate
команда, которую я ввожу в терминале, должны быть способны проанализировать этуdate
команду вфайл_даты и вывести соответствующую дату.
- это утверждение (особенно выделенная жирным шрифтом часть) подразумевает для меня, что я должен быть в состоянии поместить файл_датыкоманда
У меня это не работает. Либо что-то не так с моей командой date в datefile (неправильные кавычки, какой-то особый синтаксис, о котором я не знаю...), либо опция -f datefile
не способна обработать эту ситуацию.
Вкратце, я спрашиваю следующее:
- можно ли
date -f
передать команде файл, в котором строка даты на одной строке представляет собой другую команду даты? Например, можно ли поместить в файл строку «date» на первой строке (которая, как команда, вернет системное время), а затем передать этот файл командеdate -f
и получить текущее системное время (сгенерированное командойdate
в файле)?
решение1
Правильный формат даты и времени, который будет правильно проанализирован GNU date, следующий:
$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000
И это также позволяет избежать пробелов, которые могут создавать другие проблемы.
Если ваш файл содержит по одной строке на дату, например:
$ cat dates.txt
1992-03-28T14:26:01+0000
2004-02-29T21:02:02+0000
2005-02-28T21:02:03+0000
2015-07-02T11:52:04+0000
2016-03-31T01:36:05+0000
Тогда это сработает:
$ TZ=America/Los_Angeles date -f infile
Sat Mar 28 06:26:01 PST 1992
Sun Feb 29 13:02:02 PST 2004
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 04:52:04 PDT 2015
Wed Mar 30 18:36:05 PDT 2016
Если вы хотите создать файл с «командами даты», как в:
$ cat dates.txt
date -d "1992-03-28T14:26:01+0000"
date -d "2004-02-29T21:02:02+0000"
LC_ALL=C TZ=UTC0 date -d "2005-02-28T21:02:03+0000" +"%Y-%m-%d"
TZ=America/Los_Angeles date -d "2005-02-28T21:02:03+0000"
date -d "2015-07-02T11:52:04+0000"
date -d "2016-03-31T01:36:05+0000"
Затем вам нужно выполнить каждую строку с помощью оболочки.
Одним из быстрых решений является отправка файла, и все команды будут выполнены.
$ . ./dates.txt
Sat Mar 28 14:26:01 GMT 1992
Sun Feb 29 21:02:02 GMT 2004
2005-02-28
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 11:52:04 GMT 2015
Thu Mar 31 01:36:05 GMT 2016
Отвечает ли это на ваш вопрос?
решение2
С date
coreutils 8.21, TZ=UTC и LC_ALL=CI получаем
$ date > x; sleep 1; date >> x; sleep 1; date >> x
$ date -f x
Wed Sep 28 03:32:39 UTC 2016
Wed Sep 28 03:32:40 UTC 2016
Wed Sep 28 03:32:41 UTC 2016
$
как и ожидалось. Я также проверил исходный код: магия происходит в процедуре batch_convert
, где по сути есть цикл по parse_datetime()
/, show_date()
как и в случае с командной строкой (используя -d
).
решение3
Нет, вы не можете читать LC_ALL=C TZ=UTC0
из файла с расширением date -f
.
cat tz
LC_ALL=C TZ=UTC0
date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”
Однако вы можете поместить всю команду в файл, например так:
cat date
#!/bin/bash
LC_ALL=C TZ=UTC0 date
Затем запустите его из командной строки, что даст вам:
./date
Tue Sep 27 06:56:29 UTC 2016
В отличие от часового пояса на моем сервере, который:
date
tis 27 sep 2016 08:56:52 CEST