Robocopy / S cria pastas vazias

1

Ok - estou tentando impedir que o robocopy crie pastas vazias quando estiver copiando. As pastas SOURCE não estão vazias; mas eles também não têm novos arquivos para copiar. No entanto, o robocopy cria-os no destino.

Meu objetivo é criar uma cópia dos arquivos com 1 dia de duração. Mas eu gostaria de evitar ver 11.674 novas pastas e entradas no log quando apenas 4 arquivos foram copiados ... e não conectar o disco com outros arquivos 12k todos os dias. Eu faço um backup incremental de apenas 4 a 50 arquivos. / p>

Eu sei muito bem como o robocopy funciona ... e tenho certeza de que isso seria considerado um 'recurso' pela maioria das equipes de projeto, em vez de um 'defeito', então pedir a MS para investigá-lo é inútil.

Uma solução alternativa é usar o XCOPY da seguinte forma, mas é necessário calcular e formatar uma data legal:

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

Alguma ideia ou sugestão?

Veja um exemplo do problema, observe que a hierarquia criada do Adobe AppData está vazia:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Fri Jun 01 03:42:50 2018

   Source : C:\Users\Public\
    Dest : E:180601_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.0\
      New Dir          1    C:\Users\Public\AppData\Local\Adobe\AAMUpdater.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
===========
    
por GWild 01.06.2018 / 12:15

2 respostas

0

Veja o que acabei fazendo (substitua Public por seu nome de usuário):

@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 

E isso é o que aparece no disco:

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
    
por 06.07.2018 / 04:15
1

Algumas coisas. . .

  1. Parece que você precisará usar o parâmetro /MIR no lugar do parâmetro /S para garantir que os diretórios não sejam copiados para o destino depois que já existirem.
    • O uso do parâmetro /MIR significará que os diretórios vazios serão copiados para o local de destino, portanto, essa é a compensação para garantir que os diretórios já existentes não sejam copiados novamente para cada execução. Há uma solução simples para remover rapidamente os diretórios vazios no local de destino, o que implica a execução de Robocopy <dest> <dest> /S /MOVE diretamente após o comando, usando o parâmetro /MIR executado.
  2. Se você quiser omitir diretórios da saída Robocopy , basta adicionar o parâmetro /NDL .

Script de Robocopy

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

Important Notes:

  • Using the /MIR switch will also mean that files and folder in the destination that no longer exist in the source will be purged from the destination

  • Copying over empty directories per script run versus copying over that same thousands of directories per script run to destination that already exist in destination seems like a small price to pay and since those can easily and quickly be removed this seems like a no-brainer

  • The Robocopy command of Robocopy <dest> <dest> /S /MOVE which deletes the empty directories from the destination uses the destination location for BOTH source and destination

Mais recursos

  • Robocopy
  • %código%
    • /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.
      
por 01.06.2018 / 15:20