Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты

Ответить
Настройки темы
CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток!

Возник вопрос...
Как можно средствами BAT-файла найти, есть ли изменённые файлы в указанной папке (включая подкапки)?

Вкратце опишу, для чего мне это необходимо:
1. Указываю папку через SET $DEST_DIR=C:\Documents
2. Затем скрипт проверяет, есть ли в папке изменившиеся файлы (хотя бы один)
3. Если есть хотя бы один изменённый файл, то скрипт запускает WinRAR из консоли и делает т.н. резервную копию всей папки
4. Затем созданный архив перемещает на сетевой диск...

Отправлено: 18:41, 08-05-2011

 

Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


frid-karatel,
Цитата frid-karatel:
2. Затем скрипт проверяет, есть ли в папке изменившиеся файлы (хотя бы один) »
Обычно используют xcopy, forfiles, ntbackup, robocopy. Xcopy.exe есть во всех редакциях винды.
Если надо обязательно найти,
Код: Выделить весь код
@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"
PS. Я тут несколько раз исправлял. Так что повнимательней

Последний раз редактировалось Foreigner, 08-05-2011 в 19:51.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:55, 08-05-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить 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
Благодарности: 1563

Профиль | Отправить PM | Цитировать


frid-karatel, по мне так вполне должно хватить возможностей WinRAR - он умеет сам искать файлы, измененные со времени последнего бэкапа (ключи -ac, -ao)
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:54, 08-05-2011 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


amel27, дык, автору вопроса надо «всю папку с сайтом», а не только архивные файлы. Глупость, конечно. Подобный подход автора к архивированию выглядит, по меньшей мере, нелепым: 3 Виды резервного копирования.

Отправлено: 20:02, 08-05-2011 | #6


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить 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
Благодарности: 966

Профиль | Цитировать


Цитата frid-karatel:
Вот, написал согласно инструкциям Foreigner'а, BAT-файл, но выдаёт "Ошибка в синтаксисе"... »
Ну вот, на вскидку, сразу вижу метки @next и @continue прямо в теле цикла, да еще и с отступом. Имхо, это не айс

Отправлено: 20:45, 08-05-2011 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Ну вот, на вскидку, сразу вижу метки @next и @continue прямо в теле цикла, да еще и с отступом. Имхо, это не айс »
Не айс — это когда вход снаружи внутрь цикла. Используйте без меток, наподобие:
Код: Выделить весь код
		IF NOT DEFINED flag (
				CALL:@check %%i
			)
Оффтопик:
читать дальше »
Цитата frid-karatel:
Далее...
Ведётся работа над N проектами. Допустим, 30 шт.
За день могут быть изменены только 5 проектов, а то и вообще изменений не будет.
Соответственно, надо проверять, были ли какие-нибудь изменения или нет, а потом уже делать резервную копию. »
Не надо. Это задача самого резервного копирования.
Цитата frid-karatel:
Далее...
Необходима полная резервная копия всей папки с проектом целиком, а не только измененных файлов.
Чтобы через месяц-другой-третий можно было откатиться и посмотреть/сравнить с тем, что сейчас есть. »
Зачем постоянно полная? Раз в месяц/неделю… В промежутке — резервная копия только изменённых файлов.
Цитата frid-karatel:
Далее...
Проекты могут содержать как большие файлы (1 Гб), так и маленькие (1 Кб).
Маленьких файлов может быть... Ну, скажем, 100 000... Соответственно, тут уместно архивирование типа WinRAR. »
А лучше PAQ и KGB Archiver . В термине резервное копирование главным является первое слово. Сжатие тут не главное.
Цитата frid-karatel:
Далее...
Необходим доступ к резервной копии в любой момент.
Некоторые программы для бэкапа используют резервирование в свой формат, что требует установки софта на каждом компьютере.
А это не есть гуд... »
Разворачиваете полную копию, накатываете на неё частичные архивы вплоть до нужной даты. Хоть тем же WinRar'ом, хоть NT Backup'ом.

Отправлено: 21:02, 08-05-2011 | #9


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Iska,
По поводу меток. Два варианта для исследований:
Код: Выделить весь код
@echo off

for /l %%i in (0,1,10) do (

    if %%i equ 2 goto:break
    echo %%i
    :break

)
echo 111
Код: Выделить весь код
@echo off

for /l %%i in (0,1,10) do (

    if %%i equ 2 goto:break
    echo %%i
    :break
    rem fake command

)
echo 111
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:13, 08-05-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Найти, есть ли в папке (и подпапках) изменённые файлы с указанной даты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход