|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты |
|
|
CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты
|
Новый участник Сообщения: 14 |
Профиль | Отправить PM | Цитировать Доброго времени суток!
Возник вопрос... Как можно средствами BAT-файла найти, есть ли изменённые файлы в указанной папке (включая подкапки)? Вкратце опишу, для чего мне это необходимо: 1. Указываю папку через SET $DEST_DIR=C:\Documents 2. Затем скрипт проверяет, есть ли в папке изменившиеся файлы (хотя бы один) 3. Если есть хотя бы один изменённый файл, то скрипт запускает WinRAR из консоли и делает т.н. резервную копию всей папки 4. Затем созданный архив перемещает на сетевой диск... |
|
Отправлено: 18:41, 08-05-2011 |
Ветеран Сообщения: 1758
|
frid-karatel,
Цитата frid-karatel:
Если надо обязательно найти, @echo off setlocal set "ch_date=20110323" pushd "C:\Documents" for /f "tokens=1" %%i in (' dir /s /tw /a-d ') do ( if defined flag goto:next call:check %%i ) :next popd if not defined flag goto:eof :: Здесь команда создания архива, у меня 7zip for /f "tokens=1-3 delims=." %%i in ( "%date%" ) do set "archname=%%k-%%j-%%i" 7z a backup_%archname%.7z "C:\Documents" pushd \\comp\backup move backup_%date%.7z popd goto:eof :check for /f "tokens=1-3 delims=." %%i in ( "%1" ) do if %%k%%j%%i geq %ch_date% set "flag=1" |
|
Последний раз редактировалось Foreigner, 08-05-2011 в 19:51. Отправлено: 18:55, 08-05-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Мне необходимо не скопировать изменившиеся файлы, а узнать, есть ли изменения в папке, изменился ли хотя бы какой-нибудь жалкий файлик с даты, указанной мной...
Например, SET $CH_DATE=20110501. Если с этой даты есть хотя бы какие-нибудь изменения в папке, то выдать, так сказать, true, иначе false Более подробно... У меня на сетевом диске в папке Backup есть архивы WinRAR... У архивов имена: 2011-04-13, 2011-04-27, 2011-04-29, 2011-05-01 и т.д. Каждый день через планировщик Windows будет запускаться BAT-файл, который будет брать имя (дату создания) самого нового архива WinRAR. Затем в указанных мной папках будет выполняться поиск на наличие изменённых файлов. Если изменения есть, то будет создаваться новый архив WinRAR с именем как дата самого нового файла. После создания, архив будет перемещаться на сетевой диск в папку Backup. Во-от P.S.: Приведу пример, для чего это необходимо... Имеется локальный веб-сервер, на котором в сети держатся порядка 10ти сайтов и сервисов. Например, сегодня я решил улучшить один из сайтов, внёс изменения, поправил картинки/скрипты и т.п. Ночью, когда все спят и никаких изменений не производится, надо сделать резервную копию всей папки с этим сайтом, а не только изменённых файлов. Чтобы в случае чего можно было не восстановить какие-то файлы из резервной копии, а откатиться целиком на ту версию сайта, которая была, скажем, месяц назад... В остальных 9ти никаких изменений не произошло, соответственно резервные копии смысла делать нет. |
Последний раз редактировалось frid-karatel, 08-05-2011 в 19:12. Отправлено: 19:04, 08-05-2011 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать frid-karatel, для размышления: про атрибут файлов «архивный» и его применение в данном случае Вы в курсе? Можете попробовать что-то наподобие:
@echo off setlocal enableextensions enabledelayedexpansion set sFolder=%~1 if defined sFolder ( if exist "%sFolder%" ( (dir /s /b /a:a "%sFolder%"|find.exe /v /c "") 1>nul 2>&1 && echo 1 || echo 2 ) else ( echo Folder [%sFolder%] not found ) ) else ( echo Usage "%~0" ^<Folder^> ) endlocal exit /b |
Отправлено: 19:53, 08-05-2011 | #4 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать frid-karatel, по мне так вполне должно хватить возможностей WinRAR - он умеет сам искать файлы, измененные со времени последнего бэкапа (ключи -ac, -ao)
|
|
Отправлено: 19:54, 08-05-2011 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать amel27, дык, автору вопроса надо «всю папку с сайтом», а не только архивные файлы. Глупость, конечно. Подобный подход автора к архивированию выглядит, по меньшей мере, нелепым: 3 Виды резервного копирования.
|
Отправлено: 20:02, 08-05-2011 | #6 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Расскажу более детально ситуацию, чтобы понять, почему я пошёл в этом направлении, а не взял какой-нибудь софт для бэкапа...
У нас есть сеть из 5ти компьютеров + 1 компьютер как-бы "серверный". На серверном компьютере стоят несколько HDD по 2Тб. Там же лежат разные резервные копии, дистрибутив и т.п. вещи. Там же запущен локальный WEB-сервер XAMPP. На нём хостятся с 5 локальных версий сайтов да всякие сервисы типа менеджера задач, органайзера, почты и т.п. Далее... Ведётся работа над N проектами. Допустим, 30 шт. За день могут быть изменены только 5 проектов, а то и вообще изменений не будет. Соответственно, надо проверять, были ли какие-нибудь изменения или нет, а потом уже делать резервную копию. Далее... Необходима полная резервная копия всей папки с проектом целиком, а не только измененных файлов. Чтобы через месяц-другой-третий можно было откатиться и посмотреть/сравнить с тем, что сейчас есть. Далее... Проекты могут содержать как большие файлы (1 Гб), так и маленькие (1 Кб). Маленьких файлов может быть... Ну, скажем, 100 000... Соответственно, тут уместно архивирование типа WinRAR. Далее... Необходим доступ к резервной копии в любой момент. Некоторые программы для бэкапа используют резервирование в свой формат, что требует установки софта на каждом компьютере. А это не есть гуд... BAT-файл я могу конфигурировать так, как мне надо. К тому же, к нему имеется быстрый доступ и я могу внести в него изменения за несколько секунд, например добавить новую папку... Я склонялся даже к написанию своей программы на C++, но ввиду того, что среда у меня не установлена, решил сделать BAT'ом. Потом думал что-то подобное написать на Adobe AIR и JavaScript, но опять же - установка Adobe AIR на все компьютеры - не есть гуд. Вот такие дела... Если будут вопросы - могу детальней расписать какой-нибудь пункт ---------------------- Вот, написал согласно инструкциям Foreigner'а, BAT-файл, но выдаёт "Ошибка в синтаксисе"... ::==================================================================================================================================== :: >> Основные настройки скрипта @ECHO OFF SETLOCAL :: << << << ::==================================================================================================================================== :: >>Назначаем необходимые переменные :: Папка, куда необходимо копировать резервные копии SET $BACKUP_DIR=S:\Backup :: Путь до архиватора SET $WINRAR=C:\Program Files\WinRAR\WinRAR.exe :: Имя компьютера :: %COMPUTERNAME% :: Дата, согласно которой проверять файлы на изменение SET ch_date=20110323 :: << << << ::==================================================================================================================================== :: >> Определяем массив папок для копирования SET "$FOLDER:01=C:\Documents" SET "$FOLDER:02=C:\Letters" SET "$FOLDER:03=C:\ThirdFolder" :: ...и так далее... :: << << << ::==================================================================================================================================== :: >> Проход по всем папкам и проверка, есть ли изменения FOR /f "tokens=2 delims==" %%f IN ('SET $FOLDER') DO ( ::Устанавливаем текущий каталог PUSHD "%%f" :: >> Выполняем поиск изменённых файлов FOR /f "tokens=1" %%i IN ('DIR /s /tw /a-d') DO ( IF DEFINED flag GOTO:@next CALL:@check %%i :: >> Проверка результата поиска изменённых файлов. Если изменений нет, то ничего не делаем :@next POPD IF NOT DEFINED flag GOTO:@continue :: << << << :: >> Если изменения есть, то упаковываем папку в архив ::A Добавить в архив ::-AG+[FORMAT] Добавить к имени архива текущие дату и время. Если перед FORMAT стоит +, то дата будет добавлена перед именем ::CH -TL Установить время архива по времени новейшего файла ::-DH Открывать совместно используемые файлы ::-EP1 Исключить базовую папку из пути ::-INUL Не выводить сообщения об ошибках ::-M5 Метод сжатия: максимальный ::-S Создать непрерывный архив ::-Y Подразумевать ответ "Да" на все вопросы ::-X{NAME} Не обрабатывать файл/папку NAME. [-x*\temp\] - искл. все папки temp и файлы внутри папок temp "%$WINRAR%" A -AG+YYYY-MM-DD CH -TL -DH -EP1 -ISNUL -M5 -S -Y "%%f" "" :: << << << :@continue ) :: << << << ) :: << << << ::==================================================================================================================================== GOTO:@exit ::==================================================================================================================================== :: >> Поиск изменённых файлов :@check FOR /f "tokens=1-3 delims=." %%i IN ("%1") DO ( IF %%k%%j%%i geq %ch_date% SET "flag=1" ) :: << << << ::==================================================================================================================================== :@exit PAUSE |
Отправлено: 20:17, 08-05-2011 | #7 |
Ветеран Сообщения: 1758
|
Цитата frid-karatel:
|
|
Отправлено: 20:45, 08-05-2011 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
Оффтопик: |
|
Отправлено: 21:02, 08-05-2011 | #9 |
Ветеран Сообщения: 1758
|
|
Отправлено: 21:13, 08-05-2011 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Нужно найти все файлы *.log в папке dir и подпапках и заменить на файлы нулевой длины | dclxvi | Скриптовые языки администрирования Windows | 4 | 04-07-2012 21:28 | |
Любой язык - Нужно быстро (!) добавить/удалить строку во все файлы указанной директории | Possessed | Скриптовые языки администрирования Windows | 6 | 04-10-2011 22:29 | |
CMD/BAT - [решено] две функции по mp3 (узнать продолжительность и найти все mp3 файлы в папке) | tor4ok11 | Скриптовые языки администрирования Windows | 5 | 22-11-2010 07:17 | |
Доступ - Доступ через сеть к указанной общей папке | Makcermakcer | Microsoft Windows Vista | 0 | 29-08-2009 23:06 | |
[решено] Найти последние изменённые файлы | hasherfrog | Программирование в *nix | 3 | 22-08-2008 15:32 |
|