일정 기간 경과한 파일을 자동으로 삭제하는 cmd 커맨드 forfiles로 윈도우 파일관리
윈도우 운영체제의 cmd 셸 커맨드 중에 forfiles 커맨드를 사용하면 특정 조건에 맞는 파일(들)을 일괄 처리하는 자동 처리를 편하게 할 수 있습니다.
윈도우 서버 관리를 할 때, 한 달 이상 경과한 백업 파일, 90일 이상 경과한 웹 서버 로그 파일, 1년 이상 경과한 방화벽 로그 파일 등을 선택적으로 자동 삭제 처리를 해서 서버의 디스크 상태를 일정하게 유지할 수 있으면 서버 관리에 신경을 덜 써도 되는 좋은 점이 있습니다.
또는 내 윈도우 PC의 일정 기간이 경과한 파일들을 주기적으로 지워서 불필요한 파일들을 일일이 정리하는 수고를 줄일 수 있습니다.
먼저 완성된 forfiles 커맨드를 하나 예를 들겠습니다.
forfiles /p "Z:\RemoteBackup\DB_Backup" /s /m *.* /d -30 /c "cmd /c del @PATH"
간단한 한 줄짜리 커맨드지만 설명을 하면 다음과 같습니다.
Z:\RemoteBackup\DB_Backup 폴더 안의 하위 폴더 안의 파일을 포함한(/s) 모든 파일(/m *.*) 중에서 30일 이상 경과한(/d -30) 파일 각각에 대해 다음 커맨드를 실행(/c "cmd /c del @PATH") 합니다.
/c 옵션으로 실행하는 쌍따옴표 안의 커맨드에서 @PATH 경로 변수의 값은 forfiles 커맨드로 선택되는 파일 목록의 개별 파일 경로와 파일 이름을 가리킵니다.
즉, @PATH로 가리키는 각각의 파일을 del 커맨드로 삭제합니다.
옵션 값이 많아서 다소 복잡해 보이지만, 실제로는 그냥 복사해서 사용하면 되고, /d -30의 옵션 값만 중요합니다. -30은 30일이 경과한 파일이 됩니다.
특정 확장자의 파일만 삭제 대상에 포함하고 싶으면 마스킹 필터 옵션의 /m *.* 을 변경하면 됩니다. jpg 이미지 파일만 삭제 대상에 포함하고 싶으면 /m *.jpg로 변경하면 됩니다.
하위 폴더는 포함할 필요가 없거나 하위 폴더가 없으면 /s 옵션은 삭제하면 됩니다.
forfiles 커맨드 옵션들
각각의 옵션이 하는 역할을 요약하면 다음과 같습니다.
- /p: "Pathname" forfiles 커맨드로 파일 목록을 만들 경로
- /s: "Subfolder" 하위 폴더를 파일 선택 범위에 포함하는 옵션
- /m: "searchMask" 선택하는 대상 파일의 "이름" 필터링 옵션. 기본 값은 *
- /d: "date" 파일의 날짜 필터링 범위 옵션. 가장 단순한 표현은 현재 시간을 기준으로 일정 날짜 이상 경과한 날짜를 음수로 표현하는 것입니다. -30으로 경과한 날짜만 표시하면 30일 이상 경과(-)한 파일만 선택합니다. 30으로 표시하면 30일 이내의 파일이 선택됩니다. +(이후)/-(이전)부호를 사용할 때 주의해야 합니다.
날짜 포맷으로 표시해서 필터링 할 기준 날짜 이전 파일만 선택할 수도 있습니다.를 표시 날짜 포맷은 "yyyy-MM-dd"로 표현(ex: 2024-01-01)합니다. 마찬가지로 +/-부호를 사용해서 기준날짜 이후/이전 구분을 합니다. 경과할 날짜로 표현할 때 표현 가능한 날짜 값은 0~32768입니다.
-2024-01-01 은 2024년 1월 1일 이전 파일들을 선택합니다. - /c: "command" 필터링해서 선택한 파일 목록의 개별 파일마다 실행할 커맨드를 쌍따옴표로 감싸서 작성
사용할 수 있는 변수들
forfiles 커맨드로 선택한 파일들에 -c 옵션을 사용해서 실행할 수 있는 커맨드에 전달하는 값들은 @를 사용해서 변수처럼 접근할 수 있습니다.
실행 커맨드에 사용할 수 있는 변수는 다음과 같습니다.
- @file: 파일 이름 반환(파일명.확장자)
- @fname: 확장자 없는 파일 이름만 반환
- @ext: 파일 확장자 반환
- @path: 파일의 전체 경로 반환(파일 이름 포함)
- @relpath: 파일의 상대 경로 반환(파일 이름 포함)
- @isdir: 디렉토리면 "TRUE", 아니면(파일) "FALSE 반환
- @fsize: 파일 크기
- @fdate: 파일을 마지막 수정한 날짜
- @ftime: 파일을 마지막 수정한 시간
@file, @path, @isdir, @size 정도를 주로 사용합니다.
현재 디렉토리와 하위 디렉토리의 2024년 1월 1일 이전 생성한 jpg 이미지 파일만 파일의 절대 경로를 화면에 출력해보고 싶으면 다음과 같이 작성합니다.
forfiles /s /m *.jpg -d -2024-01-01 /c "cmd /c echo @path"
필터링 조건으로 선택한 파일이 맞는지 출력해서 확인하려면 실행 커맨드를 "cmd /c echo @path"로 cmd창에 출력해서 확인할 수 있습니다. echo는 cmd 콘솔에 @path변수의 값을 표시합니다.
내부 명령어로 cmd 명령어를 실행하려면 cmd에 추가로 /c 옵션을 붙여야 합니다.
파일을 확인했으면 조건에 맞는 파일 목록에 대해서 cmd 커맨드를 적용하면 됩니다. echo 대신 del 커맨드를 적용하면 조건에 맞는 파일들이 모두 삭제됩니다.
스케줄러로 반복 실행하기
cmd 커맨드 행은 텍스트 파일로 확장자를 .cmd로 해서 저장하면 배치 파일로 실행할 수 있습니다.
윈도우 작업 스케줄러에 저장한 cmd 파일을 등록해서 주기적으로 실행하도록 설정하면 주기적으로 불필요한 파일들을 삭제해서 디스크 공간을 쾌적하게 유지할 수 있습니다.