date 명령이 파일의 다른 날짜 명령을 인수로 사용할 수 있습니까?

date 명령이 파일의 다른 날짜 명령을 인수로 사용할 수 있습니까?

나는 그것을 통해 읽고있다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"

그런 다음 셸을 사용하여 각 줄을 실행해야 합니다.
한 가지 빠른 해결 방법은 파일을 소싱하는 것입니다. 그러면 모든 명령이 실행됩니다.

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

관련 정보