Como preservar atributos de arquivo quando se copia arquivos no Windows?

41

No Linux, podemos simplesmente fazer:

cp -pr directory

Como fazer isso no Windows? Isso pode ser feito no Windows Explorer? Alguma sugestão de ferramenta GUI?

Seria melhor se eu pudesse manter as permissões NTFS e o tempo de criação / modificação / acesso. No mínimo, preciso preservar a data de modificação dos arquivos e dos diretórios. A cópia do Windows Explorer não preserva a data de modificação dos diretórios.

netvope
fonte
1
Eu não acho que é uma duplicata. O tempo de criação do arquivo é apenas um dos atributos do arquivo.
Netvope 28/05
As respostas nessa pergunta fornecem software que preserva todos os carimbos de data e hora, mtime, ctime e atime.
John T
Isso pode ser de seu interesse: support.microsoft.com/kb/310316 . Infelizmente, algumas dessas chaves do Registro não funcionam mais no Vista e para cima.
Amro
robocopy c:\folderA c:\folderB /mir /ité tudo o que você precisa. Observe que isso excluirá completamente c: \ folderB e criará uma nova c: \ folderB que espelha c: \ folderA.
Pacerier

Respostas:

6

Não há uma maneira simples de fazer isso no Windows. Existem vários programas que afirmam poder preservar as datas de criação dos arquivos.
Aqui estão alguns programas que podem fazer o truque http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (link quebrado; não na Wayback Machine).

Usando apenas o Windows Explorer não é possível. Se você olhar a documentação para a função CopyFile, CopyFile (winbase.h) , verá que ela evita o assunto. Mas a  função CopyFile (Windows Developer Preview) (um arquivo de 2012 da mesma URL) diz:

Semântica de tempos de arquivo

Este artigo deve documentar a semântica com relação aos tempos de criação / modificação / acesso ao arquivo.

Hora de criação: se o arquivo de destino já existir, seu 'horário de criação será preservado ; caso contrário, será definido como o horário atual do sistema.
Hora da última modificação: sempre copiada da hora da modificação do arquivo de origem.
Hora do último acesso: sempre definida para a hora atual do sistema.

Daisetsu
fonte
Link quebrado.
Smile4ever
21

O RoboCopy pode preservar o mtime para diretórios com a opção / DCOPY: T, mas isso funciona apenas no Vista e em versões mais recentes. Também pode preservar ACLs. Como alternativa, o FastCopy pode ser configurado para preservar mtimes de diretório, ACLs e ADSes .

afrazier
fonte
No Windows, a robocópia é a maneira recomendada de fazer isso, pois não apenas copia os atributos de arquivo / pasta, mas também permite a integridade adequada do arquivo e o tratamento de erros durante todo o processo de cópia.
megamorf
@megamorf: De que maneira a robocópia faz algo especial? Ele não faz nenhuma soma de verificação ou hash dos dados, depende do sistema operacional para relatar erros como quase qualquer outro programa.
afrazier
Concordo que, a partir de agora, a robocopy não possui nenhum recurso de comparação de soma de verificação pré-pós. Mas, em geral, a robocopy retransmitirá o arquivo inteiro quando ocorrer um erro. Se você deseja continuar gravando o restante de um arquivo no destino após a ocorrência de um erro sem transmitir o arquivo inteiro novamente, especifique a opção / Z.
megamorf
@afrazier, Por que não usar simplesmente /mir?
Pacerier
2
@ Pacerier, porque a pergunta não é sobre espelhar uma árvore, é sobre copiar arquivos e pastas e preservar o máximo de metadados possível. Além de /mirremover os dados da pasta de destino, você ainda precisava /dcopy:tpreservar o diretório mtimes e /copyallpreservar mais do que apenas os registros de data e hora do arquivo.
afrazier
19

... ou você pode simplesmente criar um arquivo zip (com o método de compactação definido como apenas "Store") e depois descompactar os arquivos onde deseja copiá-los. Os atributos de data / hora são iguais aos arquivos originais.

