Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти файлы и определить по имени их дату? 
:(
    Опции темы
Nicholas
  Дата 31.10.2013, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



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

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

Честно говоря с SQL я не дружу, поэтому буду рад готовому скрипту в котором нужно сделать небольшие доработки. smile



Это сообщение отредактировал(а) Nicholas - 31.10.2013, 05:17
PM MAIL ICQ   Вверх
Akina
Дата 31.10.2013, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



 smile А при чём тут SQL?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
Дата 31.10.2013, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



При том,  что бекап и архивация у меня на скрипте SQL написана, хочу добавить удаление старья.

вот сюда:

Код

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



Это сообщение отредактировал(а) Nicholas - 31.10.2013, 07:40
PM MAIL ICQ   Вверх
Akina
Дата 31.10.2013, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Создайте стандартный план обслуживания БД - там есть в т.ч. и пункт удаления файлов старше указанного возраста.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 1.11.2013, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Akina @ 31.10.2013,  08:21)
Создайте стандартный план обслуживания БД - там есть в т.ч. и пункт удаления файлов старше указанного возраста.

Не видел я там такого, подскажи где.

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

Код

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 + ' "' 


Это сообщение отредактировал(а) Nicholas - 1.11.2013, 10:00
PM MAIL ICQ   Вверх
Akina
Дата 1.11.2013, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Nicholas @  1.11.2013,  10:57 Найти цитируемый пост)
Не видел я там такого



Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  1.jpg 77,33 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
Дата 1.11.2013, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



А ну там удаляет файлы бекапа которые sql делает,а у меня то архивы лежат на сетевом хранилище...
PM MAIL ICQ   Вверх
Akina
Дата 1.11.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ты всё ещё не дошёл до простой мысли, что твои архивы, валяющиеся в файловой системе две недели, уже вообще никаким боком не привязаны к SQL-серверу?

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 6.5.2015, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Akina @  1.11.2013,  14:36 Найти цитируемый пост)
Ты всё ещё не дошёл до простой мысли, что твои архивы, валяющиеся в файловой системе две недели, уже вообще никаким боком не привязаны к SQL-серверу?

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


Сейчас уже дошел...  smile  smile 

Но это не показатель, в общем все,что мне нужно это определить дату создания (не модификации) файла. Вопрос как это сделать, НЕ по имени, а прочитав свойства файла?

Список файлов я получаю вот так, удалить тоже не проблема через xp_cmdshell, вопрос только в дате, помогите может кто знает, на всех форумах твердят одно причем тут sql да не причем, просто я так хочу вот и все.

Код

DECLARE @Path VARCHAR(100)
SET @Path = 'E:\backup$\arh\SSm'

-- получение списка файлов 
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

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
      
      print 'Идентифтикатор строки =' + RTRIM(@id)+' имя файла ='+RTRIM(@myfile)
      fetch next from curs into @id 
   end--Конец цикла перебора курсора
close curs
deallocate curs


Это сообщение отредактировал(а) Nicholas - 6.5.2015, 06:31
PM MAIL ICQ   Вверх
Nicholas
  Дата 7.5.2015, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



В общем так...
У меня бекапятся базы, каждая в свой каталог и в имени файла у всех дата, добавил код в процедуру бекапа и теперь каждый раз после создания нового, 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


Надо в этот код еще добавить проверку на существование свежих файлов, перед удаление старых и будет нормально...

Это сообщение отредактировал(а) Nicholas - 7.5.2015, 03:32
PM MAIL ICQ   Вверх
Akina
Дата 7.5.2015, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ну почему надо делать непременно через задницу? Напиши ты простейший VBS-скрипт, который выполняет поставленную задачу! а его уже, если прёт, запускай из SQL-процедуры.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
Дата 7.5.2015, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



vbs  для меня китайская грамота, проще в sql разобраться. и почему через зад не понятно, что плохого в этом коде?
PM MAIL ICQ   Вверх
Akina
Дата 7.5.2015, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Nicholas @  7.5.2015,  12:40 Найти цитируемый пост)
почему через зад не понятно, что плохого в этом коде? 

Ну как тебе сказать... 
Вот есть задача. Всегда найдётся инструмент, предназначенный для решения этой задачи. Или по крайней мере наилучшим образом подходящий для её решения. И есть куча инструментов, которые хоть и не предназначены, но тем не менее помогут её хоть как-то решить. Ну классические примеры - гвозди и микроском, королевская печать и орехи...
Так вот в данном случае ты берёшь не предназначенный для этой задачи инструмент, а именно какой попался под руку. Просто потому, что ты с ним больше знаком. Вот тот самый случай, когда биолог забивает гвозди микроскопом, потому как тот ему более родной, чем молоток.

Цитата(Nicholas @  7.5.2015,  12:40 Найти цитируемый пост)
vbs  для меня китайская грамота

Ну напиши на любом другом языке программирования, какой для тебя не китайская грамота. 
Хотя, если честно, то написание VBS-кода для ТАКОЙ задачи - совершенно элементарная вещь.
Код

' Определить переменные
Dim fso, fldr, f
' Получить объект для работы с файловой системой
Set fso = CreateObject("Scripting.FileSystemObject")
' Подключиться к нужному каталогу - тут можешь подставить свой
Set fldr = fso.GetFolder("c:\archives")
' Перебрать все файлы в каталоге
For Each f In fldr.Files
    ' Если дата создания меньше, чем текущая минус 1 месяц
    ' Можешь использовать другие его свойства, например, .DateLastModified
    If f.DateCreated < DateAdd("m", -1, Now()) Then
        ' Удалить файл
        f.Delete
    End If
