Como posso (no Mac / Unix / Linux / scripting) recursivamente copiar um diretório para outro e substituir apenas os arquivos que não foram alterados?

2

Plano de fundo e problema

Eu mudei para o Mac OS X recentemente e esbarrei no "recurso" do Mac em que copiar arquivos de uma unidade externa redefine a data / data / modificação do arquivo para a data atual (que não é o Windows), causando um desastre meus mais de 10 anos de arquivos de trabalho de backup em que a data é importante.

Então, antes de aprender como evitar isso (por exemplo, usando o sinalizador -p "preserve" no comando "cp" copy), eu adicionei muitos arquivos no meu novo disco rígido do Mac, além de atualizar os arquivos já existentes. arquivos antigos.

Estado atual

  • Eu tenho um disco rígido externo de backup com todos os meus dados antigos e datas de modificação adequadas
  • Eu tenho um disco rígido do Mac com datas de redefinição do arquivo de modificação (um único ou dois dias em particular)
  • O disco rígido do Mac possui todos os conteúdos de arquivos "true" e "current" com arquivos modificados e adicionados

O que eu preciso

Eu preciso

  • Copie todos os arquivos originais do disco rígido externo, preservando os metadados do arquivo (realmente apenas a data modificada), mas APENAS substituindo o novo disco rígido interno do Mac.
    • O conteúdo do arquivo (md5 ou qualquer outro) é o mesmo OR
    • O arquivo foi atualizado após o dia (que, é claro, eu posso ver em todos os arquivos) no qual a falha desastrosa original foi executada (o que significa que o arquivo é novo ou modificado)
  • Assegure-se de que a cópia deixe todos os arquivos novos e modificados completamente intactos no disco rígido interno do Mac.
  • "Nenhuma solicitação / interrupção da cópia de qualquer tipo (ou seja, não detalhada) é necessária, mas é o.k."
  • "Cópia recursiva - obviamente, gostaria de copiar todas as pastas e subpastas de arquivos * encontradas na exportação"

Como isso pode ser feito, alguma idéia?

Eu li tudo o que pude no Stack Overflow e verifiquei as páginas do manual e as informações sobre "rsync" e "cp", mas não consigo encontrar uma maneira ...

Alguém tem boas ferramentas, scripts, truques, ideias?

    
por Daniel Iversen 25.04.2011 / 10:09

1 resposta

1

Acabou de escrever um programa em java para fazer isso ... Não vai postar o código aqui porque é rápido, sujo e espaguete;) ... É robusto, no entanto, e você pode baixar o código-fonte simples de www.nexle.dk/permanent-downloads/StackExchange/FileModChanger.java.zip para usar modificar, compilar e usar livremente (mas sem garantia, verifique e teste antes de executar).

O que a ferramenta faz essencialmente é que ela pega as últimas datas modificadas dos arquivos em uma estrutura de pastas e a aplica a arquivos em outra pasta, desde que;

  • os nomes e caminhos dos arquivos são os mesmos (segurança)
  • o conteúdo do arquivo é o mesmo (verificação md5, novamente por segurança)
  • a data ainda não é a mesma para os dois arquivos

Corri contra ~ 500.000 arquivos e pareceu funcionar o.k.

Algumas notas;

  • apenas altera a data / hora / data / hora da última modificação, pelo que deve ser seguro
  • a ferramenta é padrão no modo "execução a seco", o que significa que ela mostrará o que ela faria, mas não executará alterações (o modo 'real' é ativado por um argumento de linha de comando 'real)
  • Ele usa algum código da web (crédito dentro do arquivo de origem).
  • Poderia ser mais rápido, mas rápido o suficiente
  • Tem um pequeno indicador de progresso ao analisar todos os diretórios de arquivos pela primeira vez;)

Algum código para o qual você pode se inspirar também se você quiser navegar pelo código inteiro;

Como alterar a data de modificação do arquivo em Java;

    File sourceFile = new File("/tmp/sourcefile");      
    File targetFile = new File("/tmp/targetfile");

    long sourceDateModified = sourceFile.lastModified();

    targetFile.setLastModified(sourceDateModified);

Espero que alguém consiga achar útil também. Obrigado por todos os comentários e sugestões.

Uso e saída do console para a ferramenta finalizada que você pode baixar (veja acima);

$ java -classpath . FileModChanger 

USAGE (dry run, NO file changes made):
  FileModChanger <source folder with  original dates> <target folder with new/erased dates>

USAGE (real run,file date changes WILL be made):
  FileModChanger <source folder with  original dates> <target folder with new/erased dates> real





$ java -classpath . FileModChanger /Volumes/Untitled/D/knowledge/ISYS\ Desktop\ 6/ /Knowledge/ISYS\ Desktop\ 6/
Starting DRY run....
Starting DRY run....
Starting DRY run....
Starting to retrieve list of files (this may take a LONG time)...
0 folders processed 
DONE creating the list of files, starting comparison...



About to operate on Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe:
 SRC:Tue Jul 01 11:29:46 EST 2003 - bff684bfac4ed37e4a6b9a05ab625855 - Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe
 TRG:Tue Dec 21 04:05:24 EST 2010 - bff684bfac4ed37e4a6b9a05ab625855 - /Knowledge/ISYS Desktop 6/ISYSDesktop6Setup.exe


DONE processing all files..










$ java -classpath . FileModChanger /Volumes/Untitled/D/knowledge/ISYS\ Desktop\ 6/ /Knowledge/ISYS\ Desktop\ 6/ real
Starting REAL run....
Starting REAL run....
Starting REAL run....
Starting to retrieve list of files (this may take a LONG time)...
0 folders processed 
DONE creating the list of files, starting comparison...



About to operate on Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe:
 SRC:Tue Jul 01 11:29:46 EST 2003 - bff684bfac4ed37e4a6b9a05ab625855 - Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe
 TRG:Tue Dec 21 04:05:24 EST 2010 - bff684bfac4ed37e4a6b9a05ab625855 - /Knowledge/ISYS Desktop 6/ISYSDesktop6Setup.exe
 RESULT:
   - BEFORE:    Tue Dec 21 04:05:24 EST 2010
   - AFTER:     Tue Jul 01 11:29:46 EST 2003
DONE processing all files..

Além disso, você pode precisar aumentar a memória do Java se tiver muitos arquivos e pastas.

    
por 26.04.2011 / 07:23

Tags