본문 바로가기

별걸다하는 IT/리눅스 유닉스

[Linux / Unix] 현재 날짜 찍기, 파일명에 날짜 넣기, 날짜 형식, 날짜 시간 변경 적용, 차이 등 (date)

[ LINUX 리눅스 , UNIX 유닉스 목차 ]

안녕하세요~!!

우아 오늘처럼 피곤한 날은 오랜만이네요 ㅎㅎㅎ 이번 포스팅은 좀 쉬엄쉬엄 써야겠어요 ㅎ

 

여지껏 포스팅 해왔던 find나 grep이나 기본 명령어들이나 다 자주 쓰이지만,

그 중 date명령어는 없어서는 안될 필수적인 명령어 중 하나입니다. (물론 앞에 것도 마찬가지)

 

오늘은 명령어 date를 알아보고, 이 활용도에 대해서 알아볼거예요

DATE 명령어

date명령어로 할 수 있는 건 크게 세 가지 입니다!

1. 내가 시스템에 설정하는 설정

2. 설정되어 있는 날짜 값을 원하는 형태로 받아보기

3. 과거 미래 덧셈 뺄셈 등 원하는 날짜 출력하거나 차이 구하기

 

이 세 가지 명령어의 활용은 무궁무진해요~

자동으로 파일명에 날짜를 포함시켜줄 수도 있고, 현재 날짜를 받아보거나 설정할 수도 있고,

프로그램에 수행 날짜를 찍히게 하거나, 걸리는 시간 등을 찍어볼 수도 있고, 파일 생성 날짜를 기준으로 list up할 수도 있고~

활용도가 매우 좋은 명령어예요

 

문법~!

date

시스템의 날짜 및 시간을 출력하거나 변경하는 명령어이다.

출력: date [option] [+FORMAT]

변경: date [option] [MMDDhhmm[[CC]YY][.ss]]

 

변경할 때 순서는 문법에 나와있는 형식을 지켜줘야 하는데

각 코드(?)가 의미하는 것은 다음과 같아요 ㅎㅎ

MM - 월 | DD -일 | hh- 시간 | mm - 분 |

그 다음 CCYY는 네 자리 년도를 말하고 YY만 올 경우, 두 자리를 말해요. .ss는 초입니다! 초단위까지 변경 가능하다는거~~

※ 현재 날짜 출력하기

$ date
Thu Jun 20 22:22:54 KST 2019

혹시라도 KST가 아니라 UTC가 떠서 현재 한국 시간과 맞지 않는 경우에는 타임존변경 포스팅을 참고해주세요~!

 

 날짜 변경하기 예시 , 날짜 적용이 안될 경우 해결 방법

$ date 0520210019

-> 현재시간을 2019년 05월 20일 오후 9시로 설정합니다.

앞에서 말했듯이 '월/일/시/분/년' 순서로 설정, 여기서는 년도가 두 자리가 들어갔으니 YY를 쳐준거~

당근 날짜 설정하는 건 중요한 설정이니 관리자 권한으로 실행해줘야 합니다 (root)

 

근데 실제로 수행하고 다시 date명령어를 쳐보면 수정한 날짜가 적용되지 않았습니다!! 분명 설정해줬는데 다시 원래 시간으로 돌아가버려요 ㅎㅎ

$ date 0520210019
Mon May 20 21:00:00 KST 2019
$ date
Thu Jun 20 23:00:00 KST 2019

이 이유는 시간이 동기화가 설정되어 있어서 그렇습니다 이거를 해제하면 됩니다.

$ timedatectl set-ntp 0 //또는
$ timedatectl set-ntp false

다시 원래 시간 동기화를 맞추고 싶으면 0을 1로 변경해주거나 false를 true로 변경해주면 됩니다!

해당 옵션을 해제한 후 date 명령어를 실컷 연습하고 동기화를 다시 true로 설정해서 혼돈을 막아줍시당 ㅎㅎ

 

옵션 OPTIONS

리눅스 GNU 기준입니다 (해당 옵션이 적용되지 않는 운영체제도 있으므로 실행되지 않을 경우, man 명령어로 확인해줍시다 ㅎㅎ)

