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

Ответить


Этот вопрос предназначен для предотвращения автоматической отправки форм спам-ботами.
Смайлики
:| :) :wink: :D :lol: :( :cry: 8) :o :oops: :? :x :P :evil: :twisted: :roll: :!: :?: :idea: :arrow: :mrgreen:
Ещё смайлики…

Markdown is OFF

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ВКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Синхронизация папок с удалением несовпадающих файлов

Применение утилиты 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 КБ) 461 скачивание

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

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 КБ) 592 скачивания

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 КБ) 592 скачивания

Запускаем этот батник с параметрами:

Код: Выделить всё

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 множество параметров, с которыми можно поэкспериментировать, чтобы добиться совсем хитрых результатов.


Вернуться к началу