Bicho da seda
fonte
Idéia legal. Mas isso copia "as outras coisas", como propriedades de arquivo e etc etc?
Pacerier
2
Isso nem sempre funciona. Com o 7-zip, por exemplo, o uso da compactação 7zip não preserva um dos horários dos arquivos (eu esqueço quais). Ele não preserva nenhum tempo de diretório (se bem me lembro). Com o ZIP, você pode preservar os tempos criados e modificados, mas o 7zip mantém apenas algumas vezes, dependendo de como você descompacta: se você arrasta e solta ou extrai no menu do programa . Teste bem, jovem gafanhoto.
Jon
3
Muito obrigado, isso funcionou bem para mim. Usei o 7zip, no formato ZIP (a data de criação não é preservada no formato 7Z).
AFract
Você poderia adicionar o comando específico que usaria para fazer isso? Um exemplo do comando específico para usar o método de compactação que você sugeriu? Isso tornaria a resposta mais completa ", em vez de mais sugestões ou comentários. Isso também evitaria que inúmeras pessoas precisassem fazer uma pesquisa para descobrir como realizar sua sugestão. Além disso, como bônus, um link para docs ou um artigo com mais informações sobre este método seria fantástico fornecendo toda a informação salva todo mundo de reinventar a (pesquisa) roda, e pode aumentar drasticamente upvotes Nós obrigado..!
SherylHohman
6

Ferramenta de linha de comando Robocopy (vem com a maioria das versões do windows)
Na minha máquina com Windows 10, ele está localizado emC:\Windows\System32

Na Wikipedia , ele pode ser usado com o seguinte conjunto de opções para preservar registros de data e hora de arquivos e diretórios, além de outros atributos:

Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPYALL /E /R:0

  • /DCOPY:Tpreservar os carimbos de data / hora dos diretórios originais (requer a versão XP026 ou posterior)
  • /E: Copie diretórios recursivamente, incluindo diretórios vazios
  • /R:0: não tente novamente os arquivos bloqueados (o número padrão de tentativas em cópias com falha é de 1 milhão),

  • /COPYALL: Copie todas as informações do arquivo
    (equivalente a /COPY:DATSOU, em que

    • D= Dados,
    • A= Atributos,
    • T= Data e hora do arquivo ,
    • S= Segurança = ACLs NTFS,
    • O= Informações do proprietário,
    • U= Informações de auditoria),

Se você deseja preservar apenas os carimbos de data e hora do diretório, mas não deseja copiar subdiretórios vazios e não deseja que outros atributos sejam preservados, você pode usar:
Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPY:T /S

onde /Scopia subdiretórios não vazios

Para ver a sintaxe completa, digite robocopy /?em um prompt de comando ou veja estas postagens no blog: https://ss64.com/nt/robocopy.html e https://techjourney.net/robocopy-syntax-command-line -switches-and-examples /

Um exemplo de comando que executei recentemente:
Robocopy D:\ C:\D_backup /DCOPY:T /COPYALL /E /R:0 /ZB /ETA /TEE /V /FP /XD D:\$RECYCLE.BIN /XD "D:\System Volume Information" /LOG:C:\D_backup_robocopy.LOG /MIR

Observe como a exclusão de 2 subdiretórios exige que o /XDsinalizador seja usado duas vezes. Além disso, a segunda exclusão de diretório usa aspas porque existem espaços no nome do diretório.

Por fim, você pode adicionar o /Lsinalizador para testar o comando antes de realizá-lo. Dessa forma, você pode verificar se ele não copiará (ou removerá) nenhum diretório / arquivo que você não deseja e que não há erros no seu comando.

Edit: gotcha ao copiar de um diretório raiz (também conhecido como unidade) para uma pasta (diretório não raiz)

Depois de executar o comando de exemplo acima, o diretório não estava visível! (Mesmo que show hidden filese show system filesforam verificadas em Windows 10!) O seguinte comando como por https://serverfault.com/a/455029/399723 fixo isto:

attrib -h -s C:\D_backup

Como alternativa, adicionar a opção /A-:SH"desativa o atributo oculto dos arquivos do sistema" pode impedir que o diretório fique oculto em primeiro lugar, conforme https://serverfault.com/a/565804/399723 . Consulte também https://ss64.com/nt/robocopy.html .
Essa discussão lança mais luz sobre essa opção como solução.

