1. 사용 명령어 |
(1) date
(2) cp
2. 키워드 & 사용처 |
(1) 키워드
백업, 현재 시각, 날짜
(2) 사용처
어떤 파일을 백업할 때 현재 날짜를 넣어서 간단히 복사해두고 싶을 때 사용합니다.
3. 실행 예제 |
$ ls 파일 확인
datename.sh myapp.conf
$ ./datename.sh 스크립트 실행
myapp.conf -> myapp.conf.20210318
$ ./datename.sh 스크립트 실행
myapp.conf -> myapp.conf.202103182210.20
$ ls 파일 확인
datename.sh myaapp.conf myapp.conf.20210318 myapp.conf.202103182210.20
4. 스크립트 |
#!/bin/sh
config="myapp.conf"
bak_filename="${config}.$(date '+%y%m%d')" ①
# 이미 myapp.conf.20210318 파일 등이 있으면 초까지 넣어서 백업 파일 작성
if [ -e $bak_filename ]; then ②
bak_filename="${config}.$(date '+%Y%m%d%H%M.%S')" ②
fi ②
cp -v "$config" "$bak_filename" ③
5. 해설 |
이 스크립트는 현재 디렉터리에 있는 myapp.conf라는 설정 파일을 백업합니다. 실행하면 현재 날짜를 이용해서 파일명을 조합해 myapp.conf.20210318, 즉 "원래 파일명 + 날짜" 형식으로 복사본을 작성합니다.
같은 날에 여러 번 스크립트를 실행하면 백업 파일을 덮어쓰지 않도록 시분초까지 포함해서 myapp.conf.202103182210.20 라는 파일명으로 백업을 만듭니다.
이 스크립트에서는 현재 시각을 취득하기 위해 date 명령어를 사용합니다. date 명령어는 인수가 +로 시작할 때는 현재 시각(날짜)을 지정한 형식으로 표시합니다. 시각 표시 형식은 인수에 필드명을 써서 제어할 수 있으므로 년월일이나 시분초를 자유롭게 조합해서 문자열을 만들 수 있습니다.
date 명령어에서 자주 사용하는 필드명은 아래와 같습니다. 이런 필드는 라이브러리 함수 strftime으로 정의되어 있으므로 man strftime을 참조하기 바랍니다.
필드명 | 설명 |
%Y | 년(1970~) |
%y | 년도 아래 두 글자(00~99) |
%m | 월(01~12) |
%d | 일(01~31) |
%H | 시(00~23) |
%M | 분(00~59) |
%S | 초(00~59) |
①에서는 $()라는 명령어 치환을 써서 파일명을 조합합니다. 이때 date 명령어 표시 형식으로 %Y%m%d, 즉 YYYYMMDD(년월일)를 사용합니다. 오늘이 2021년 03월 18일이라면 20210318이 됩니다. 다라서 현재 날짜를 뒤에 붙여서 백업 파일명을 조합할 수 있습니다.
이대로라면 같은 날에 두 번 이상 스크립트를 실행하면 앞서 만든 파일을 덮어쓰게 되므로 ②에서 덮어쓰기 확인 처리를 합니다. 만약 현재 날짜가 끝에 딸린 파일이이미 존재하면 덮어쓰지 않도록 시분초까지 포함한 파일명으로 복사합니다. 시분초를 지정하려면 필드로 %H%M%S를 사용합니다. 여기서 보기 편하도록 초 앞에 점을 찍습니다. 따라서 2021년 03월 18일 22시 10분 20초에 스크립트를 실행하면 myapp.conf.202103182210.20 이라는 파일명이 조합됩니다.
③에서 백업을 위해 파일을 복사하는데 cp 명령어에 -v 옵션(verbose)을 사용해서 어떤 파일을 어떤 파일명으로 복사하는지 표시합니다. 파일을 조작하는 셸 스크립트에서는 화면으로 봐서(또는 로그 파일을 봐서) 확인 가능하도록 이런 -v 옵션을 지정하는 것이 좋습니다.
<주의사항>
- 이 스크립트에서는 초까지 파일명에 사용하므로 1초 이내 두 번 이상 실행되면 파일을 덮어쓰게 됩니다. 파일명 뒤에 1, 2, 3, ... 식으로 연변을 붙이는 방법도 있지만 이 방법은 언제 변경되었는지 한번에 알아보기 어렵고, 게다가 설정 파일 백업용이라서 1초 이내 갱신될 일도 없으므로 이 예제에서는 이미 파일이 존재하면 시분초를 붙이는 방법을 사용합니다.
- 날짜로 백업 파일을 만드는 것은 간단해서 자주 쓰이는 방법이지만 임기응변이기도 합니다. 제대로 하려면 Git이나 서브버전(Subversion) 같은 버전 관리 시스템으로 관리를 하는 것이 옳습니다.
- 서브 버전은 svn 명령어, Git은 git 명령어를 사용합니다. 예를 들어 다음은 서브 버전으로 버전 관리를 하는 파일 이력입니다. 언제 누가 어떤 편집을 했는지 한 눈에 보이고, 과거 버전으로 간단히 되돌릴 수 있습니다.
$ svn log myapp.conf
-----------------------------------------------------------------
r100 | park | 2021-03-17 18:12:31 +0900 (Wed, 17 2021) | 2 lines
server1에서 고장 발생, 접속 IP 주소를 sserver3으로 변경
-----------------------------------------------------------------
r99 | kim | 2021-03-15 13:51:24 +0900 (Mon, 15 2021) | 2 lines
로그 출력 디렉터리를 /var/log/myapp에서 /var/log/newapp로 변경
-----------------------------------------------------------------
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 파일처리 - 035 로컬 디렉터리에 파일을 만들지 않고 직접 원격 호스트에 아카이브하기 (0) | 2021.03.24 |
---|---|
[Linux 셸 스크립트] 파일처리 - 034 파일들을 다른 디렉터리에 동기화해서 백업처리하기 (0) | 2021.03.18 |
[Linux 셸 스크립트] 파일처리 - 032 로그 파일이 엄청 많은 디렉터리에서 파일들에 명령어를 일괄 실행하기 (0) | 2021.03.18 |
[Linux 셸 스크립트] 파일처리 - 031 작업 파일 디렉터리에서 1년 이상 갱신되지 않은 파일 삭제하기 (0) | 2021.03.18 |
[Linux 셸 스크립트] 파일처리 - 030 특정 디렉터리에서 n일 전부터 m일 전까지 변경된 파일 목록 얻기 (0) | 2021.03.18 |
댓글