Alexander A Manaeff -

 
 

Синхронизация папок с удалением несовпадающих файлов

Все об администрировании рабочих станций Windows 95/98/NT/2000/XP/7/8. То, чего не найдешь в бескрайних просторах Интернета. Решения тех проблем, которые не решаются типовыми ответами, которые можно получить в техподдержке Майкрософта - а именно: переустановить продукт или купить какой-ть другой лицензионный диск.

Модератор: UncleFather

Синхронизация папок с удалением несовпадающих файлов

Сообщение UncleFather » 27 сен 2013 14:37, Пт

Задача:

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


Решение:

Наполнение текущей папки из эталонной новыми файлами или файлами, измененными позже текущих не представляет проблемы. Пользуемся командой xcopy с параметром /D. А вот удалить из текущей папки файлы, которых нет в эталонной - это проблема. Её и будем решать.

Если бы нужно было просто сравнить папки, нам бы подошла утилита WinDiff.exe из пакета ресурсов Windows NT 4.0 Resource Kit. Возможно, эта утилита есть в более поздних выпусках Resource Kit, но, на всякий случай, так как пакет ресурсов Windows NT 4.0 Resource Kit в настоящее время недоступен, выкладываю ее здесь:
WinDiff.rar
(71.57 КБ) Скачиваний: 147


WinDiff работает как из интерфейса командной строки, так и из графического интерфейса. Результат работы выводит либо в свое окно, либо в файл,
 например:
-- c:\soft\ConsUserData1 : c:\Soft\ConsUserData -- includes left-only,differing files
.\1cons err.txt only in c:\soft\ConsUserData1 ???????? --------
.\1cons_err.txt only in c:\soft\ConsUserData1 ???????? --------
-- 2 files listed


Но, поскольку нам необходимо работать с результатами сравнения, то проще и быстрее сделать это из командного файла:
Код: Выделить всё
@ECHO OFF
REM задаём рабочие папки
set "CurrDir=%~f1"
set "ModelDir=%~f2"
REM set "CurrDir=c:\Soft\ConsUserData1"
REM set "ModelDir=c:\Soft\ConsUserData"
set "MyDir=%~dp0"

REM Проверка существования и доступности папок
pushd "%CurrDir%" ||exit
pushd "%ModelDir%" && popd || exit
cd "%CurrDir%"
REM Удаляем из CurrDir-папки файлы, для которых нет соответствующего
REM (с таким же именем) файла в ModelDir-папке
REM Перебираем содержимое папки CurrDir и для каждого файла вызываем проверку
for /f "delims=" %%N in ('dir /b /s *') do call :check "%%N"
popd
goto :EOF

REM Проверка
:check
REM Записываем в переменную NewPath имя текущего файла из папки CurrDir
set NewPath="%~f1"