옵션

내용

-s [STRING]

--set=[STRING]

시간만 설정할 때 사용합니다. 순서는 'hh:mm:ss' 또는 'hhmm'로 지정하면 됩니다.

-d [STRING]

--date=[STRING]

현재의 시간이나 날짜가 아닌 STRING 인자값에 해당하는 날짜를 출력해줍니다. 

-r[FILE]

--reference=[FILE]

파일 혹은 폴더를 참조하여 해당 파일이나 폴더의 수정 일시를 출력해줍니다.

--u

--utc

--universal

세계협정시각(UTC)로 출력합니다.

대표적 옵션 사용법

▶ -s 옵션 사용법 : 시간 설정

현재 시간을 오전 6시 40분 30초로 설정하기

date -s 06:40:30

▶-d 옵션 사용법 : ★원하는 날짜 시간표현!!

과거 표현법

date -d '1 second ago' #1초전 
date -d '2 seconds ago' #2초전 s붙여도 되고 안붙여도 됨 모두 동일
date -d '1 minute ago' # 1분전
date -d '1 hour ago' #1시간전
date -d 'yesterday' #어제
date -d '2 days ago' #2일 
date -d '1 week ago' #1주일전
date -d '1 month ago' #1달전
date -d '1 year ago' #1년전  
date -d '1 year 5 months ago' #1년 5개월 전
date -d 'last monday' #지난 월요일

미래 표현법

과거 표현법에서 ago를 제외하면 됩니다.

date -d '1 second' # 1초후
date -d '1 minute' #1분 후
date -d '1 hour' # 1시간후
date -d 'tomorrow' #내일
date -d '1 day' #내일
date -d '1 week' #1주일 후
date -d '1 month' #한달 후
date -d '1 year' #1년 후
date -d '1 year 5 month' #1년 5개월 후
date -d 'next monday' #다음 월요일
date -d 'this thursday' #이번주 목요일

같은 표현 다른 형식

date --date='3 month' #-d대신 --date옵션을 사용해도 됩니다
date -d '+3 days' # +와 -를 이용해도 됩니다. '-'는 과거 '+'는 미래

이와 같이 명령어를 쳤을 때 결과는 

$ date -d 'tomorrow'
Fri Jun 21 23:45:01 KST 2019

이렇게 나옵니다. 그런데 이렇게 말고 20190621 이런식으로 뽑고 싶을 수도 있잖아요?!

따로 원하는 형식을 지정해줄 수도 있습니다. 밑에서는 형식지정 방법에 대해서 알아봅시다.

 

포맷 FORMATS

포맷

설명

%%

%기호를 출력합니다.

%a

요일 이름 Sun... Sat 출력해줍니다.

%A

요일을 전체 단어로 출력합니다 Sunday ... Saturday

%b

월 이름 Jan ... Dec 출력해줍니다.

%B

월을 전체 단어로 출력해줍니다 January ... December

%y

년 표현의 뒤에서 두 자리 (00-99)

%Y

똑같이 년 표현인데 얘는 4자리 모두 출력합니다

%m

월을 숫자값으로 (01...12) 출력합니다.

%d

날짜만 보여줍니다 (01 .. 31)

%H

시간! 시간을 두 자리로 출력 (00 ... 23)

%M

분! 분을 마찬가지로 두 자리로 출력 (00 ... 59)

%S

초! 초를 마찬가지로 두 자리로 출력 (00 ... 59)

%s

1970-01-01 00:00:00 UTC로부터 경과된 초

%D

'%m/%d/%y' 형태로 날짜를 보여줍니다 (19/06/20)

%T

'%H:%M:%S'형태로 시간을 보여줍니다 (21:15:05)

%p

AM 또는 PM인지 출력

%r

'09:05:00 PM' 형태로 시간을 출력해줍니다.

%j

년을 기준으로 며칠이 지났는지 출력해줍니다.

%n

출력 시에 줄을 바꿔줍니다.

%z

타임존 값을 출력해줍니다.

%Z

시간 대역의 이름을 출력합니다. ex) KST

대표적 포맷 사용법

