Robocopy: como mover o conteúdo de um diretório, mas MANTER o diretório

23

Tarefa simples:

Mova todo o conteúdo do diretório c:\Users\files\Desktop\test 2parac:\Users\files\Desktop\test 1

C:\admin\temp>robocopy "c:\Users\files\Desktop\test 2" "c:\Users\files\Desktop\test" *.* /S /MOVE

Parece razoável, mas agora o diretório também c:\Users\files\Desktop\test 2é removido. Existe uma opção para simplesmente mover o CONTEÚDO sem o próprio diretório de remoção?

perler
fonte
Por que o Robocopy precisa ser diferente do que?
John Gardeniers 06/08/10
1
O que sobre robocopy test1 test2 ... && mkdir test2
jftuga
Acabei alterando as permissões do diretório principal para que o robocopy do usuário estivesse em execução não pudesse excluir o diretório em si, #
Matthew Lock

Respostas:

14

Eu tenho tentado fazer o mesmo de um compartilhamento de rede.

SET MoveDirSource=\\Server\Folder
SET MoveDirDestination=Z:\Folder

Aqui estão minhas descobertas e soluções dos testes em uma máquina Windows 7.

Sugestão:

ROBOCOPY "%MoveDirSource%" "%MoveDirDestination%" /MOVE /E

Problema: Move a pasta de origem.

Sugestão:

ROBOCOPY "%MoveDirSource%" "%MoveDirDestination%" /MOVE /E /XD "%MoveDirSource%"

Problema: Ainda move a pasta de origem.

Sugestão:

ROBOCOPY "%MoveDirSource%" "%MoveDirDestination%" /MOV /E

Problema: Deixa a estrutura da pasta vazia para trás na pasta de origem.

Solução de trabalho:

MKDIR "%MoveDirDestination%"
FOR    %%i IN ("%MoveDirSource%\*") DO           MOVE /Y "%%i" "%MoveDirDestination%\%%~nxi"
FOR /D %%i IN ("%MoveDirSource%\*") DO ROBOCOPY /MOVE /E "%%i" "%MoveDirDestination%\%%~nxi"

As duas primeiras linhas movem os arquivos de nível superior; a terceira, as pastas. Observe que o %% duplo é para uso em um arquivo em lotes. A colagem em uma linha de comando precisa que estes sejam alterados para uma única marca de porcentagem.

~ nxi no destino é uma VARIÁVEL PARA SUBSTITUIÇÃO FOR (consulte FOR /?) em que ~ nxi representa o nome e a extensão do item que está sendo repetido no momento.

O padrão da robocópia é RETRY A Million times e WAIT 30 SECONDS entre cada tentativa, portanto, você pode adicionar / R: 1 / W: 1 aos argumentos da robocopy.

WhoIsRich
fonte
8

Você já tentou a opção / MOV?

           /MOV :: MOVe files (delete from source after copying).

F:> robocópia /?


ROBOCOPY :: Cópia de arquivo robusta para Windows

Início: Fri Aug 06 11:51:26 2010

          Usage :: ROBOCOPY source destination [file [file]...] [options]

         source :: Source Directory (drive:\path or \\server\share\path).
    destination :: Destination Dir  (drive:\path or \\server\share\path).
           file :: File(s) to copy  (names/wildcards: default is "*.*").

::
:: Copy options :
::
             /S :: copy Subdirectories, but not empty ones.
             /E :: copy subdirectories, including Empty ones.
         /LEV:n :: only copy the top n LEVels of the source directory tree.

             /Z :: copy files in restartable mode.
             /B :: copy files in Backup mode.
            /ZB :: use restartable mode; if access denied use Backup mode.
        /EFSRAW :: copy all encrypted files in EFS RAW mode.