Robocopy D:\ C:\D_backup /A-:SH /DCOPY:T /COPYALL /E /R:0 /ZB /ETA /TEE /V /FP /XD D:\$RECYCLE.BIN /XD "D:\System Volume Information" /LOG:C:\D_backup_robocopy.LOG /MIR

Outro software:

Como alternativa, você pode baixar uma versão GUI do robocopy, se não desejar usar a linha de comando.

Outro utilitário do Windows é o XCopy , embora esteja incluído no Windows 10, está sendo preterido. Veja o link para dicas.

A página da Wikipedia para RoboCopy (vinculada no início desta postagem) lista outros softwares que podem ser usados.

SherylHohman
fonte
1
Boa resposta. Deve ser o escolhido, pois o primeiro está meio desatualizado. Utilizada robocopy desde o Windows 7 para aparar diretórios vazios dos backups do cliente, no entanto, acho que estava disponível desde o Windows XP
DGoiko
@DGoiko Acho que você está certo. Eu usei extensivamente com o Windows 7, com certeza. Infelizmente, a compra de laptops especiais com Windows 7 Pro não é mais uma opção. Então agora eu tenho o Win 10. Acho que nunca pareci quando tinha XP, mas já faz muito tempo. Apenas não é tão conhecido.
SherylHohman 28/03
A GUI do Robocopy é excelente.
Eddie Kumar
4

Sincronize! 3.5 mantém todos os registros de data e hora (arquivos e pastas, modificação e criação). É o único software que conheço no Windows XP que faz isso perfeitamente, além do Robocopy, e já tentei muitos. Cuidado, porém, ele pode produzir arquivos corrompidos com arquivos de origem baixados usando software como FlashGet ou Orbit Downloader (os arquivos resultantes têm o mesmo tamanho, mas apenas 25kB são realmente copiados - o restante é preenchido com zeros). Perguntei ao criador do software se ele poderia descobrir o porquê, mas ele não tinha ideia; Eu acho que isso tem a ver com o download de arquivos em pacotes pequenos (com o objetivo de otimizar a velocidade) e com a partição de dados muito fragmentada.

O Robocopy XP026 está realmente incluído no Windows Vista, mas funciona no Windows XP. Pesquise "Robocopy XP026" ou posso enviar o arquivo aqui, pois não é muito fácil de encontrar. Ou você pode instalar a GUI do Robocopy e procurar o robocopy.exearquivo na pasta System32, para usá-lo na linha de comando. O arquivo que tenho é 208kB e o número da versão é 5.1.2600.26.

Parece haver um bug no "modo de backup", no entanto:

http://msmvps.com/blogs/martinzugec/archive/2008/03/03/ugly-bug-in-robocopy-ignoring-security-on-file-level.aspx

A versão XP027 da Robocopy aparentemente não possui mais esse bug, mas não funciona no Windows XP.

Gabriel
fonte
Os utilitários de download de arquivos (como o Bittorrent) alocam o tamanho total do arquivo no disco (preenchido com 0) e fazem download de seções de várias fontes, armazenando-as no lugar certo no arquivo. Os arquivos quando iniciados terão muitos 0000. O arquivo nunca foi completamente baixado ou o Sincronize! viu muitas 0000 e desistiu da cópia.
Chloe
Obrigado! Eu usei o Synchronize It! É tão rápido também! O SyncToy e o Unison estavam atrapalhando os tempos de modificação do arquivo. O Unison estava corrompendo os links simbólicos do Cygwin. O SyncToy estava até copiando 'My Music', o que acabou por estar em uma junção no destino, mas quando eu atualizei, ele continuou querendo copiar novamente, mesmo que tudo estivesse igual!
Chloe
3

O RoboCopy deve ser capaz de fazê-lo com a opção COPYALL. Você pode pegar a versão da GUI do Microsoft Technet .

Russ Warren
fonte
1
xcopy *.* C:\temp\Pics /c /d /e /h /i /k /q /r /s /x /y

Não tenho certeza de qual opção mantém a data do arquivo, mas isso funciona. Depois, fecho o diretório C: \ temp \ Pics, que também mantém as datas dos arquivos, conforme mencionado anteriormente.