▶%Y %m %d %H %M %S 사용법

우리가 가장 많이 쓰게 될 '년도, 월, 일, 시, 분, 초'가 되네요 

# date '+%Y-%m-%d'
2019-06-20
# date --date='tomorrow' '+%Y-%m-%d' #옵션과 같이 응용
2019-06-21
# date '+%H:%M'
23:52 #시각:분

▶%a %A %b 사용법

요일과 달을 영어로 출력해줘요

# date '+%a'
Thu
# date '+%A'
Thursday
# date '+%b'
Jun
# date '+B'
June

▶%j 사용법

현재 연도에서 오늘이 며칠째인지 알 수 있습니다. 올해가 2019년도이고 현재가 2019.06.20이니.. 

2019.01.01일로부터 171일이 지났다고 하네요 ㅎㅎ

# date +%j
171

활용해보기

★ 셸 스크립트에서 날짜를 변수에 담기 

BACKUP_DATE=$(date -d '1 day ago')
echo $BACKUP_DATE #변수 출력

그런데 어떤 운영체제는 -d 옵션이 없기도 합니다 (대표적 예: AIX)

 

AIX 운영체제에서는 원하는 날짜로 지정하고 싶을 때 어떻게 하면 좋을지 알아봅시당

AIX 운영체제에서 현재 날짜가 아닌 기준으로 +,-한 날짜를 변수에 저장하고 싶을 때는 TZ(타임존) 값을 이용해서 저장할 수 있습니다.

TIME_CAL=`expr 24 - 9` 
YESTERDAY=`TZ=KST+$TIME_CAL; date '+%Y%m%d'
echo $YESTERDAY

한국의 표준 시간대가 KST-9이기 때문에 뒤에 -9를 해줬어요. (참고로 expr은 산술연산을 위한 명령어입니다)

하루면 24시간이니까 저렇게 식이 나왔지만, 만약에 하루가 아니라 3일 전 날짜를 구하고 싶다 그러면 뒤에 일자를 곱해주면 됩니다.

TIME_CAL=`expr 24 \* 3 - 9`

참고로 셸 스크립트 안에서 TZ변경해줬다고 실제 시스템 TZ가 변경되지는 않으니 걱정하지 마세요 ㅎㅎ

 

★ 파일명에 날짜 넣어보기

# touch $(date '+%Y%m%d')
# ls
20190620.txt 

★ find명령어랑 결합해서, 특정 날짜가 들어간 파일 추출하기

# find /home/jhnyang/log "*$(date -d '2 days ago' '+%Y%m%s')*.txt"

★ 두 날짜의 차이 즉 간격 구하기

%s 포맷을 이용해볼거예요. 기준점이 명확히 있기 때문이죠!

# date -d '20190620' '+%s'
1560956400

위 명령어를 보면 UTC기준으로 얼마만큼의 초가 흘렀는지 알 수 있어요

두 값의 차이를 통해서 두 날짜의 간격을 구할 수 있답니다! 셸 스크립트를 작성해볼게요

FIRST_DATE=`date -d "20190620" "+%s"`
SECOND_DATE=`date -d "20190120" "+%s"`
DAY_in_SECONDS=`expr 24 \* 3600` #1일을 초로 변환하면! -86400
INTERVAL=`echo "(${FIRST_DATE} - ${SECOND_DATE}) / $DAY_in_SECONDS" | bc`
echo $INTERVAL 

참고로 expr은 산술 연산을 위한 명령어입니다. bc 또한 복잡한 연산을 위해 사용되는 명령어예요 ㅎㅎ

요렇게 하면 사이 간극의 일수가 구해지겠죠?ㅎㅎ스크립트를 돌려보니 151일이 나오네요 ㅎㅎ

 

오늘 포스팅이 엄청 기네요 !! ㅠㅠ

이거 작성한다구 심혈을 기울였습니다 헤헤. 밤이 벌써 늦었네요~!!

광고보답, 댓글, 공감은 더욱더 질 좋은 포스팅을 작성하는데 힘이 됩니다!!

그러면 다음 포스팅에서 또 봐요 ♥