REM В строке NewPath ищем подстроку CurrDir и заменяем ее на подстроку ModelDir (см. Работа со строками в командных файлах: http://manaeff.ru/forum/viewtopic.php?p=1470#p1470)
REM Результат записываем в переменную NewPath
REM Для разворачивания значения переменной NewPath используем инструкцию «Call», иначе - командный
REM интерпретатор вместо значения переменных выдаст ее название
call set  NewPath="%%NewPath:%CurrDir%=%ModelDir%%%"

REM Выполняем проверку - если в папке ModelDir нет текущего файла, то удаляем этот файл из папки CurrDir
if not exist "%NewPath%" del /F /Q %1 & echo %1>>%MyDir%\SyncRes.txt
goto :EOF
Exit

DelDiffFiles.rar
(1.02 КБ) Скачиваний: 145


Запускаем этот батник с параметрами:
Код: Выделить всё
DelDiffFiles.bat "Текущая папка" "Эталонная папка"
Он выполнит проверку текущей папки с эталонной и удалит те файлы из текущей папки и ее подпапок, которых нет в аналогичном расположении эталонной папки. За основу батника взят код отсюда.

При передаче в качестве параметров сетевого UNC пути из другого батника, из-за использования в коде команды PUSHD, создающей временное имя диска, указывающее на сетевой ресурс, необходимо для вызова этого батника использовать следующий формат:
Код: Выделить всё
PushD "\\Server\Share\Folder 1\Folder 2\Folder 3\Folder 4\Folder 5"
Call c:\Soft\bat\DelDiffFiles.bat %CD% "C:\Soft\ConsUserData"
popd


Результаты работы батника сохраняются в файле SyncRes.txt, который создастся в папке, откуда запускали батник.

Ну а дополнить текущую папку файлами из эталонной, измененными в более позднее время или теми, которых вообще в текущей папке нет - можно просто командой xcopy, например с параметром /D. Вообще у xcopy множество параметров, с которыми можно поэкспериментировать, чтобы добиться совсем хитрых результатов.
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1295
Зарегистрирован: 17 авг 2004 16:20, Вт

Применение утилиты Robocopy

Сообщение UncleFather » 15 апр 2017 16:51, Сб

Для синхронизации папок удобно применять бесплатную утилиту от Microsoft - Robocopy. Начиная с версии Vista, Robocopy входит в комплект Microsoft Windows.

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

По умолчанию Robocopy не копирует одинаковые файлы, что позволяет экономить и время, и траффик.

Так, чтобы создать зеркальную копию каталога C:\A в каталоге \\backupserver\B на сетевом ресурсе и удалить из каталога B все отсутствующие в каталоге C:\A файлы (/MIR) при этом использовать журнал возобновления (/Z) на случай потери сетевого соединения нужно использовать следующий синтаксис:
Код: Выделить всё
robocopy C:\A \\backupserver\B /MIR /Z


То же самое, при этом еще и исключив из синхронизации несколько папок, можно сделать с другими ключами:
Код: Выделить всё
robocopy C:\A \\backupserver\B /E /Z /PURGE /DCOPY:T /XD "C:\A\Exclusion1" "C:\A\Soft\Dit\Exclusion2" "C:\A\Exclusion 3"


Или то же самое, но, не копируя файлы, которые в целевой папке новее, чем в исходной:
Код: Выделить всё
robocopy C:\A \\backupserver\B /E /Z /PURGE /DCOPY:T /XO /XD "C:\A\Exclusion1" "C:\A\Soft\Dit\Exclusion2" "C:\A\Exclusion 3"


Если копирование происходит с систем Windows на устройства сетевого хранения (NAS), которое может не поддерживать временные стандарты NTFS-файлов, то к команде нужно добавит ключ /FFT . Этот ключ особенно полезен, когда устройство NAS, не поддерживает 100-наносекундную точность при определении времени создания файла в NTFS, а использует только двухсекундную точность определения времени создания файла, характерную для FAT. Округление времени создания NTFS-файла может привести к копированию файлов, которые не изменялись. Robocopy распознает эти файлы как новые либо как старые, но измененные и запускает операцию копирования.
Переключатель /FFT заставляет Robocopy использовать точность определения времени, применяемую в FAT, т. е. утилита использует двухсекундный стандарт для сравнения файлов. Пока файлы имеют одинаковые временные отметки внутри двухсекундного интервала, Robocopy считает их идентичными и не копирует. Этот переключатель значительно снизит время копирования и сократит случаи копирования файлов, которые в действительности не изменялись:
Код: Выделить всё
robocopy C:\A \\backupserver\B /E /Z /PURGE /DCOPY:T /FFT /XD "C:\A\Exclusion1" "C:\A\Soft\Dit\Exclusion2" "C:\A\Exclusion 3"


Если Robocopy не может скопировать файл (например, если он занят), то он будет повторять свои попытки 1 000 000 (один миллион) раз (параметр /R), с паузой в 30 секунд (параметр /W). Фактически, это может привести к зависанию всего скрипта. Поэтому желательно выставлять эти параметры вручную:
Код: Выделить всё
robocopy C:\A \\backupserver\B /E /Z /PURGE /DCOPY:T /FFT /R:2 /W:5 /XD "C:\A\Exclusion1" "C:\A\Soft\Dit\Exclusion2" "C:\A\Exclusion 3"


Если в путях присутствуют символы кириллицы, помним о том, что их нужно писать в правильной кодировке.

Документацию по Robocopy 1.95 читаем здесь:
ROBOCOPY-Version-1.95.rar
(267.49 КБ) Скачиваний: 8
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1295
Зарегистрирован: 17 авг 2004 16:20, Вт


Вернуться в Администрирование Windows Workstations

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Alexander A Manaeff -
@Mail.ru .