Next


Добавлено через 13 минут и 20 секунд
PS. Не клади сам скрипт в папку архивов - а то через месяц он сам себя удалит...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 13.5.2015, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Akina, а как сделать перебор еще и по подпапкам внутри указанной?
PM MAIL ICQ   Вверх
Akina
Дата 13.5.2015, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Оформить приведённый код как процедуру-1, принимающую каталог для удаления файлов.
По аналогии написать код процедуры-2, который не только вызывает процедуру-1 для текущего каталога, но и получает список подкаталогов текущего каталога и вызывает себя для каждого из них рекурсивно. 
В основной процедуре вызывать процедуру-2 для начального каталога.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 13.5.2015, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Переделал честно сворованный здесь  VBS код...
Код

'Создаём и запускаем диалог выбора корневой папки
'Set objShell = CreateObject("Shell.Application")
'Set objFolder = objShell.BrowseForFolder(0, "Select a folder:", 0) 
'Если пользователь не выбрал папку, завершаем приложение
'If objFolder Is Nothing Then Wscript.Quit
'Получаем путь к выбранной папке
'objPath = objFolder.Self.Path
'--------------------------------------------------------------
' или укажем папку сами)
' Определить переменные
Dim fso, fldr, f, newfiles
' Получить объект для работы с файловой системой
Set fso = CreateObject("Scripting.FileSystemObject")
' Подключиться к нужному каталогу - тут можешь подставить свой
objPath  = fso.GetFolder("archives")
'--------------------------------------------------------------
'Создаем объект папки файловой системы 
'и отправляем его в рекурсивную функцию
Set FSO = CreateObject("Scripting.FileSystemObject")
ShowSubFolders FSO.GetFolder(objPath)
'Сигнализируем о завершении программы
Wscript.Echo "PROFIT in " & objPath
'Функция рекурсивного обхода папок
Sub ShowSubFolders(Folder)
'Перебираем подпапки
 For Each Subfolder in Folder.SubFolders
'В каждой подпапке Subfolder делаем нужное нам черное дело
'Например, выводим её имя
  ' Wscript.Echo Subfolder.Name
  set fldr = folder
   For Each f In fldr.Files
    ' Если дата создания меньше, чем текущая минус 1 месяц
    ' Можешь использовать другие его свойства, например, .DateLastModified
    'If f.DateCreated < DateAdd("d", -10, Now()) Then
       ' Удалить файл
     WScript.Echo "Удаление файла старше 10 дней" & vbCrLf & f
        ' удаляем файл если есть новые файлы
    '    if newfiles = 1 then
            'f.Delete
    '    End If
    'end if
Next
'Рекурсивно вызываем функцию для подпапок текущей папки
   ShowSubFolders Subfolder
  Next
End Sub
'PROFIT...


но все равно, что то меня тянет сделать это на SQL )))

Добавлено через 2 минуты и 22 секунды
чуть поправил взял отсюда...
Код

'Создаём и запускаем диалог выбора корневой папки
'Set objShell = CreateObject("Shell.Application")
'Set objFolder = objShell.BrowseForFolder(0, "Select a folder:", 0) 
'Если пользователь не выбрал папку, завершаем приложение
'If objFolder Is Nothing Then Wscript.Quit
'Получаем путь к выбранной папке
'objPath = objFolder.Self.Path
'--------------------------------------------------------------
' или укажем папку сами)
' Определить переменные
Dim fso, fldr, f, newfiles
' Получить объект для работы с файловой системой
Set fso = CreateObject("Scripting.FileSystemObject")
' Подключиться к нужному каталогу - тут можешь подставить свой
objPath  = fso.GetFolder("archives")
'--------------------------------------------------------------
'Создаем объект папки файловой системы 
'и отправляем его в рекурсивную функцию
Set FSO = CreateObject("Scripting.FileSystemObject")
ShowSubFolders FSO.GetFolder(objPath)
'Сигнализируем о завершении программы
Wscript.Echo "PROFIT in " & objPath
'Функция рекурсивного обхода папок
Sub ShowSubFolders(Folder)
'Перебираем подпапки
 For Each Subfolder in Folder.SubFolders
'В каждой подпапке Subfolder делаем нужное нам черное дело
'Например, выводим её имя
  ' Wscript.Echo Subfolder.Name
  set fldr = folder
   For Each f In fldr.Files
    ' Если дата создания меньше, чем текущая минус 1 месяц
    ' Можешь использовать другие его свойства, например, .DateLastModified
    'If f.DateCreated < DateAdd("d", -10, Now()) Then
       ' Удалить файл
     WScript.Echo "Удаление файла старше 10 дней" & vbCrLf & f
        ' удаляем файл если есть новые файлы
    '    if newfiles = 1 then
            'f.Delete
    '    End If
    'end if
Next
'Рекурсивно вызываем функцию для подпапок текущей папки
   ShowSubFolders Subfolder
  Next
End Sub
'PROFIT...


но хочу на sql...
PM MAIL ICQ   Вверх
Akina
Дата 13.5.2015, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Nicholas @  13.5.2015,  12:37 Найти цитируемый пост)
Код

' Создаем объект папки файловой системы 
' и отправляем его в рекурсивную функцию
Set FSO = CreateObject("Scripting.FileSystemObject")

Нахрена? у тебя ж FSO уже создан...
И у тебя не все переменные определены. Что, кстати, может породить проблемы, ибо не определена область видимости переменной Subfolder.

Цитата(Nicholas @  13.5.2015,  12:37 Найти цитируемый пост)
меня тянет сделать это на SQL 

Ну делай...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1326 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.