1. 사용 명령어 |
(1) test
(2) rm
2. 키워드 & 사용처 |
(1) 키워드
타임스탬프, 새로운/오래된
(2) 사용처
타임스탬프를 비교해서 어느 쪽이 오래되었는지 판단하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./olddel.sh
[log2.log]->newer, [log1.log]->older
4. 스크립트 |
#!/bin/sh
# 비교 대상 파일
log1="log1.log"
log2="log2.log"
# 인수 파일이 존재하는지 확인해서 존재하지 않으면 종료
filecheck() ①
{
if [ ! -e "$1" ]; then ②
echo "ERROR: File $1 does not exist." >&2
exit 1;
fi
}
filecheck "$log1" ③
filecheck "$log2" ③
# 두 파일을 비교해서 오래된 쪽 삭제
if [ "$log1" -nt "$log2" ]; then ④
echo "[$log1]->newer, [$log2]->older"
rm $log2
else
echo "[$log2]->newer, [$log1]->older"
rm $log1
fi
5. 해설 |
이 스크립트는 셸 변수 log1과 log2로 지정한 두 파일의 타임스탬프(modify time)를 비교해서 오래된 파일을 rm 명령어로 삭제합니다. ① 처럼 우선 타임스탬프를 비교할 파일이 존재하는지 확인하기 위해 filecheck라는 셸 변수를 준비합니다. 여기서 if문과 test 명령어의 -e로 파일 존재를 확인합니다.
②에서는 파일 존재를 -e로 확인할 때 !라는 부정 연산자를 써서 전체의 참거짓을 반대로 만듭니다. 즉, -e로 '파일이 존재한다면 참'이므로 이것을 부정하면 '파일이 존재하지 않을 때"를 처리할 수 있습니다. 여기서 파일이 존재하지 않으면 에러 메시지를 표시하고 exit 명령어로 스크립트를 종료합니다.
또한 ②에서 이용하는 $1이라는 변수를 위치 파라미터라고 부릅니다. 이때 셸 함수 내부에서는 함수 인수를 나타냅니다. ③에서 확인하고 싶은 로그 파일을 지정하는 셸 변수를 넘기고 있으므로 log1.log 같은 파일명이 대입됩니다.
파일 타임스탬프를 비교하는 곳이 ④에서 if문입니다. -nt는 newer then 약어로 다음과 같이 사용합니다.
if [ <리스트> 파일1 -nt <파일2> ]; then
즉, if문이 참이면 파일2가 오래되었고 거짓이라면 파일1이 오래되었습니다. 이 결과로 rm 명령어를 사용해서 오래된 파일을 삭제합니다.
<주의사항>
- 만약 두 파일의 타임스탬프가 같마면 -nt는 '더 새로운가'를 확인하므로 거짓을 돌려줍니다. 즉 이 예제에서는 log1이 오래되었다고 보고 삭제합니다.
- -ot(older then)라는 조건식도 있습니다. -nt의 반대로 더 오래된 파일이면 참을 돌려줍니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 파일처리 - 045 디렉터리에 있는 서브 디렉터리들의 디스크 사용량 조사하기 (0) | 2021.03.26 |
---|---|
[Linux 셸 스크립트] 파일처리 - 044 두 디렉터리를 비교해서 한 쪽에만 있는 파일 표시하기 (0) | 2021.03.26 |
[Linux 셸 스크립트] 파일처리 - 042 처리 시작 전에 실행 권한을 확인해서 정상 동작이 가능한지 확인 후 실행하기 (0) | 2021.03.25 |
[Linux 셸 스크립트] 파일처리 - 041 HTML 파일인 .htm과 .html 확장자를 txt로 일괄 변경하기 (0) | 2021.03.24 |
[Linux 셸 스크립트] 파일처리 - 040 파일 퍼미션과 타임 스탬프 등 원래 파일 속성을 유지한 채 파일 복사하기 (0) | 2021.03.24 |
댓글