Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
У меня каждый день делаются бекапы баз данных, потом они упаковываются и копируются в хранилище где и лежат всей кучей.

Надо сделать так чтобы при каждой архивации скрипт находил всей файлы в каталоге и в зависимости от даты создания (она указана в имени файла) удалял файлы которые хранятся больше месяца.

Честно говоря с SQL я не дружу, поэтому буду рад готовому скрипту в котором нужно сделать небольшие доработки.
31 окт 13, 06:41    [15056439]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
При чем тут скуль вообще, вы хотите чтоб сервер бд еще и файловыми операциями занимался???
А вообще посмотреть консольную утилиту FORFILES
31 окт 13, 07:11    [15056468]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Nick_e,

Для этого есть штатный функционал в планах обслуживания.
31 окт 13, 08:01    [15056506]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
ну я вот так бекап делаю, хотел сюда просто добавить удаление...

DECLARE @name varchar(100)
DECLARE @cmd sysname



-- Резервное копирование --------------------------------------------------------------------------------------------------------------

-- База 2013
SELECT @name = '2013'

exec( 'BACKUP DATABASE '  +@name+' TO  DISK = N''e:\backup$\arh\'+@name+'.bak'' WITH INIT ,  NOUNLOAD ,  NOSKIP ,  STATS = 10,  NOFORMAT')


-- Архивирование ------------------------------------------------------------------------------------------------------------------------------

-- База 2013
SELECT @name = '2013'

SET @cmd = 'e:\backup$\Rar.exe a -ag -df e:\backup$\arh\' +@name+ '_ e:\backup$\arh\' +@name+ '.bak'
exec master..xp_cmdshell @cmd
31 окт 13, 08:38    [15056550]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Nick_e
Честно говоря с SQL я не дружу, поэтому буду рад готовому скрипту в котором нужно сделать небольшие доработки.
Напишите такой скрипт для ОС, потом выполните его xp_cmdshell (как вы делаете для архивирования)
31 окт 13, 08:45    [15056560]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Я уже написал в какую сторону копать.
31 окт 13, 10:12    [15056778]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Короче сделал проще, для меня проще.
Т.к. все файлы лежат в одной директории, то просто удаляю все у которых в имени старше двух месяцев дата указана.

DECLARE @name varchar(100);
DECLARE @path varchar(255)
DECLARE @day  varchar(2)
DECLARE @cmd sysname
-- База 2013
SELECT @name = '2013'
-- формируем имя удаляемых файлов давностью 2 месяца 
set @Month = right('0'+CONVERT(varchar(3),MONTH(SYSDATETIME())-2),2);
--print 'Month =' + right('0'+CONVERT(varchar(3),MONTH(SYSDATETIME())),2);
-- путь удаляемых файлов
set @path = 'e:\bek'
-- формируем командную строку для выполнения 
set @cmd ='del /q '+ @path +'\'+ @name + '_'+CONVERT(varchar(5),YEAR(SYSDATETIME ( ))) + Cast(@month as varchar)+ '*';
-- удаляем! :)
exec master..xp_cmdshell @cmd
PRINT 'Полученные параметры = " ' + @cmd + ' "' 
1 ноя 13, 10:59    [15062985]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Надо наверно только написать проверку есть ли файлы новее 2х месяцев, а то не дай бог системная база собьется и хана))
1 ноя 13, 11:09    [15063053]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
системная дата имею ввиду, ведь имя файла из нее формируется как при упаковке так и при удалении.

п.с. почему я не могу свое сообщение отредактировать!????
1 ноя 13, 11:11    [15063062]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Подкажите по forfiles кто в курсе, что то я не соображу...

Вот так я удаляю файлы в папке старше 3х дней:
FORFILES /p SPAM /m *.* /d -3 /c "CMD /c del /Q @FILE" 


прога берет и грохает файлы, ну да работает ура! НО не как она определяет дату файла не понимаю!

Для примера положил в папку один файл который создал сегодня и файлы созданный давным давно, дак вот утилита определяет именно дату создания файла и удаляет его как старый! Мне так не надо! Это он на чужом компе был давно создан,а в папку в которой происходит удаление я его сегодня скопировал,значит удаляться он должен только через три дня.

Если кто подкинет код на SQL буду благодарен.
Вот так я могу перебрать файлы в папке, но как получить их дату и удалить нужные увы знаний SQL нет...
DECLARE @Path VARCHAR(100)
SET @Path = 'C:\folder\'

-- получение списка файлов 
IF OBJECT_ID('TEMPDB..#dirtree') IS NOT NULL DROP TABLE #dirtree
CREATE TABLE #dirtree(ID int NOT NULL identity(1,1) primary key, subdirectory VARCHAR(256), depth INT, [file] INT)
INSERT INTO #dirtree (subdirectory,depth,[file]) EXEC xp_dirtree @Path, 0, 1
SELECT * FROM #dirtree
5 май 15, 12:06    [17601324]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nick_e
прога берет и грохает файлы, ну да работает ура! НО не как она определяет дату файла не понимаю!

