서버같은걸 운영하다보면 로그파일이 쌓이게 되는데, 이게 별거 아닌거 같으면서도 은근히 용량을 잡아먹기 때문에 주기적으로 지워줘야 한다.
근데 내가 맨날 로그파일만 쳐다보고 있는것도 아니고, 다른 일 하다보면 까먹고 있다가 서버가 터지고 나서야 수습을 하는 불상사를 막기위해서 도스 명령어를 쬐끔 공부해서 로그파일을 자동으로 삭제할 수 있는 코드를 짰다.
1
2
3
4
5
6
7
8
9
10
setlocal
set CRITERIA=10
set DIRECTORY="C:\Users\USERNAME\Desktop\qwerty\"
echo [%DIRECTORY%] 경로의 파일중 생성된지 %CRITERIA%일 이상 경과된 파일과 폴더를 삭제합니다.
echo y | forfiles /p %DIRECTORY% /s /m * /d -%CRITERIA% /c "cmd /c rd @path /q /s"
echo y | forfiles /p %DIRECTORY% /s /m * /d -%CRITERIA% /c "cmd /c del @path"
::pause
CRITERIA는 기준 일수이다. 내가 기본값으로 10을 부여했으므로 “수정한 날짜”와 현재 시각이 10일 이상 차이나는 파일과 폴더를 대상으로 삭제 작업을 실행한다.
DIRECTORY는 말그대로 삭제할 폴더의 경로이다.
echo y | 를 붙이지 않고 forfiles 만 작성해도 삭제가 실행되는데, 파일 하나 하나 지울때마다 “~~파일을 삭제하시겠습니까? [y/n]”이 떠서 일일이 y를 누르고 엔터를 쳐야하는데 이러면 수동으로 작업하는것과 차이가 없다. echo y | 를 붙이면 알아서 다 y처리를 해서 파일만 실행시키면 알아서 다 지워준다.
forfiles는 경로 내에 파일을 탐색하는 명령어였던 거 같은데 사실 나도 잘 모르기도 하고 내가 설명하는 것보다 링크 따라가서 읽어보는게 더 나을 거 같다.
https://docs.microsoft.com/ko-kr/windows-server/administration/windows-commands/forfiles
위의 코드를 메모장에다가 붙여넣은다음에 파일 확장자를 .txt에서 .bat으로 고쳐주면 바로 실행하능하다.
단 이 코드를 실행시켜서 삭제한 파일은 휴지통에 들어가지 않고 바로 영구히 제거되기 때문에 복구가 어려우니 파일경로나 기준일수를 3번씩 확인한 후에 실행하는 것이 좋다.
이 bat파일을 실행시키고 나면 실행이 끝나고나서 바로 cmd창이 닫히는데, 만약 이 파일의 수행결과나 에러문구를 보고싶다면 ::pause에서 ::를 지우고 실행하면 파일 실행이 종료되어도 cmd창이 닫히지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
setlocal enabledelayedexpansion
set CRITERIA=10
set DIRECTORY[0]="C:\Users\USERNAME\Desktop\Bandizip\data"
set DIRECTORY[1]="C:\Users\USERNAME\Desktop\Bandizip\icons"
set DIRECTORY[2]="C:\Users\USERNAME\Desktop\Bandizip\langs"
set DIRECTORY[3]="C:\Users\USERNAME\Desktop\Bandizip\shellicons"
for %%a in (0,1,2,3) do (
echo y | forfiles /p !DIRECTORY[%%a]! /s /m * /d -%CRITERIA% /c "cmd /c rd @path /q /s"
echo y | forfiles /p !DIRECTORY[%%a]! /s /m * /d -%CRITERIA% /c "cmd /c del @path"
)
::pause
이 코드는 약 2주 전에 위의 코드를 개량해서 만든 코드다.
1번 코드는 하나의 폴더만을 지정해서 삭제를 처리할 수 있지만, 이 코드는 배열을 이용해서 한번에 여러개의 폴더를 지정할 수 있다.
도스에서 배열을 사용하려면 enabledelayedexpansion이라는 명령어를 써야한다 카더라.
일반적인 프로그래밍언어에서는 변수이름에는 알파벳이나 숫자만 사용할 수 있다.
근데 도스에서는 대괄호도 변수이름으로 사용할 수 있는 것 같다.
편의상 배열이라고 했는데 사실 변수 4개 선언하고 순차적인 인덱스를 부여한 것 뿐이다.
근데 이거를 배치파일로 만들어서 실행시키면 [디렉터리 이름이 올바르지 않습니다]라는 에러메세지가 와장창 나온다.
내가 알기로는 첫번째 forfiles가 폴더를 지우는 명령어이고, 두번째 forfiles가 파일을 지우는 명령어 였던걸로 기억하는데
아무래도 재귀적인 방법으로 디렉토리를 탐색하다가 탐색하는 경로와 삭제할 파일의 경로가 꼬여서 에러가 뜨는게 아닐까 생각한다.
일단은 이렇게 쓰고 추후에 개선해야겠다.
위의 두 개의 코드로 배치파일을 만들고 “작업 스케줄러”에다가 등록을 해놓으면 조건을 만족할때 자동으로 실행되게 할 수 있다.
컴퓨터를 켤때마다 라든지, 매일아침 10시에 실행되게 한다든지 등. 그렇게 해놓으면 알아서 로그파일을 삭제해주기 때문에 로그파일 때문에 서버가 터질 걱정은 안해도 된다.
위에서 설명한 것 이외에 위의 코드를 수정해야 하거나 문제가 발생한다면 아래 내용을 참고.
- ’=’연산자 앞이나 뒤에 공백이 들어가면 공백도 변수나 데이터의 일부로 인식하기 때문에 공백 없이 작성해야 한다.
ex) CRITERIA=10 (o) CRITERIA = 10 (x) - 파일 삭제 도중에 접근관한 문제로 인하여 파일 제거에 문제가 생기면 파일삭제가 즉시 종료되어 나머지 파일이 삭제되지 않는다.
- 파일 경로 또는 파일명에 . ! % 등의 특수문자가 포함될 경우 정상적으로 삭제되지 않을 수 있다.
- 경로를 입력할 때는 ““사이에 입력해야 합니다. ““사이에 경로를 입력하지 않으면 폴더명이 “ “(공백)을 포함한 경우를 인식할 수 없다.
ex) DIRECTORY=”C:\Users\USERNAME\Desktop\youtube - 복사본”