2013년 12월 18일 수요일

bash shell로 파일 삭제 cronjob

find mdate 를 이용하여 백업 파일 삭제하는 cronjob 을 걸어 두었는데, find mdate 의 결과가 장비마다 이상하게 나오는 원인 파악 불명인 이상한 현상이 보여서, 그냥 ls, awk 를 이용해서 만들었다. find mdate 의 결과가 왜 이상하게 나오는지 정말 궁금하다???

#!/bin/bash


# _yyyymmddhhMM.tar.gz 형식의 파일을 run time 기준으로 삭제 한다.
# 원래는 find -mdate 로 만들었으나, find -mdate 의 결과가 ls -al 로 테스트 했을때
# 장비별로 다르게 나오는 파악하기 힘든 원인으로 인해 ls, awk 를 이용하여 삭제 하는 것을 만들었음
#
# 추후 _yyyymmddhhMM.tar.gz 파일 형식이면 SRC_DIR 만 수정하여 그대로 사용하면 된다.
# (실제로는 "_yyyymmddhhMM." 까지만 형식이 같으면 사용 가능하다.)


# find mtime 으로 검색이 원하는데로 돌지 않아서, 파일명 매핑으로 변경 한다.
#DAY_AGO=7
#/usr/bin/find /data/backup/fsp/src -mtime +$DAY_AGO -exec rm -rf  {} \;


# 파일을 삭제할 디렉토리 지정
SRC_DIR=/data/backup/fsp/src1

# SRC_DIR 이 존재하는 디렉토리 인지 체크 한다.
if [ ! -d ${SRC_DIR} ]; then
 # cronjob 에서 /dev/null 2>&1 로 redirect 할 것이기 때문에 echo 는 넣어둔다.
 echo "${SRC_DIR} not exist target directory. terminate shell."
 exit
fi

# 파일 삭제할 기준을 설정(파일 이름에서 날짜가 스크립트 run 타임 기준으로 7일 이전)
AGO_DAY=`date +%Y%m%d%H%M -d '7 day ago'`

# ls를 이용하여 파일명을 가져온다.
FILE_LIST=`ls ${SRC_DIR}`

# 파일명으로 돌면서 조건 판단한다.
for fname_full in ${FILE_LIST}; do
 # 파일명의 포맷이 aaa_yyyymmddhhMM.tar.gz 로 되어 있기 때문에 "." 으로 분리된 제일 처음을 가져온다
 fname=`echo $fname_full | /bin/awk -F"." '{print $1}'`
 # 가져온 제일 처음 값에서 "_" 으로 분리된 날짜값을 가져온다.
 cdate=`echo $fname | /bin/awk -F"_" '{print $2}'`
 
 # 가져온 날짜값이 존재하는지 체크 한다.
 if [ "X"${cdate} != "X" ]; then
  # 가져온 날짜 값이 기준 시간 이전이면
  if [ $cdate -le $AGO_DAY ]; then
   # 삭제 한다. cronjob 에서 /dev/null 2>&1 로 redirect 할 것이기 때문에 echo 는 넣어둔다.
   echo "/bin/rm -rf ${SRC_DIR}/${fname_full}"
   /bin/rm -rf ${SRC_DIR}/${fname_full}
  fi
 fi
done

댓글 없음:

댓글 쓰기