Robocopy / S создает пустые папки

1284
GWild

Хорошо, я пытаюсь остановить Robocopy от создания пустых папок при копировании. Папки SOURCE не пусты; но у них также нет новых файлов для копирования. Тем не менее, Robocopy создает их в пункте назначения.

Моя цель - создать копию файлов 1 дня назад. Но я бы хотел не видеть 11 674 новых папок и записей в журнале, когда было скопировано только 4 файла ... и не загружать диск еще 12k файлами каждый день, когда я делаю инкрементное резервное копирование только 4-50 файлов.

Я достаточно хорошо знаю, как работает robocopy ... и я почти уверен, что большинство дизайнерских команд будет считать это "особенностью", а не "дефектом", поэтому просить MS разобраться с этим в большинстве случаев бессмысленно.

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

E:\>xcopy C:\Users\Public\* E:\C_Users\Public\ /D:6-1-2018 /S /B /C /H /J /K /O /Y 

Есть идеи или предложения?

Вот пример проблемы, обратите внимание, что созданная иерархия Adobe AppData пуста:

------------------------------------------------------------------------------- ROBOCOPY :: Robust File Copy for Windows  -------------------------------------------------------------------------------  Started : Fri Jun 01 03:42:50 2018  Source : C:\Users\Public\ Dest : E:\20180601_Users_C\Public\  Files : *.*  Options : *.* /S /COPY:DATSO /B /NP /XJ /REG /MAXAGE:1 /MT:16 /R:3 /W:1   New Dir 2 C:\Users\Public\.idlerc\ New Dir 0 C:\Users\Public\AppData\ New Dir 4 C:\Users\Public\AppData\Local\ New File 7603 Resmon.ResmonCfg 100%  New Dir 0 C:\Users\Public\AppData\Local\Adobe\ New Dir 0 C:\Users\Public\AppData\Local\Adobe\AAMUpdater\ New Dir 7 C:\Users\Public\AppData\Local\Adobe\AAMUpdater\1.0\ New Dir 1 C:\Users\Public\AppData\Local\Adobe\AAMUpdater\1.0\Data\   [...snip...]  ------------------------------------------------------------------------------  Total Copied Skipped Mismatch FAILED Extras Dirs : 11674 11674 0 0 0 0 Files : 443686 4 443682 0 0 0 Bytes : 1.789 t 53.26 m 1.789 t 0 0 0 Times : 0:00:40 0:00:09 0:00:00 0:00:05  Ended : Fri Jun 01 03:43:09 2018 =========== 
1

2 ответа на вопрос

1
Pimp Juice IT

Несколько вещей., ,

  1. Похоже, что вам нужно будет использовать /MIRпараметр вместо /Sпараметра, чтобы убедиться, что каталоги не будут скопированы в место назначения, когда они уже существуют там.
    • Использование этого /MIRпараметра будет означать, что пустые каталоги будут скопированы в место назначения, так что это компромисс, гарантирующий, что уже существующие каталоги не копируются снова при каждом запуске. Существует простой обходной путь для быстрого удаления пустых каталогов в месте назначения, что влечет за собой запуск Robocopy <dest> <dest> /S /MOVEнепосредственно после запуска команды с использованием /MIRпараметра.
  2. Если вы хотите опустить каталоги из вывода Robocopy, просто добавьте /NDLпараметр.

Robocopy Script

Robocopy "<Source>" "<Destination>" *.* /MIR /COPY:DATSO /B /NP /NDL /XJ /REG /MAXAGE:1 /MT:16 /R:3 /W:1 Robocopy <dest> <dest> /S /MOVE  

Важные заметки:

  • Использование /MIRпереключателя также будет означать, что файлы и папки в месте назначения, которые больше не существуют в источнике, будут удалены из места назначения

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

  • Команда Robocopy, Robocopy <dest> <dest> /S /MOVEкоторая удаляет пустые каталоги из пункта назначения, использует место назначения для ОБА источника и пункта назначения


Дополнительные ресурсы

  • Robocopy
  • Robocopy /?
    • /MIR :: MIRror a directory tree (equivalent to /E plus /PURGE). /MOVE :: MOVE files AND dirs (delete from source after copying). /NDL :: No Directory List - don't log directory names. 
Я бы хотел, чтобы RC обрабатывал папку без новых данных, переходя к следующей. Он пропускает все пустые папки (/ S), а затем копирует все папки, в которые он попадает, но не пустые. Это создает полное дерево в месте назначения. И когда это выполняется ежедневно для каждого пользователя, 12k x N пользователей сбрасываются в резервный массив. GWild 5 лет назад 0
Я посмотрю на вторую команду RC для очистки пустых папок ... которая может работать лучше, чем XCOPY, хотя XCOPY имеет преимущество в том, что она работает несколько лучше при обработке соединений. С RC я просто игнорировал их и то, на что они указывали. GWild 5 лет назад 1
0
GWild

Вот что я в итоге сделал (замените Public на ваше имя пользователя):

@echo off @rem - create decent date and filename strings for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) for /f "tokens=1-2 delims=: " %%a in ('time /t') do (set mytime=%%a%%b) set fname=E:\%mydate%_%mytime%_RClog_d.txt  @rem - copy newer files to a new timestamped tree robocopy C:\Users\Public\ E:\%mydate%_Users_C\Public\ /XJD /ZB /S /COPY:DATSO /R:3 /W:1 /MAXAGE:7 /NC /NDL /FP /LOG:%fname% /NP   @rem - and this removes the empty folders created by the command above robocopy E:\%mydate%_Users_C\Public\ E:\%mydate%_Users_C\Public\ /S /MOVE /NDL /LOG:NUL /NP  

И это то, что отображается на диске:

06/04/2018 01:00 PM 9,644,168 20180604_0241_RClog.txt 06/10/2018 02:34 AM 563,342 20180610_0230_RClog_d.txt 06/10/2018 02:30 AM <DIR> 20180610_Users_C 06/10/2018 02:30 AM <DIR> 20180610_Users_D 06/17/2018 02:30 AM 394,755 20180617_0230_RClog_d.txt 06/17/2018 02:30 AM <DIR> 20180617_Users_C 06/17/2018 02:30 AM <DIR> 20180617_Users_D 06/24/2018 02:30 AM 833,475 20180624_0230_RClog_d.txt 06/24/2018 02:30 AM <DIR> 20180624_Users_C 06/24/2018 02:30 AM <DIR> 20180624_Users_D 07/01/2018 02:31 AM 891,884 20180701_0230_RClog_d.txt 07/01/2018 02:30 AM <DIR> 20180701_Users_C 07/01/2018 02:31 AM <DIR> 20180701_Users_D 09/17/2017 01:09 AM <DIR> Users_C 06/04/2018 12:32 PM <DIR> Users_D