Показать полную графическую версию : [решено] Удаление файлов кроме сегодняшнего
Здравствуйте,
У меня возникла задачка: в папке имеются логи за несколько лет. Каждый день программа создает новый файл. Все бы ничего, если бы не возникла потребность удалять файлы по причине отсутсвия места на диске. Можно конечно было вручную снести все файлы, но хочется автоматизировать данный процесс. Так вот, как сделать так, чтобы в одной конкретной папке удалялись файлы старше 1-х суток. Программа каждые сутки создает файл типа: ftp20130301.log, вчера ftp20130228.log и так далее.....
Заранее спасибо
Kenwood, ориентируемся на дату/время последней модификации самого файла или же на дату в его имени?
megaloman
01-03-2013, 23:07
ИМХО, имеет смысл хранить заданное кол-во логов, например, 2, а остальные удалять, и не задумываться о датах. Главное, чтобы логи бесконечно не накапливались, а батник в назначенном задании это периодически отслеживал. Так как программа каждые сутки создает файл типа: ftpГГГГММДД.log и если ориентируемся на дату/время последней модификации самого файла, то @Echo Off
Set Where=D:\Tmp
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "%Where%\ftp*.log" /B /A:-D /O:-D /T:W 2^>nul`) DO Echo Del "%Where%\%%f"
Если ориентируемся на имена (в идеале, если злодейскими ручками никто логи не правит, результат будет один) For будет иметь вид FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "%Where%\ftp*.log" /B /A:-D /O:-N 2^>nul`) DO Echo Del "%Where%\%%f" Если батник в папке с логами, то @Echo Off
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "ftp*.log" /B /A:-D /O:-D /T:W 2^>nul`) DO Echo Del "%%f"
или соответственно
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "ftp*.log" /B /A:-D /O:-N 2^>nul`) DO Echo Del "%%f"
Чуть не забыл, чтобы батник реально удалял файлы, уберите слово Echo (я его вставил для отладки) в For перед командой Del
По идее, можно совсем обойтись без батника, используя CMD и For в назначенном задании, например:cmd /Q /C FOR /F "usebackq skip=2 delims=" %f IN (`DIR "D:\Tmp\ftp*.log" /B /A:-D /O:-N`) DO Del "D:\Tmp\%f" >nul
Надо ориентироваться только на дату в его имени
Kenwood, тогда можно так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sDrive=%~d0
set sPath=%~p0
for /f "delims=." %%i in ('wmic.exe OS get LocalDateTime ^| find "."') do set sDateTime=%%i
1>nul wmic.exe DataFile where "Drive='%sDrive%' AND Path='%sPath:\=\\%' AND FileName<>'ftp%sDateTime:~0,8%' AND Extension ='log'" call Delete
endlocal
exit /b 0
В папке скрипта будут удалены все файлы *.log, за исключением попадающих под маску ftpYYYYMMDD.log текущего дня. Прочие файлы (не *.log) затронуты не будут.
спасибо ограмное, все сработало!!! Так как надо было.
Спасибо всем за помощь, особенно Iska
Freddy1984
06-02-2016, 10:36
@Echo Off
Set Where=D:\Tmp
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "%Where%\ftp*.log" /B /A:-D /O:-D /T:W 2^>nul`) DO Echo Del "%Where%\%%f"»
Можно попросить объяснить кто знает, что в данном контексте означает: "2^>nul" ?
Foreigner
06-02-2016, 11:44
что в данном контексте означает: "2^>nul" ? »
Оно в любом контексте перенаправляет STDERR в NULL (т.е. подавляет вывод ошибок)
Freddy1984
06-02-2016, 14:26
Оно в любом контексте перенаправляет STDERR в NULL (т.е. подавляет вывод ошибок) »
а цифра "2" означает что будет подавлен вывод двух ошибок?
а цифра "2" означает что будет подавлен вывод двух ошибок? »
Нет. «2» означает стандартный поток ошибок (stderr).
Стандартные потоки — Википедия (https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0 %B8)
Перенаправление ввода-вывода — Википедия (https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0 %B2%D0%BE%D0%B4%D0%B0-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0)
mariolast
10-05-2021, 07:45
Подниму тему.
А если файл вида 2021-05-10-07-42_11.02.038_03565688.ZBF ?
Как тут можно отфильтровать в названии дату?
mariolast
10-05-2021, 09:31
Есть прога MEDOC, она делает через планировщик резервные копии файловв заданную папку. Каждый день
Так как база уже довольно большая, то размер одного файла 1,5 гига
Мне же надо самый свежий копировать себе на NAS каждый день
Вот стоит задача, удалить из папки файлы, старше 1 суток.
То, что осталось, программой резервного копирования архивирую и перекидываю в NAS
megaloman
10-05-2021, 09:49
mariolast, что такое старше суток? Это только сегодня, или вчера+сегодня, или сейчас - 24часа?
mariolast
10-05-2021, 10:29
Только сегодня
DJ Mogarych
10-05-2021, 10:35
powershell -command "dir 'C:\temp' |? {($_.LastWriteTime).date -ne (get-date).Date} |del"
megaloman
10-05-2021, 10:51
mariolast, Только сегодня »@Echo Off
cls
Set "BoxIn=Z:\Backup"
Set "Ext=.ZBF"
Set "Mask=20??-??-??-??-??_??.??.???_????????%Ext%"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO Set "Now=%%d"
Set "Now=%Now:~0,4%-%Now:~4,2%-%Now:~6,2%-"
For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%" ^| findstr.exe /R /I /V /C:"^%Now%.*\%Ext%$"`) Do (
echo Del "%BoxIn%\%%f"
)
pause
Exit /B
Чтобы реально удалялось, уберите echo
megaloman
10-05-2021, 11:43
mariolast, Если только за сегодня без привязки к имени@Echo Off
cls
Set "BoxIn=Z:\Backup"
Set "Mask=20??-??-??-??-??_??.??.???_????????.ZBF"
2>nul FORFILES /P "%BoxIn%" /M "%Mask%" /D -1 /C "CMD /C Echo Del @Path"
pause
Exit /B
Чтобы реально удалялось, уберите echo
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.