/COPY:copyflag[s] :: what to COPY for files (default is /COPY:DAT).
                   (copyflags : D=Data, A=Attributes, T=Timestamps).
                   (S=Security=NTFS ACLs, O=Owner info, U=aUditing info).

       /DCOPY:T :: COPY Directory Timestamps.

           /SEC :: copy files with SECurity (equivalent to /COPY:DATS).
       /COPYALL :: COPY ALL file info (equivalent to /COPY:DATSOU).
        /NOCOPY :: COPY NO file info (useful with /PURGE).

        /SECFIX :: FIX file SECurity on all files, even skipped files.
        /TIMFIX :: FIX file TIMes on all files, even skipped files.

         /PURGE :: delete dest files/dirs that no longer exist in source.
           /MIR :: MIRror a directory tree (equivalent to /E plus /PURGE).

           /MOV :: MOVe files (delete from source after copying).
          /MOVE :: MOVE files AND dirs (delete from source after copying).

 /A+:[RASHCNET] :: add the given Attributes to copied files.
 /A-:[RASHCNET] :: remove the given Attributes from copied files.

        /CREATE :: CREATE directory tree and zero-length files only.
           /FAT :: create destination files using 8.3 FAT file names only.
           /256 :: turn off very long path (> 256 characters) support.

         /MON:n :: MONitor source; run again when more than n changes seen.
         /MOT:m :: MOnitor source; run again in m minutes Time, if changed.

  /RH:hhmm-hhmm :: Run Hours - times when new copies may be started.
            /PF :: check run hours on a Per File (not per pass) basis.

         /IPG:n :: Inter-Packet Gap (ms), to free bandwidth on slow lines.

            /SL :: copy symbolic links versus the target.

        /MT[:n] :: Do multi-threaded copies with n threads (default 8).
                   n must be at least 1 and not greater than 128.
                   This option is incompatible with the /IPG and /EFSRAW options.
                   Redirect output using /LOG option for better performance.

::
:: File Selection Options :
::
             /A :: copy only files with the Archive attribute set.
             /M :: copy only files with the Archive attribute and reset it.
/IA:[RASHCNETO] :: Include only files with any of the given Attributes set.
/XA:[RASHCNETO] :: eXclude files with any of the given Attributes set.

/XF file [file]... :: eXclude Files matching given names/paths/wildcards.
/XD dirs [dirs]... :: eXclude Directories matching given names/paths.

            /XC :: eXclude Changed files.
            /XN :: eXclude Newer files.
            /XO :: eXclude Older files.
            /XX :: eXclude eXtra files and directories.
            /XL :: eXclude Lonely files and directories.
            /IS :: Include Same files.
            /IT :: Include Tweaked files.

         /MAX:n :: MAXimum file size - exclude files bigger than n bytes.
         /MIN:n :: MINimum file size - exclude files smaller than n bytes.

      /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date.
      /MINAGE:n :: MINimum file AGE - exclude files newer than n days/date.
      /MAXLAD:n :: MAXimum Last Access Date - exclude files unused since n.
      /MINLAD:n :: MINimum Last Access Date - exclude files used since n.
                   (If n < 1900 then n = n days, else n = YYYYMMDD date).

            /XJ :: eXclude Junction points. (normally included by default).

           /FFT :: assume FAT File Times (2-second granularity).
           /DST :: compensate for one-hour DST time differences.

           /XJD :: eXclude Junction points for Directories.
           /XJF :: eXclude Junction points for Files.

::
:: Retry Options :
::
           /R:n :: number of Retries on failed copies: default 1 million.
           /W:n :: Wait time between retries: default is 30 seconds.

           /REG :: Save /R:n and /W:n in the Registry as default settings.

           /TBD :: wait for sharenames To Be Defined (retry error 67).

::
:: Logging Options :
::
             /L :: List only - don't copy, timestamp or delete any files.
             /X :: report all eXtra files, not just those selected.
             /V :: produce Verbose output, showing skipped files.
            /TS :: include source file Time Stamps in the output.
            /FP :: include Full Pathname of files in the output.
         /BYTES :: Print sizes as bytes.

            /NS :: No Size - don't log file sizes.
            /NC :: No Class - don't log file classes.
           /NFL :: No File List - don't log file names.
           /NDL :: No Directory List - don't log directory names.

            /NP :: No Progress - don't display percentage copied.
           /ETA :: show Estimated Time of Arrival of copied files.

      /LOG:file :: output status to LOG file (overwrite existing log).
     /LOG+:file :: output status to LOG file (append to existing log).

   /UNILOG:file :: output status to LOG file as UNICODE (overwrite existing log).
  /UNILOG+:file :: output status to LOG file as UNICODE (append to existing log).

           /TEE :: output to console window, as well as the log file.

           /NJH :: No Job Header.
           /NJS :: No Job Summary.

       /UNICODE :: output status as UNICODE.

