파일처리_08 특정 디렉터리에서 n일 전부터 m일 전까지 변경된 파일 목록 얻기(mtime 개념)

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: find
키워드: 어제, 그저께, 날짜, 타임스탬프, mtime
사용처: 특정 기간에 작성, 변경된 파일 목록을 만들고 싶을 때

실행 예제

# 현재 시각이 2013년 11월 26일 20:00
$ ./find-mtime.sh
/var/log/myapp/201311222346.log
/var/log/myapp/201311230446.log
/var/log/myapp/201311230946.log
/var/log/myapp/201311240046.log
/var/log/myapp/201311242046.log

스크립트

#!/bin/sh
 
logdir="/var/log/myapp"
 
# 4일 전부터 2일 전까지 갱신된 파일 목록을 표시
find $logdir -name "*.log" -mtime -4 -mtime +1 -print

   

해설

이 스크립트는 셸 변수 logdir로 지정한 디렉터리에서 4일 전에서 2일 전까지 갱신된 로그 파일(확장자가 .log 파일) 목록을 표시합니다. 여기서 디렉터리 /var/log/myapp에는 파일 변경날짜가 파일명에 사용된 파일이 많이 있다고 가정합니다. 파일 검색을 할 때 확장자 지정은 find 명령어의 -name에 “*.log”를 씁니다.

이 예제는 find 명령어에서 파일 변경일을 대상으로 하는 -mtime을 사용하는 것이 포인트입니다. 즉, 파일명에 있는 날짜가 아니라 파일의 타임스탬프로 파일을 검색합니다.

우선 예비 지식으로 find 명령어 -mtime에서 날짜를 세는 방법을 설명합니다. find 명령어 -mtime은 일수 n을 지정하는데 여기서 지정한 ‘n일 전’은 ‘n 곱하기 24시간 전’을 의미합니다. 예를 들어 현재 시각이 11월 25일 10시 30분이라면 ‘1일 전’은 11월 24일 10시 30분이 됩니다. 그보다 전(25시간 전)인 11월 24일 09시 30분은 그저께가 됩니다. n일이라고 지정하면 달력으로 n일 전이 아니므로 주의해야 합니다.

한편, find 명령어 -mtime은 일수를 지정하는데 +, - 부호에 따라 의미가 달라집니다. 마이너스를 붙인 -n은 ‘n일 전보다 새로운’, 부호 없는 n은 ‘n+1일 전부터 n일 전까지’, 플러스가 붙은 +n은 ‘n일보다 과거(n일에서 수시간 전인 파일은 끝자리 시간을 버려서 n일로 다루므로 실제적으로는 n+1일보다 앞)’라는 의미입니다. 여기서 n일 전이란 n x 24시간입니다. 예를 들어 n이 3이면 아래 표와 같습니다.

  • 날짜 지정 예
지정예 설명
find -mtime -3 3일(72시간)보다 새로움
find -mtime 3 4일(96시간) 전에서 3일(72시간) 전까지
find -mtime +3 4일(96시간) 전보다 과거

글로 보면 어려우므로 그림으로 봅시다.

  • 지정과 실제 시간


이렇듯 -mtime으로 지정한 일수와 플러스와 마이너스를 지정한 기간이 다르므로 주의해야 합니다. 예제에서는 -mtime에 플러스 지정과 마이너스 지정을 조합해서 ‘4일 전부터 2일 전 사이에 변경된 파일’을 추출합니다.

  • 여러 -mtime으로 기간 지정


   

주의사항

  • FreeBSD는 -mtime +n에서 끝자리를 올려서 계산하므로 리눅스와 조금 다릅니다. -mtime +3이면 ‘3일 전보다 과거’를 나타냅니다 여기서 설명한 것과 하루 차이가 나므로 주의하기 바랍니다.

  • -mtime -n 마이너스 지정은 ‘n일 이내’라는 의미로 사용하는데 별 문제는 없지만 정확하게는 ‘n일 보다 새로운’ 파일입니다. 즉, 현재보다 미래의 파일이 있다고 하면 대상에 포함됩니다. 미래 날짜의 파일은 touch 명령어 -t 옵션으로 작성할 수 있습니다.

  • Mac이나 FreeBSD의 find 명령어에서는 쓸 수 없지만 리눅스에는 -daystart라는 옵션이 있습니다. 이 옵션을 쓰면 날짜 지정을 현재 시각과 관계없이 ‘오늘 0시 0분부터’로 다룹니다.

  • -daystart 옵션 지정


  • -daystart 옵션을 쓰면 달력 날짜와 일치한 ‘어제’와 ‘n일 전’을 지정할 수 있어 쉽습니다. 하지만 Mac과 FreeBSD에서 쓸 수 없으므로 이식성이 떨어지는 걸 감수해야 합니다.