Вы хотите получить тексты кода утилитыFORFILES ?
Или вы справшиваете про многочисленные параметры в вашем примере запуска ?

Nick_e
Для примера положил в папку один файл который создал сегодня и файлы созданный давным давно, дак вот утилита определяет именно дату создания файла и удаляет его как старый! Мне так не надо! Это он на чужом компе был давно создан,а в папку в которой происходит удаление я его сегодня скопировал,значит удаляться он должен только через три дня.

И что в свойствах файла показывает, что "я его сегодня скопировал" ?
5 май 15, 12:16    [17601421]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Почему этим вообще должен заниматься сервер баз данных?
5 май 15, 13:09    [17601712]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Владислав Колосов
Почему этим вообще должен заниматься сервер баз данных?


Потому, что я так хочу.
6 май 15, 03:03    [17605119]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
[quot Glory]
Вы хотите получить тексты кода утилитыFORFILES ?
Или вы справшиваете про многочисленные параметры в вашем примере запуска ?

В общем forfiles не знает, что такое дата создания... через нее только дата последней модификации....

Glory
И что в свойствах файла показывает, что "я его сегодня скопировал" ?

Да!))

Через xp_cmdshell подскажите как получить дату создания (НЕ последнего изменения) файла?
6 май 15, 06:52    [17605197]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nick_e
В общем forfiles не знает, что такое дата создания... через нее только дата последней модификации....

Вы наконец то заглянули в хелп ?

Nick_e
Glory
И что в свойствах файла показывает, что "я его сегодня скопировал" ?

Да!))

"да" - это ответ на вопрос, какое свойство файла показывает, что "я его сегодня скопировал" ?
6 май 15, 08:32    [17605348]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Glory
"да" - это ответ на вопрос, какое свойство файла показывает, что "я его сегодня скопировал" ?


Nick_e

Через xp_cmdshell подскажите как получить дату создания (НЕ последнего изменения) файла?
6 май 15, 09:50    [17605663]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Начниет изучать команду DIR
6 май 15, 09:52    [17605672]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Nick_e
Через xp_cmdshell подскажите как получить дату создания (НЕ последнего изменения) файла?
Это можно сделать командой DIR с опцией /T
6 май 15, 09:54    [17605677]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Считайте меня извращенцем, но я сделал так...
У меня бекапятся базы, каждая в свой каталог и в имени файла у всех дата, добавил код в процедуру бекапа и теперь каждый раз после создания нового, sql проверяет есть ли файлы старше 10 дней, если есть удаляет.

DECLARE @Path VARCHAR(100)
Declare @fileDate VARCHAR(100)
DECLARE @cmd sysname

SET @Path = 'E:\backup$\arh\SSmart'

-- получение списка файлов 
IF OBJECT_ID('TEMPDB..#dirtree') IS NOT NULL DROP TABLE #dirtree
CREATE TABLE #dirtree(ID int NOT NULL identity(1,1) primary key, subdirectory VARCHAR(256), depth INT, [file] INT)
INSERT INTO #dirtree (subdirectory,depth,[file]) EXEC xp_dirtree @Path, 0, 1
--select * FROM #dirtree
-- получаем системную дату
--select convert(char,GetDate(),108) as CurretT
--select convert(char,GetDate(),110) as CurretD

declare @id bigint
declare curs cursor fast_forward --static
for
select id
from #dirtree
open curs
fetch next from curs into @id

while @@fetch_status = 0
   begin --Начало для цикла перебора курсора	
 	  Declare @myfile VARCHAR(100)
      select @myfile = subdirectory FROM #dirtree WHERE id = @id
      set @fileDate = left(right(@myfile,18),8)
  --    print 'Идентифтикатор строки =' + RTRIM(@id)+' имя файла ='+RTRIM(@myfile)+' дата='+RTRIM(@filedate)
   --   print 'Дата раньще которой надо удалить бекапы='+Convert(Varchar, dateadd(DAY,-10,GETDATE()), 112)
      if @filedate <  Convert(Varchar, dateadd(DAY,-10,GETDATE()), 112) 
     	begin
			print 'Найден бекап старше 10 дней - будем удалять файл '+@Path+'\'+@myfile
			set @cmd = 'del /q '+ @path +'\'+ @myfile
			print '@cmd='+@cmd 
		--	exec master..xp_cmdshell @cmd
		end 
	fetch next from curs into @id -- увеличение счетчика строк
   end--Конец цикла перебора курсора
close curs
deallocate curs
6 май 15, 11:58    [17606402]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
Nick_e
Member

Откуда:
Сообщений: 40
Надо в этот код еще добавить проверку на существование свежих файлов, перед удаление старых и будет нормально...
7 май 15, 03:32    [17610446]     Ответить | Цитировать Сообщить модератору
 Re: Найти все файлы в папке и удалить с заданными именами?  [new]
хмхмхм
Guest
Nick_e,

PowerShell поможет юному админу?
7 май 15, 14:47    [17613243]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить