日期命令可以將文件中的另一個日期命令作為參數嗎?

日期命令可以將文件中的另一個日期命令作為參數嗎?

我正在閱讀GNU coreutils 手冊,我正在嘗試該 date命令。這是我在文中發現的:

  1. date指令有一個選項:-f datefile

    • 解析每一行日期文件與 一樣-d 並顯示結果日期和時間。
    • 這意味著date正在查看中的每一行日期文件 並將其視為用於顯示特定日期的日期字串。
  2. 第29章(日期輸入格式),指出:

    命令的輸出date並不總是可以接受作為日期字串,不僅因為語言問題,還因為像「IST」這樣的時區項目沒有標準意義。  當用於date產生打算稍後解析的日期字串時,指定獨立於語言且不使用“UTC”和“Z”以外的時區項目的日期格式。以下是一些方法:

    $ LC_ALL=C TZ=UTC0 date
    
    • 這個陳述(尤其是粗體部分)對我來說意味著我應該能夠將 日期文件date諸如上面的命令,以及 我 date在終端機中發出的命令應該能夠解析該date命令日期文件 並輸出對應的日期。

它對我不起作用。日期文件中的日期命令有問題(錯誤的引號,一些我不知道的特殊語法...),或者該-f datefile選項無法處理這種情況。

總而言之,我要問的是:

  • date -f命令是否可以輸入一個文件,其中一行上的日期字串是另一個日期命令?例如,我可以在文件的第一行添加一個字串“date”(作為命令,將返回系統時間),然後將該文件輸入到命令中 date -f並獲取當前系統時間(由 date命令生成)在文件中)?

答案1

GNU 日期正確解析的日期時間的正確格式是:

$ 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"

然後您需要使用 shell 執行每一行。
一種快速解決方案是獲取檔案並執行所有命令。

$ . ./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

datecoreutils 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

相關內容