PDA

Показать полную графическую версию : [решено] Удалить все файлы из папки кроме нужных


Sirimika
09-11-2010, 11:43
В папку каждый день записываются новые файлы. Требуется в конце каждого месяца удалить все файлы, кроме файлов за первый день месяца (первым днем может быть как 1-е число, так и 2-е) Как это реализовать?

amel27
09-11-2010, 12:18
Sirimika, от чего плясать?.. от даты копирования на диск, даты изменения (см. описание ключа /T из "HELP DIR") или дату можно выдернуть из имени файла?.. просто все эти даты могут существенно отличаться друг от друга... например, если архивирование начать сегодня вечером, то закончиться оно может завтра утром, а на сетевую шару файл архива может попасть и вовсе послезавтра (в зависимости от скорости канала и т.д.)

Sirimika
09-11-2010, 12:21
В названии файла дата имеется и она совпадает с датой изменения документа, так что смотреть можно по любой. Формат даты в названии xxxx-20101207.bak.
xxxx - это собственно название файла
дата соответственно получается в формате гмд

gora
09-11-2010, 14:21
@Echo Off
SetLocal enabledelayedexpansion
Set src=e:\Temp\1
If Exist "%src%\*%Date:~6,4%%Date:~3,2%01.bak" (Set msc=01) Else Set msc=02
For /R "%src%" %%a In (*.bak) Do (
Set tna=%%~na
If Not !tna:~-8!==%Date:~6,4%%Date:~3,2%%msc% Del /F /Q "%%a"
)
Проверит наличие файлов .bak за первое число текущего месяца и года и при наличии таковых удалит все остальные файлы .bak из папки. Если за первое число файлов .bak нет, то удалит все файлы .bak кроме файлов за второе число текущего месяца и года.

Sirimika
09-11-2010, 15:31
"%src%\*%Date:~6,4%%Date:~3,2%01.bak" »
Не очень понятно, что значит данная запись, распишите пожалуйста

gora
09-11-2010, 15:42
Не очень понятно, что значит данная запись, распишите пожалуйста »
%src% - путь к Вашей папке (в моем случае это e:\Temp\1)
* - любые символы в любом количестве, например, Ваши xxxx- заменяются одной этой звездочкой
%Date:~6,4% - текущий год (4 цифры)
%Date:~3,2% - текущий месяц (2 цифры)
01 - первое число месяца

В итоге получаем : "e:\Temp\1\*20101101.bak"

Sirimika
09-11-2010, 16:09
еще наверно глупый вопрос задам.
Почему значения именно 6 и 3?

gora
09-11-2010, 16:19
Формат переменной %Date% для русской локализации - 09.11.2010
Отсчет номера символа с левого края (начинается с 0) - 0123456789

Подробнее: Set /?

Sirimika
09-11-2010, 16:23
еще вопрос возникает. Всегда должно оставаться три файла, например:
базаА-20101207.bak
базаБ-20101207.bak
базаС-20101207.bak.

Но проблема может быть в том, что одна из баз сделает бэкап например следующим днем(изменят расписание или еще что-нить), если воспользоваться скриптом, который сейчас, то у меня останется только 2 файла. А надо чтобы всегда было со всех баз, даже если у них разница в день или несколько дней. У меня всегда должны быть быкапы всех трех баз от начала месяца

amel27
10-11-2010, 05:00
Всегда должно оставаться три файла »если понимать так, что на каждые месяц/базу оставить один 1-й файл:
@echo off
SetLocal EnableDelayedExpansion

for /f "delims=" %%a in ('dir /b/on *.bak') do (
set "$na=%%~na"& set "$x=$_!$na:~0,-2!"
if not defined !$x! (set "!$x!=X") else del "%%a"
)

P.S. в имени файла архива не должно быть пробелов/спецсимволов

Sirimika
10-11-2010, 09:44
в таком случае он удаляет только то, что в текущем месяце, а мне надо еще удалить все прошлые записи

amel27
10-11-2010, 10:11
Sirimika, да нет, для каждого ключа (имя файла без последних двух цифр месяца числа) скрипт оставляет только первый по порядку, все последующие файлы с таким же ключом удаляются:


базаA-20101107.bak - оставить
базаA-20101108.bak - удалить
базаA-20101110.bak - удалить
|-----------|
ключ

Sirimika
10-11-2010, 10:52
amel27, это я поняла. В итоге получим, бэкап с каждой базы за первое число каждого месяца. Но мне требуется получить только за текущий месяц.
У меня лежит куча бэкапов за различные месяца, мне надо чтобы в конце месяца отработал батник и удалил все кроме 3-х бекапов каждой базы текущего месяца.

Пример того что должно остаться:
базаA-20101107.bak
базаБ-20101108.bak
базаС-20101107.bak

То что останется если отработает этот батник:
базаA-20101107.bak
базаБ-20101108.bak
базаС-20101107.bak

базаA-20101007.bak
базаБ-20101008.bak
базаС-20101007.bak

базаA-20100907.bak
базаБ-20100908.bak
базаС-20100907.bak

amel27
10-11-2010, 11:40
отработал батник и удалил все кроме 3-х бекапов каждой базы текущего месяца »тогда уж "кроме 1-го бэкапа каждой базы ...":
@echo off
SetLocal EnableDelayedExpansion

for /f "delims=" %%a in ('dir /b/on *.bak') do (
set "$na=%%~na"& set "$b=$_!$na:~0,-8!"& set "$m=!$na:~-8,6!"
if defined !$b! del "%%a"
if not defined !$b! if "!$m!"=="%DATE:~-4%%DATE:~3,2%" (
set "!$b!=%%a") else del "%%a")

Sirimika
12-11-2010, 09:49
Добрый день.
Я наверно опять с глупым вопросом, но не могли бы вы пояснить один момент:
переменная $b принимает такие значения как $b=$_mysql- ($_psql-, $_www-)

На этапе if defined !$b! del "%%a" считается что $b не определена, но после того, как один раз отработает set "!$b!=%%a", переменная принимает одно из значений $b=mysql-20101015.bak (psql-20101015.bak,www-20101015.bak).
Не понимаю когда $b становиться опять не определена, почему остаются все три файла mysql, psql, www, а не один mysql

Буду очень признательна за подробный ответ.

gora
12-11-2010, 10:09
не могли бы вы пояснить »
Попробую.
Есть переменная $b, мы определяем ее значение:
set "$b=name1" Мы можем проверить, определена ли у нас эта переменная $b, так:if defined $b ... А такое написание:if defined !$b! ... проверяет не переменную $b, а переменную с именем содержащимся в переменной $b, т.е., в нашем случае это переменная с именем name1
Соответственно эта строка:set "!$b!=%%a" присваивает переменной name1 значение из переменной %%a

Sirimika
12-11-2010, 10:33
gora, огромное спасибо. Теперь все стало понятно и просто =)




© OSzone.net 2001-2012