윈 도 우 배치파일 일정 기간 지난 폴더 삭제방법????
2021.12.06 17:39
파일을 백업 하는 배치파일을 만들어서 하루에 한번씩 백업을 할 수 있도록 하였습니다.
D:\data 폴더를
E:\Backup\BD_DATA_20211206_1 이라는 폴더를 만들어서 매일 백업이 되어지고.
BD_DATA_20211206_1 여기서 날짜는 계속 변화하며 뒤의 숫자는 하루에 두번을 클릭을 하였을 경우
하나씩 증가가 되어 백업이 이루어 질 수 있도록 해놓았습니다.
이번에 두번째 작업이며 처음에는 그냥 해보는것에 불가했고 이번에는 직접 작동이 되도록 사용하는것이라서
별 문제 없이 생각을 많이 해가면서 검색하면서 작성하였네요.
그런데 문제가 생겼습니다. 일일이 30일전의 폴더를 직접적으로 삭제를 한다는 이야기를 들어서
삭제는 직접하겠구나 생각을 하였는데 그것을 지우는것을 해주십사 하더군요 ㅠㅠ;;; ( 비전문가는 힘들어유 ㅠㅠ;; )
그래서 찾아보니 forfile 이라는것으로 해당 폴더를 만든 날짜를 비교해서 삭제를 한다는데 비교적 복사는 테스트가 쉬운데
이게 확실치 않아서 문의글로 적어봅니다.
현제 폴더는 만든날은 윈도우 날짜 기반으로 저장되어지는것 같더군요. 로그도 착착 저장이 되어지고 있고요..
E:\Backup\BD_DATA_20211201_1
E:\Backup\BD_DATA_20211202_1
E:\Backup\BD_DATA_20211202_2
E:\Backup\BD_DATA_20211203_1
E:\Backup\BD_DATA_20211204_1
이렇게 폴더 속에 저장되어진 백업폴더를 (안에 자료가 있더라도 ) 과거부터 30개만 남겨두고 지우고 싶은데
힌트라도 주십사 글을 작성해봅니다. ㅠㅠ;;
조금만이라도요~ 어려워요 ㅠㅠ;;
댓글 [16]
-
sadold 2021.12.06 18:10
-
ToFinder 2021.12.06 19:20
답변 감사합니다. 열심히 공부중입니다. ㅠㅠ;;
-
꼬져 2021.12.06 18:47 테스트.cmd <-- 테스트 해보세요
-
ToFinder 2021.12.06 19:21
안에 파일이 혹시 모를 복사할때 시간이 최신이면 안되더군요 감사합니다. ..
-
지후빠 2021.12.06 19:20
파일 이름에 나온 날짜를 기준으로 다음처럼 할 수 있을 것 같습니다. 테스트 먼저 해보시길 바랍니다.
1. 배치파일, 관리자 권한으로 실행해야 할 수도 있습니다. 테스트 후 echo rd 부분에서 echo를 지우시면 됩니다.
@echo off &cd /d "%~dp0" & setlocal enabledelayedexpansion
for /d %%a in (*) do (set ymd=%%a
call :DateDiff !ymd:~8,4!/!ymd:~12,2!/!ymd:~14,2! farfrom
if !farfrom! gtr 30 echo rd /q/s %%a
)
pause&exit
:DateDiff
for /f "skip=3 delims=" %%a in ('cscript datediff.vbs %~1') do set %~2=%%a
goto :eof
2. 같은 폴더에 datediff.vbs 도 만들어 두셔야 합니다.
If WScript.Arguments.Count = 0 Then WScript.Quit
CreateObject("Scripting.FileSystemObject").GetStandardStream(1).WriteLine DateDiff("d",WScript.Arguments.Item(0),Now)
-
ToFinder 2021.12.06 19:27
헉.. vbs까지 요건 내일 다시 테스트를 해봐야겠네요. 정말이지 프로그램으로 만들어서 판매하는걸 간단한기능이라
배치파일 및 스케쥴로 때울려고 생각하다 복병을 만나서 힘드네요. ㅎ. 감사합니다.
-
ToFinder 2021.12.06 19:51
많은 분들의 답변 감사합니다. 현제 이리저리 하다가 이코드가 가장 효과적인것 같아서 적용해볼까 합니다. 만.
문제가 같은날 2개의 폴더가 만들어진다면. 뭐 어쩔 수 없는거죠 뭐 ㅠㅠ;;;
forfiles /p "d:\test" /s /m * /d -4 /c "cmd /c rmdir /S /Q @path"
많은 곳에서 알려주는 코드 중에서 꼬져님도 알려주신것 중 요부분이 있는데 /S가 붙어버리니 하위폴더까지 확인을 하여
날짜를 확인해버리니 문제가 생겨서
forfiles /p "d:\test" /m * /d -4 /c "cmd /c rmdir /S /Q @path"
/s를 빼고 하니 현재 만들어진 폴더 기준으로 -4일 전의 폴더를 삭제를 하더군요 에휴.. 어쩔 수 없이 이렇게 해야할 듯 합니다.
도움을 주신 많은 분들 감사합니다.
-
슈머슈마 2021.12.06 23:17
잘배우고 갑니다. -
suk 2021.12.07 03:29
날짜 기준으로 보입니다만, 질문 마지막에는 30개 갯수를 말씀하셔서 참고로 올립니다
현재 기준으로 30개 갯수가 보존되기를 원하시면 윈도우 내장 명령 dir 과 for 구문으로 가능합니다
36개 폴더를 1초 간격으로 만들었습니다.
참고로 (지나가는 이야기) 한꺼번에 복사/붙여넣기로 폴더를 한순간에 만드니까, 삭제할 때 약간 폴더 시간 순서를 헷갈려하더군요
위와 같이 비교적 간단한 for 구문으로 최신 폴더 30개 남겨두고
그 전에 먼저 만들어진 폴더 6개 중에서는 최신 순으로 삭제가 되었습니다
위에 스샷에서 사용한 for 구문입니다.
다시 씁니다만, 날짜와 관계없이, 최신 폴더 30개 남겨두고 오래된 폴더를 삭제하는 구문입니다 [날짜는 수정한 날짜 기준입니다]
for /f "skip=30 tokens=*" %%a in ('dir /ad /b /o-d "E:\Backup\BD_DATA_*"') do rd /q /s "E:\Backup\%%a"
참고로, 위에 수정한 날짜 기준이 혹시 폴더가 수정된 경우는 정확성이 좀 떨어지기 때문에, 폴더 이름 순이 더 정확하겠네요
for /f "skip=30 tokens=*" %%a in ('dir /ad /b /o-n "E:\Backup\BD_DATA_*"') do rd /q /s "E:\Backup\%%a"
폴더가 어떤 순서로 나오는지만 확인했습니다
skip 숫자에 따라서 건너뛰게 됩니다
- 폴더삭제테스트-최신30개만보존하기.bat 2021-12-06_182206.jpg (246.5KB)(2)
- 폴더삭제테스트-최신30개만보존하기.bat 2021-12-06_182359.jpg (274.6KB)(3)
- 폴더삭제테스트-최신30개만보존하기.bat - 폴더 이름에 날짜가 있는 경우는 날짜 순보다는 이름 순이 더 정확하네요 2021-12-07_050747.jpg (199.1KB)(2)
- 폴더삭제테스트-최신30개만보존하기.bat - 폴더 이름에 날짜가 있는 경우는 날짜 순보다는 이름 순이 더 정확하네요 2021-12-07_052247.jpg (225.1KB)(2)
-
ToFinder 2021.12.07 19:16
우와. 감사합니다. 이것역시 테스트를 해봐야겠군요. 오늘 작성한것이 TXT 파일로 매일 백업되어지는 리스트를 저장을 하고.
해당 리스트의 내용이 20개면 20개 이상이된다면 확인 후 텍스트 파일 상부측 부터 차례대로 확인 후 폴더를 지우는 형식으로
이리저리 보면서 작성했네요. 엄청 복잡하지만. 그 부분의 내용을 댓글로 올리도록 할께요.
올려주신 내용도 적용해보고 간단한 코드로 갈 생각입니다. ㅠㅠ;; 지금 생각해보면 저보다 이 것이 더 효과적인것 같아요.
어차피 폴더 내용은 순차적으로 30개만 보유하면 되는것이기에.. 내일 다시 테스트 해보겠습니다.
감사합니다.
다시보니
for /f "skip=30 tokens=*" %%a in ('dir /ad /b /o-n "E:\Backup\BD_DATA_*"') do rd /q /s "E:\Backup\%%a"
구문이 가장 저에게 맞는것일 수도 있다고 보여지네요.. 지금 한달 마지막 폴더는 다른이름으로 저장해서 저장을 한다는 이야기에 맨붕이었지만
어찌어찌 고쳤는데 이걸로 그냥 해결 할 수 있어 보이네요 ㅠㅠ;; 그러면 마지막 폴더가 변경이 되어지더라도 하나 더 추가하고
나머지 30개 채우고 더 채우면 지울테니까요.. 내일 바로 테스트 해보겠습니다.
저의 무지막지한 지저분한 코드 역시 봐주시길 바래요 ㅎ.
-
suk 2021.12.07 19:50
이름 순으로 하시려면 한가지 주의사항이 있습니다. 폴더 이름의 연월일 자리수가 1년 내내 같아야 합니다
즉, 10월 이전도 09월 08월 식으로 0을 앞에 붙이셔야 이름 순으로 비교가 가능합니다. (몇일은 당연히 붙이실 듯 해서 생략합니다)
자리수가 적으면 오늘 만들어진 최신 폴더인데도 숫자가 적어서 오래된 폴더로 인식하여 우선적으로 삭제되는 불상사가 생길 수 있습니다
-> 그런데...지금 2022.1.1을 가정하여 자리수에 0을 빼고 폴더 만들어봤는데 적용이 되더군요. 뒤가 아니라 앞 자리수를 맞춰서 그런지?
윈도우의 숫자 개념은 아리송합니다. 암튼 자리수가 다르면 안심이 안 되기 때문에 자리수를 맞추시는 것이 안전하실 겁니다
테스트를 많이 하다보니까 폴더가 다 사라졌습니다
-
ToFinder 2021.12.07 20:01
네~ 이것이 가능하다고 생각하는것이 날짜를 20211207 형식으로 입력되어지고 같은 날이면 _1 _2 식으로 되도록 설정 되어져
있어서 가장 효과적일 것이라고 생각이 듭니다. ㅎㅎ.
감사합니다. 내일 엄청나게 테스트 예정입니다.
-
ToFinder 2021.12.07 19:58
이번에 새로 작성한 코드 입니다. 이곳저곳에서 보고 작성하였는데
이야기가 suk 님의 코드내용을 사용하기 좋은 내용이었습니다. 우선 이야기를 하자면 데이터 백업을 한 후 마지막 날의 폴더를 백업 폴더에서
이름을 변경하여 보관을 한다고 합니다. 그래서 날짜로 해버리면 큰 문제가 생겨버리는 일이 있더군요.
그래서 만든것이 TXT 파일을 하나 만들어서 매번 백업을 하면 주소를 리스트업을 해 놓고. 백업한 TXT 파일이 30라인이 넘어버리면
첫 라인을 읽어 지우고 해당 문구에 맞는 폴더를 삭제하는 방식으로 하였습니다. ㅠㅠ;;
::::::::: 일정 기간 지난 백업 폴더 삭제 :::::::::: :ReDelete for /F %%i in ('TYPE "%BACKUP_P%\backup_list.txt" ^| find /C /V ""') do set JUST_RATE=%%i if %JUST_RATE% lss %DELETE_RATE% GOTO EndDelete set /P DELETE_PATH=< %BACKUP_P%\backup_list.txt rmdir /S /Q %DELETE_PATH% echo %SD% : [%DELETE_PATH%] 오래된 백업 제거 완료>> %BACKUP_P%\complete.txt findstr /l /v /i /c:"%DELETE_PATH%" %BACKUP_P%\backup_list.txt> %BACKUP_P%\backup_list_old.txt timeout /t 1 > nul del "%BACKUP_P%\backup_list.txt" move %BACKUP_P%\backup_list_old.txt %BACKUP_P%\backup_list.txt GOTO ReDelete :EndDelete
지금 작성해서 테스트는 잘 되는편인데 더 테스트를 해봐야할 듯 하지만 순서대로 본다면.
처음 for 가 저장되어진 리스트를 확인을 한 후 변수 JUST_RATE에 넣어주고.
IF 로 정해놓은 수보다 적으면 GOTO 로 넘어가고. 아니면.
(여기에 goto 문으로 넘긴것이 ( ) 안에 넣어버리니 변수가 동작을 안하더군요 ㅠㅠ; 나만 그런가? 에휴)
set /p 로 첫 문장을 변수로 읽어와 해당 폴더를 지우고. TXT 파일에 저장한 후
findstr로 첫 문장 링크를 제외한 텍스트를 old파일로 저장하고
한박자 쉰 후
리스트 파일을 지우고 old 파일을 리스트 파일로 변환 ( 이 때 처음 한부부을 지운것이 저장되죠. )
이렇게 되어버리니 가령 d:\backup\backup_21001_1 경우.
d:\backup\backup_21001_1
d:\backup\backup_21001_10
d:\backup\backup_21001_11
d:\backup\backup_21001_12
이렇게 위와 같은 부분을 backup_list.txt 에서 다 삭제해 버리더군요 ㅠㅠ;;; 저럴 경우는 없고 날짜별로 될 것이기때문에 별 문제 없다고
생각되지만. 우선 기록차 댓글로 해당 내용을 작성해 둡니다.
아참 그리고 저기 for 문 안에 왜 TYPE가 들어가는지도 모르는 수준입니다.. ㅠㅠ;; 그냥 막 복사하고 되네 정도니.. 너그러이 바주십시오. 에휴..
-
suk 2021.12.07 21:26
뭔가 복잡하게 만드셨네요. 저도 잘 모르겠습니다;
참고로, 30개 백업 폴더를 유지하신다면 더 간단하게 해결될 수도 있을 듯 합니다
백업하실 때마다 오래된 폴더 1개를 삭제하시면 되지 않을까요?
그러면 백업 cmd 마지막에 삭제 구문을 추가하시면 될 듯 합니다. [cmd로 백업하시는지는 모르겠습니다만]
for 구문은 위에서 사용한 이름 역순입니다. 뒷부분만 약간 다릅니다
위와 같이 이름 역순으로 잘 정렬되었는지 확인부터 하시고, 삭제가 가능합니다
for /f "tokens=*" %%a in ('dir /ad /b /o-n "E:\Backup\BD_DATA_*"') do set folder=E:\Backup\%%a
@echo.
@echo. ///// 바로 위에 마지막 설정된 폴더를 삭제합니다 /////
@echo.
@pause
RD /Q /S "%folder%"
@echo.
@pause
@exit
-
ToFinder 2021.12.08 00:12
네.. 그래서 올려주신 부분을 확인해서 내일 테스트 해볼 예정입니다.
지금 작성해놓은것은 나중에 또 볼 여력이 있을까 해서 댓글로 기입해놓은것이고요.. 저번에도 이렇게 한것들을 댓글로 남겨둬서
모를때 와서 보면 기억이 나고 또 그것을 참고로 작업한 것들이 많아서 댓글로 소통을 하고 작성도 하고 있습니다. ㅎ
제가 작성했던것들은 어찌해야 답이 나오는지 몰라 겨우 머리 짜매서 이곳저곳 찾아서 한거라 엄청 어려웠던것이죠 ㅎㅎㅎ.
올려주신 30개 for문으로 작성을 할 듯 합니다. 감사합니다. ㅎ.
-
ToFinder 2021.12.08 09:21
::::::::: 일정 기간 지난 백업 폴더 삭제 ::::::::::
for /f "skip=%DELETE_RATE% tokens=*" %%a in ('dir /ad /b /o-n "%BACKUP_P%\%BACKUP_F%_*"') do (
rd /q /s "%BACKUP_P%\%%a"
echo %SD% : [%BACKUP_P%\%%a] 오래된 백업 제거 완료>> %BACKUP_P%\complete.txt
)
올려주신 부분으로 테스트를 해본결과 잘 작동되는것을 확인했습니다.
문제가 될 앞의 이름을 변경해야한다고 이야기를 하였고. 날짜는 테스트한다고 뒤에 4자리지만 많아봐야 1~2니...
별 문제없이 작동할 듯 합니다.
도움을 주신 SUK 님 외 모든분께 감사드립니다.
번호 | 제목 | 글쓴이 | 조회 | 등록일 |
---|---|---|---|---|
[공지] | 질문과 답변 게시판 이용간 유의사항 | gooddew | - | - |
91756 | 윈 도 우| 윈도우 pe 로 부팅하고나서 pe에서 화면 스크린샷 찍는방법... [1] | 찹쌀새 | 345 | 12-07 |
91755 | 하드웨어| usb 복구 프로그램 중에 괜찮은거 뭐 있을까요? [6] | ┓┓┣ | 542 | 12-07 |
91754 | 소프트웨어| 사운드 드라이버 인식안되는 증상인데 원인을 알 수 있을까요? [2] | koyotp | 432 | 12-07 |
91753 | 기 타| VHD 동적확장 용량 차이가 궁금합니다. [3] | 삼다수 | 317 | 12-07 |
91752 | 서버 / IT| 오지마을 인터넷 설치 불가로 무선 인터넷 설치 (?) [11] | Airbrone13 | 1766 | 12-06 |
91751 | 하드웨어| 보조배터리 용량이 괜찮을까요? [13] | brucex | 511 | 12-06 |
91750 | 하드웨어| CPU E2200 E5200 정상작동 E8500 비정상 CPU 고장증상 ㅠㅠ [15] | 컴114 | 605 | 12-06 |
91749 | 윈 도 우| 이동하드 드라이브가 잡히지 않습니다 [2] | 항상감사 | 318 | 12-06 |
» | 윈 도 우| 배치파일 일정 기간 지난 폴더 삭제방법???? [16] | ToFinder | 620 | 12-06 |
91747 | 모 바 일| 문의)) 2 IN 1 C타입 케이블 찾는데요........없네요......... [4] | chobits | 367 | 12-06 |
91746 | 소프트웨어| 가상머신(Virtual Box)에서 프린터 설치가능한가요? [3] | 현민지 | 332 | 12-06 |
91745 | 윈 도 우| 샌드박스가 비활성화 [1] | art | 340 | 12-06 |
91744 | 윈 도 우| 원도7 호환성질문 [2] | 명랑젓고난 | 270 | 12-06 |
91743 | 기 타| 오버워치 게임, 컴퓨터 사양 [3] | pinnk | 374 | 12-06 |
91742 | 서버 / IT| 실 운영중인 서버에서 배드섹터 검색 [4] | 펨토 | 350 | 12-06 |
91741 | 윈 도 우| 제어판에서 블루투스 아이콘이 안보입니다 | joe | 260 | 12-06 |
91740 | 윈 도 우| 이런거 가능할까요..? [1] | TielTaylor | 407 | 12-06 |
91739 | 윈 도 우| 라이젠 7 1700 윈도우11 설치해도 문제 없나요? [4] | 까치밥 | 1879 | 12-06 |
91738 | 기 타| 메모장 바꾸기 [6] | 달그림 | 691 | 12-05 |
91737 | 소프트웨어| 간단한 CMD 명령어 옵션 하나 문의 드립니다. [5] | reg | 367 | 12-05 |
forilfes /d 옵션을 써보세요