Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление файлов кроме сегодняшнего (http://forum.oszone.net/showthread.php?t=255250)

Kenwood 01-03-2013 15:34 2101867

Удаление файлов кроме сегодняшнего
 
Здравствуйте,

У меня возникла задачка: в папке имеются логи за несколько лет. Каждый день программа создает новый файл. Все бы ничего, если бы не возникла потребность удалять файлы по причине отсутсвия места на диске. Можно конечно было вручную снести все файлы, но хочется автоматизировать данный процесс. Так вот, как сделать так, чтобы в одной конкретной папке удалялись файлы старше 1-х суток. Программа каждые сутки создает файл типа: ftp20130301.log, вчера ftp20130228.log и так далее.....

Заранее спасибо

Iska 01-03-2013 18:21 2102007

Kenwood, ориентируемся на дату/время последней модификации самого файла или же на дату в его имени?

megaloman 01-03-2013 23:07 2102238

ИМХО, имеет смысл хранить заданное кол-во логов, например, 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 01-03-2013 23:20 2102250

Надо ориентироваться только на дату в его имени

Iska 02-03-2013 03:07 2102356

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) затронуты не будут.

Kenwood 04-03-2013 15:26 2103967

спасибо ограмное, все сработало!!! Так как надо было.
Спасибо всем за помощь, особенно Iska

Freddy1984 06-02-2016 10:36 2603047

Цитата:

Цитата megaloman
@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 2603057

Цитата:

Цитата Freddy1984
что в данном контексте означает: "2^>nul" ? »

Оно в любом контексте перенаправляет STDERR в NULL (т.е. подавляет вывод ошибок)

Freddy1984 06-02-2016 14:26 2603076

Цитата:

Цитата Foreigner
Оно в любом контексте перенаправляет STDERR в NULL (т.е. подавляет вывод ошибок) »

а цифра "2" означает что будет подавлен вывод двух ошибок?

Iska 06-02-2016 14:55 2603082

Цитата:

Цитата Freddy1984
а цифра "2" означает что будет подавлен вывод двух ошибок? »

Нет. «2» означает стандартный поток ошибок (stderr).

Стандартные потоки — Википедия
Перенаправление ввода-вывода — Википедия

mariolast 10-05-2021 07:45 2957453

Подниму тему.
А если файл вида 2021-05-10-07-42_11.02.038_03565688.ZBF ?
Как тут можно отфильтровать в названии дату?

mariolast 10-05-2021 09:31 2957461

Есть прога MEDOC, она делает через планировщик резервные копии файловв заданную папку. Каждый день
Так как база уже довольно большая, то размер одного файла 1,5 гига
Мне же надо самый свежий копировать себе на NAS каждый день
Вот стоит задача, удалить из папки файлы, старше 1 суток.
То, что осталось, программой резервного копирования архивирую и перекидываю в NAS

megaloman 10-05-2021 09:49 2957464

mariolast, что такое старше суток? Это только сегодня, или вчера+сегодня, или сейчас - 24часа?

mariolast 10-05-2021 10:29 2957468

Только сегодня

DJ Mogarych 10-05-2021 10:35 2957470

Код:

powershell -command "dir 'C:\temp' |? {($_.LastWriteTime).date -ne (get-date).Date} |del"

megaloman 10-05-2021 10:51 2957472

mariolast,
Цитата:

Цитата 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 2957473

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


Время: 23:50.

Время: 23:50.
© OSzone.net 2001-