::
:: Job Options :
::
   /JOB:jobname :: take parameters from the named JOB file.
  /SAVE:jobname :: SAVE parameters to the named job file
          /QUIT :: QUIT after processing command line (to view parameters).
          /NOSD :: NO Source Directory is specified.
          /NODD :: NO Destination Directory is specified.
            /IF :: Include the following Files.
Cara
fonte
2
sim, mas isso move apenas os arquivos e deixar os diretórios intocado, i deseja mover os arquivos e os diretórios, mas manter o próprio diretório pai no lugar
perler
1
-1 resposta não aborda a pergunta
Chris Marisic
1
@Chris. Um pouco duro, parece. A resposta era válida, além do requisito "diretório pai", e solicitei esclarecimentos que só estavam disponíveis depois que eu postei a resposta. Usando minha resposta, você pode usar o parâmetro / XD ou / XA.
Guy
2
Esta é realmente a resposta perfeita para esta pergunta. Use robocopy com a opção "/ mov" (não a opção "/ move") e direcione o diretório pai. Voila !!
John Homer
1
Esta não é a resposta perfeita. A opção mov não moverá subdiretórios. / mov / e moverá arquivos, mas copiará subdiretórios. Se você quiser manter somente o diretório pai, você deve remover os subdiretórios vazios manualmente, ou usar uma das outras respostas que o trabalho
HugoRune
6

Você pode fazer isso criando um arquivo de espaço reservado no diretório que não deseja excluir e instruindo a robocopy a excluir o arquivo usando / XF

Como o arquivo é excluído, ele não será movido e o diretório não será excluído.

Para obter detalhes, consulte esse outro site: http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/XP/Q_24306678.html (e role para baixo até o final, etc, etc).

RedGreenCode
fonte
1
Não parece ser esse o caso, eu tenho o próprio arquivo bat no diretório que quero copiar, o arquivo bat é excluído e o robocopy ainda tenta excluir a pasta (e falha porque o arquivo bat está sendo executado).
Chris Marisic 3/02
@ Chris-Marisic: Tente executar o arquivo em lotes de fora do diretório em que está localizado. Se você fizer um cd no diretório que contém o arquivo em lotes e executá-lo a partir daí, você verá "O processo não pode acessar o arquivo porque está sendo usado por outro processo", mesmo se você usar / XF para excluir o arquivo em lotes.
RedGreenCode
4

Corri para o mesmo problema e apenas o corrigi com o MKDIRcomando depois de executar o robocopy.

Você deseja mover todo o conteúdo de uma determinada pasta, para que APENAS as pastas pai sejam deixadas para trás. Bem, por que não criar a pasta pai novamente?

Claro que você pode ter alguns problemas de direitos do usuário, mas isso também pode ser resolvido.

Henrik F
fonte
2

Crie um arquivo de espaço reservado exclusivo que você exclua do comando robocopy.

Um revestimento é o seguinte:

echo.>>"C:\Source\.touch" && (robocopy "C:\Source" "C:\Dest" /XF ".touch" /MOVE /E & del "C:\Source\.touch")
SuperFisch
fonte
1

Use a opção / mov em vez de / move

Al Sam
fonte
2
Foi sugerido antes ( serverfault.com/questions/167723/… ) e não funcionou.
sysadmin1138
2
Funciona. Eu estou fazendo isso agora !!!! Que arrogância da sua parte dizer que não funciona sem realmente "tentar" !!!
John Homer
2
Não funciona. / mov deixará os subdiretórios no lugar, não apenas o diretório pai.
HugoRune 5/10/12
1

