私は読んでいますGNU coreutils マニュアル、私は date
コマンドを試しています。テキストで見つけた内容は次のとおりです。
コマンドにはオプション
date
があります:-f datefile
- 各行を解析する日付ファイルと同様に
-d
、結果の日付と時刻を表示します。 - つまり、
date
各行を見るということです日付ファイル それを日付文字列として扱い、特定の日付を表示するために使用します。
- 各行を解析する日付ファイルと同様に
で第29章(日付入力形式)、次のように述べられています。
コマンドの出力は
date
、言語の問題だけでなく、「IST」などのタイムゾーン項目に標準的な意味がないため、日付文字列として必ずしも受け入れられるとは限りません。date
後で解析することを目的とした日付文字列を生成するために使用する場合言語に依存せず、「UTC」と「Z」以外のタイムゾーン項目を使用しない日付形式を指定します。これを行うには、次の方法があります。$ LC_ALL=C TZ=UTC0 date ︙
- この文(特に太字部分)は、私が 日付ファイル
date
上記のようなコマンドがあり、 ターミナル で発行したコマンドは、そのコマンドdate
を解析できるはずです。date
日付ファイル 対応する日付を出力します。
- この文(特に太字部分)は、私が 日付ファイル
私の環境では機能しません。日付ファイル内の日付コマンドに問題があるか (引用符が間違っている、知らない特殊な構文など)、オプションが-f datefile
この状況を処理できないかのどちらかです。
要約すると、私が尋ねているのは次のことです。
date -f
1 行の日付文字列が別の日付コマンドであるファイルをコマンドに渡すことはできますか? たとえば、ファイルの最初の行に文字列「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
また、これにより、他の問題を引き起こす可能性のあるスペースも回避されます。
ファイルに次のように日付ごとに 1 行ずつ含まれている場合:
$ 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"
次に、シェルで各行を実行する必要があります。
1 つの迅速な解決策は、ファイルをソース化してすべてのコマンドを実行することです。
$ . ./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
coreutils 8.21以降ではdate
、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