본문 바로가기
Infra/Linux

find exec 사용시 주의사항

by Tomining 2015. 3. 31.

Linux 장비에서 주기적으로 로그파일을 삭제할 때


find exec 명령어를 통해 원하는 파일을 삭제하는 방식을 많이 사용하는데, 보통 아래처럼 crontab에 등록해 둔다.


00 0 * * * find /usr/local/logs mtime +7 -exec rm -rf {} \;


이 의미는 /usr/local/logs 디렉토리에 수정시간(mtime) 이 7일 이상된 파일을 삭제(rm -rf) 해 달라는 의미이다.

참고로 rm -rf 의 경우는 파일이든 디렉토리이든 모두 삭제한다.


이렇게 crontab을 등록하니 문제가 발생했다.

/usr/local/logs 디렉토리까지 지워진 것이다.


이를 방지하기 위해서는 4가지 방법이 있다.


1. mindepth 옵션 추가

00 0 * * * find /usr/local/logs -mindepth 1 mtime +7 -exec rm -rf {} \;


/usr/local/logs 하위 디렉토리까지 모두 삭제되어야 한다면 위 처럼 mindepth 옵션을 주면 되며, maxdepth 로 일부 제한할 수도 있다.


2. rm -f 로 변경


00 0 * * * find /usr/local/logs mtime +7 -exec rm -f {} \;


rm -f 로 변경함으로써 /usr/local/logs 하위에 파일만 삭제하도록 변경하면 됩니다.


3. ! -name logs 옵션 추가


00 0 * * * find /usr/local/logs mtime +7 \! -name logs -exec rm -rf {} \;


find 대상에서 디렉토리 명을 이름으로 제외처리 하는 것이다.


4. ! -type d 옵션 추가


00 0 * * * find /usr/local/logs mtime +7 \! -type d -exec rm -rf {} \;


find 대상에서 디렉토리 타입인 경우를 제외처리 하는 것이다.


4가지 방법은 차이는 있지만 최상위 디렉토리가 삭제되는 것을 막아준다.

위 방법 중 적절히 원하는 방법을 사용하면 될 것이다.


이 외에도 우회하는 방법은 많이 있으니, 구글링이나 Linux 책을 찾아보도록 하자.

'Infra > Linux' 카테고리의 다른 글

비밀번호 없이 SSH를 통해 장비 접속하기  (0) 2016.01.08
Linux 파일 구조  (0) 2015.12.31
Find 명령어  (0) 2015.03.16
rsync 설정하기  (0) 2015.03.06
crontab 사용법  (0) 2015.03.06