A solução "Meu" é mover arquivos e pastas para dentro de uma pasta temporária na pasta de origem. (não copie a pasta temporária para ela própria!) E depois mova esta para a pasta taget.

set Source=I:\_Test\ToArchive
set target=I:\_Test\Archive
set tempFolderName=@_Copy_in_progress_Do_not_use_@
set LogFile=robocopy-result.log

robocopy.exe %source% %source%\%tempFolderName% /E /MOVE /NS /NP /v /W:0 /R:0 /LOG:%LogFile% /XD %source%\%tempFolderName%
sleep 5
robocopy.exe %source%\%tempFolderName% %target% /E /MOVE /NS /NP /v /W:0 /R:0 /LOG+:%LogFile%

Acabei de detectar que a "mudança" para a pasta temporária leva muito tempo. Aqui a atualização:

set Source=I:\_Test\ToArchive
set target=I:\_Test\Archive
set tempFolderName=@_Copy_in_progress_Do_not_use_@
set LogFile=robocopy-result.log

mkdir %source%\%tempFolderName%\
for /f "delims==" %%I IN ('dir "%source%" /B') do if NOT %%I==%tempFolderName% (move "%source%\%%I" "%source%\%tempFolderName%")
sleep 3
robocopy.exe %source%\%tempFolderName% %target% /E /MOVE /NS /NP /v /W:0 /R:0 /LOG:%LogFile%
dm101
fonte
1

Tive sorte em encontrar a resposta. Eu queria mover uma pasta para o nível superior de um disco. Eu tentei:

Robocopy "<PathToFolderToMove>" "H:\" /MOVE /E

Ele deu um erro usando o seguinte para o destino: H:\" \MOVE \E\.

Imaginei que o "\" estava escapando da seguinte aspas duplas e alterei o comando para:

Robocopy "<PathToFolderToMove>" "H:\." /MOVE /E

Acabou copiando o conteúdo de "" para a raiz da unidade.

Portanto, a resposta à pergunta é:

Robocopy "c:\Users\files\Desktop\test 2" "c:\Users\files\Desktop\test\." /MOVE /E

Atenciosamente,
Georges

Georges Z
fonte
1

Acabei de realizar um teste usando as opções /mov& /e, e ele funciona perfeitamente.

Observando nas opções da linha de comando, há uma diferença entre /move /move. O arquivo de teste foi movido para o destino, deixando intacta a estrutura de diretórios na origem.

KNetChris
fonte
-1

Porque é diferente? Não é diferente. Uma operação de movimentação é uma operação de copiar \ excluir, independentemente de você usar Robocopy ou não. Você está dizendo para mover a pasta. Mover significa mover para o novo local e desocupar o local anterior.

joeqwerty
fonte
mas não é isso que eu quero. Eu quero mover o conteúdo da pasta, mantendo a pasta. aqui como ele funciona, estilo unix: (edit, nenhum código nos comentários, então como uma imagem) screencast.com/t/YTkwODIzZT
perler
-1 por culpa da resposta do utilizador para causa legítima
Chris Marisic
@ Chris: Eu não entendo. Como estou culpando o usuário? Ele fez uma pergunta e eu respondi. Não vejo um pingo de culpa na minha resposta.
31411 johqwerty
Why is it different? It's not different.o OP publicou uma captura de tela mostrando o comportamento esperado, como poderia ser feito por meio do * nix, mas essa robocópia não parece permitir em nenhum aspecto.
Chris Marisic
Vamos lá pessoal, sério? Discutindo sobre isso? Limpei a pergunta para remover a frase "ofensiva" (e carregada).
Mark Henderson
-1

basta adicionar \ *

C:\admin\temp>robocopy "c:\Users\files\Desktop\test 2\*" "c:\Users\files\Desktop\test"  /S /MOVE
Tagas
fonte
2
Uma boa resposta é aquela com mais explicações que são fornecidas aqui.
kasperd
funciona perfeitamente bem e faz exatamente o que a op queria. Também é bastante auto-explicativo. (barra invertida de alguma forma, porém)
Tagas 14/07/2015
1
@ Tagas: Mesmo que funcione bem, você realmente deve adicionar uma explicação.
Sven