윈도우에서.. 특정 일자가 지난 파일을 삭제하고 싶거나..
복잡한 디렉토리내의 파일 이름을 알고싶을때..
기타.. 유닉스의 find 명령과 비슷한 기능이 필요할때..
아주 똑같지는 않아도, 나름 편리한 기능을 제공해주는 명령어 입니다.
Windows 2003 이상 (2003, Vista, 7, 2008) 에서 사용가능한 명령어 입니다.
2000 및 XP 에서는 프로그램을 다운로드 받아 설치(?) 해야만 사용 가능합니다.
흡사, 유닉스의 find 명령과 비슷해서
스크립트나 프로그램을 만들어서 작업을 하는것 보다 훨씬 간단하게 작업을 할 수가 있습니다.
일단 간단한 예를 보면서 설명을 드리겠습니다.
forfiles /P D:Backuplog /S /M *.log /D -10 /C "cmd /c del @file"
대충 눈치빠른분들은 아시겠죠??
D:Backuplog 내의 확장자가 log 인 파일중에
10일이 지난 파일을 삭제하라!!
좀 더 자세하게 살펴보겠습니다.
/P : 시작할 경로
/S : 서브디렉토리까지 포함해서 검색
/M : 찾을 파일 조건 (* 이 기본조건)
/D : 해당하는 일자를 지정
/C : 실행할 명령어를 지정
옵션만 보셔도 다 아실겁니다..^^
그럼 이제 HELP 를 한번 보겠습니다.
FORFILES [/P pathname] [/M searchmask] [/S] [/C command] [/D [[+ | -] {yyyy-MM-dd | dd}]
설명:
파일(또는 파일 집합)을 선택하고 파일에 명령을 실행합니다. 일괄 작업에 유용합니다.
매개 변수 목록:
/P pathname 검색을 시작할 경로를 지정합니다.
현재 작업 디렉터리(.)가 기본 폴더입니다.
/M searchmask 검색 마스크에 따라 파일을 검색합니다.
'*'이 기본 검색 마스크입니다.
/S 하위 폴더를 포함하도록 지정합니다. 예, "DIR /S"
/C command 각 파일에 실행할 명령을 지정합니다.
명령 문자열을 큰따옴표로 묶어야 합니다.
"cmd /c echo @file"이 기본 명령입니다.
명령 문자열에 다음 변수를 사용할 수 있습니다.
@file - 파일 이름을 반환합니다.
@fname - 확장명 없이 파일 이름을 반환합니다.
@ext - 파일의 확장명만 반환합니다.
@path - 파일의 전체 경로를 반환합니다.
@relpath - 파일의 상대 경로를 반환합니다.
@isdir - 파일 형식이 디렉터리인 경우 "TRUE"를 반환하고 파일인 경우 "FALSE"를 반환합니다.
@fsize - 파일의 크기(바이트)를 반환합니다.
@fdate - 파일을 마지막으로 수정한 날짜를 반환합니다.
@ftime - 파일을 마지막으로 수정한 시간을 반환합니다.
명령줄에 특수 문자를 포함하려면 0xHH 형식의 16진수 코드(예, 탭은 0x09)를
사용하십시오. 내부 CMD.exe 명령 앞에는 "cmd /c"를 사용해야 합니다.
/D date 지정한 날짜와 마지막 수정한 날짜가 늦거나 같은(+) 또는 빠르거나 같은(-) 파일을 찾습니다.
날짜 형식은 "yyyy-MM-dd"입니다.
또한 마지막 수정한 날짜가 현재 날짜에 "dd"일을 더한 날짜보다 늦거나 같은(+)
또는 현재 날짜에서 "dd"일을 뺀 날짜보다 작거나 같은(-) 파일을 찾습니다.
유효한 "dd" 범위는 0에서 32768까지입니다.
부호를 지정하지 않으면 "+"가 기본값입니다.
/? 도움말을 표시합니다.
예:
FORFILES /?
FORFILES
FORFILES /P C:WINDOWS /S /M DNS*.*
FORFILES /S /M *.txt /C "cmd /c type @file | more"
FORFILES /P C: /S /M *.bat
FORFILES /D -30 /M *.exe
/C "cmd /c echo @path 0x09 was changed 30 days ago"
FORFILES /D 2001-01-01
/C "cmd /c echo @fname is new since Jan 1st 2001"
FORFILES /D +2009-1-8 /C "cmd /c echo @fname is new "today"
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
예약된 작업에 아래와 같이 명령어를 등록해두면 해당 날짜에 자동으로 실행됩니다.
D:Backuplog 디렉토리내의 15일이 지난 모든 .log 파일을 삭제하세요!!
C:Windowssystem32forfiles.exe /P D:Backuplog /M *.log /D -15 /S /C "cmd /c del @file"
삭제하는건 이제 지겹다구요??
그럼.. 이번엔.. 출력하는걸 한번 해보겠습니다..
D:Backuplog 에 한달 전에 생성된 파일의 절대 경로를 보여주세요!!
forfiles /P "D:Backuplog" /S /M *.* /D -30 /C "cmd /c @echo @path"
참.. 쉽죠잉~~
저는 위 명령어를 통해
복잡한 디렉토리 내의 압축파일 (.SAR, .CAR) 파일의 압축을 해제할때 사용합니다.
forfiles /S /C "cmd /c @echo @path" > list.txt
위 명령어를 실행한 후
list.txt 파일을 울트라 에디트나 vi 로 열어서 세로줄 편집을 하면, 1분만에 스크립트를 만들수 있습니다..^^
훨씬 더 많은 기능이 있는 명령어 입니다.
한번씩 해보시면 쉽게 필요한곳에 적용이 가능하실거라 믿습니다..^^
한번 해보시면 그 편리함을 확실히 느끼실겁니다..
노가다 하지마시고..
한방에 해결하세요~~
아차..
중요한 이슈사항이 있는데요..
위에 첨부한 forfiles 는 2000 에서 추출된 forfiles 입니다.
2000 용 forfiles 를 설치 하신다면..
옵션에 사용하는 슬래시 "/" 대신 마이너스 "-" 로 옵션을 주셔야 합니다.
그리고 옵션과 명령어를 붙여서 써야 합니다.
그 외에.. 약간씩 옵션이 차이가 있으니 꼭 확인하시고 사용하시기 바랍니다..
2000
forfiles -pC:\test -s -m*.log -d-3 -c"cmd /c echo @path"
2003 이상
forfiles /P C:\test /S /M *.log /D -3 /C "cmd /c @echo @path"
헷갈리시면 않됩니다..^^;;;
MS TechNet
http://technet.microsoft.com/ko-kr/library/cc755872(WS.10).aspx