dmaier
fonte
1
Como o zip da cópia se encaixa nessa discussão?
19413 Scott
Cabe também manter registros de data e hora para os arquivos compactados, algo que parece ocupar a pessoa que fez a pergunta. De nada, Scott. Isso resulta em uma resposta útil, se não a correta.
01
Isso preserva a data / hora do arquivo, mas não a pasta.
barneco
1

A maneira mais simples para mim, até agora, é o método "enviar para". Ele não precisa de aplicativos externos. Na minha experiência, ele mantém todos os atributos do arquivo original.

O método que eu usei antes, era o método de pasta de compressão / zip. Embora isso certamente leve mais tempo, já que os arquivos não são apenas copiados, mas processados ​​e compactados, ao compactar e descompactar.

%appdata%\Microsoft\Windows\SendTo
ou. C:\Users\_______\AppData\Roaming\Microsoft\Windows\SendTo

Adicione um atalho à pasta em que deseja copiá-los e o item aparecerá no seu sendtomenu quando você clicar com o botão direito do mouse no arquivo que deseja copiar.

tspmtel
fonte
Obrigado por compartilhar o truque de usar "Clique com o botão direito> Enviar para". Funciona, exceto a data de criação. Anteriormente, eu estava usando o comando nativa xcopy: xcopy Source Destination /kes. (O ksinalizador permite preservar o carimbo de data / hora da modificação, mas a data de criação não é preservada). O método de compactação para compactar (ou rar) é um bom método, mas geralmente leva muito tempo.
OuzoPower
0

É simples mover pastas e diretórios e ainda preservar a data de criação. Apenas segure Shifte arraste a pasta para o novo local (comando move). A data de modificação será a data atual, mas a data de criação manterá a data original.

Davidus428
fonte
2
NÃO FAÇA ISSO! Isso exclui os arquivos da pasta original. Acabei de perder dados irrecuperáveis ​​do meu telefone tentando fazer isso (nenhum CTRL + Z não funciona).
21317 BadAtPHP
0

O xcopy funciona bem para isso. Basta especificar o sinalizador / k para copiar atributos.

Sintaxe
xcopy Origem [Destino] [Parâmetros opcionais]

O comando xcopy pode copiar um ou mais arquivos ou árvores de diretório de um local para outro. O comando xcopy está incluído em todas as versões do Windows, do Windows 95 ao Windows 8.

Chris
fonte
1
Eu apenas tentei o /Kparâmetro e ele não preservou as datas de criação.
CoDEmanX 4/16/16
Parece-me como ele funciona, por vezes, e às vezes does not - janelas no seu melhor;)
Sebastianh
0

Eu alcanço isso com

rsync -avu --modify-window = 3602 diretório_de origem / diretório_de_domínio /

(isso é realmente usado como uma ferramenta de sincronização de um diretório para outro espelho e a opção de janela de tempo é evitar problemas quando os sistemas Windows movem os relógios 1 hora para o horário de verão etc. em comparação com os sistemas Linux)

no ambiente cygwin dentro do windows ou em uma máquina virtual linux dentro do windows com unidades windows montadas (por exemplo, com o virtualbox)

O cygwin e o virtualbox são gratuitos e permitem que você tenha, em menor ou maior grau, a funcionalidade linux no Windows - ambos exigem um pouco de configuração - particularmente o virtualbox, mas têm muitos benefícios.

Meu próprio problema era que os arquivos tinham a hora correta, mas os diretórios não. O rsync classificou as datas nos diretórios e as datas nos arquivos.

tom
fonte
0

Este comando copia o mesmo registro de data e hora para arquivos. Observe que não faz exatamente o mesmo tempo de carimbo para as próprias pastas. Observe também que coloquei aspas em torno da origem (Temp1) e do destino (Temp2). Isso é feito caso haja espaços nos caminhos. Não tenho espaços, mas achei que deveria incluí-lo nos piores cenários.

robocopy /E /copy:DAT "C:\Temp1" "c:\Temp2"

Para manter os timestamps iguais para as pastas:

robocopy / E / cópia: DAT / dcopy: DAT "C: \ Temp1" "c: \ Temp2"

Pablo
fonte