Rsync: copiando apenas para timestamps

37

Atualmente eu tenho dois diretórios A / e B / que são idênticos em todos os aspectos, com exceção dos timestamps. Portanto, se eu executar o comando:

rsync --dry-run -crvv A/ B/

então todos os arquivos são marcados como "uptodate", enquanto o comando:

rsync --dry-run -rvv A/ B/

mostra que todos os arquivos devem ser copiados de A / para B /.

A minha pergunta é: dado que sei que os ficheiros são idênticos (no que diz respeito ao conteúdo), existe alguma forma (através do rsync ou outro) de definir que os carimbos de hora dos ficheiros em B / sejam idênticos aos timestamps do os arquivos em A /, sem copiar todos os arquivos de A / para B /?

Obrigado

    
por artella 28.12.2011 / 16:35

8 respostas

66

Usar -t (preservar registros de data e hora) e --size-only só compara arquivos no tamanho. Se o tamanho corresponder, o rsync não copiará o arquivo, mas como -t é especificado, ele atualizará o registro de data e hora no arquivo de destino sem recopiá-lo.

Certifique-se de não usar -u (update), pois isso ignorará os arquivos já existentes e ignorará completamente a atualização do registro de data e hora.

Eu tive o problema de originalmente não usar o rsync para copiar um monte de arquivos para uma nova unidade e, portanto, os timestamps foram atualizados para a hora atual. Eu usei o comando abaixo para sincronizar tudo corretamente em um tempo decente:

rsync -vrt --size-only /src /dest
    
por 21.11.2012 / 13:43
6

O uso de --size-only fará com que o rsync pule a comparação dos timestamps de arquivo (e, portanto, do conteúdo do arquivo), se os tamanhos corresponderem. Combinar isso com --times irá clonar os timestamps na árvore de destino.

    
por 30.03.2012 / 13:58
3

Eu acho que o rsync é a ferramenta certa para fazer isso, mas se você quiser algum script para fazer isso do que algo, isso pode dar um bom começo.

Você pode obter uma lista de arquivos com registros de data e hora (tempos de acesso) assim:

find . -printf '"%p" %a\n' -type f > /tmp/times

E obtenha os comandos apropriados de atualização de horário:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Não é um script completo, mas um bom começo! :)

    
por 28.12.2011 / 17:05
2

Use o diretório source (por exemplo, /path/to/source ) como referência para o comando touch. Apenas cd para o seu diretório target e faça

find -type f -exec touch -r /path/to/source/{} {} \;

Você não pode copiar timestamps abaixo de segundos com rsync (ainda).

Isso também funciona para diretórios e pseudo-arquivos (apenas remova ou altere o -type f )

    
por 29.09.2017 / 14:36
1

Bem, você certamente pode escrever um script que leia o timestamp de um lado e, em seguida, use o toque para defini-lo no mesmo arquivo do outro lado.

Mas isso provavelmente levaria muito mais tempo do que simplesmente permitir que o rsync tente copiar todos os arquivos. Muito poucos dados serão realmente transferidos (somente hashes de bloco se os arquivos forem realmente idênticos). Mas o conteúdo completo de cada arquivo terá que ser lido em cada lado, pelo menos. Então, você está limitado por largura de banda de disco ou IOPS, isso pode demorar um pouco. Mas ainda assim, provavelmente, menos tempo do que escrever e testar um script para fazer isso.

    
por 28.12.2011 / 16:53
0

O manual de rsync: man rsync lista um -t e -N , eles podem valer a pena brincar com isso.

    
por 28.12.2011 / 16:57
0

Para pessoas como eu que pretendem modificar os arquivos e manter o carimbo de data / hora original (por exemplo, você atualiza as meta tags de sua biblioteca de músicas).

Baseia-se na solução fornecida por Stone. No entanto, aqui sobre a hora da modificação e um script de trabalho para restaurar os timestamps. PRIMEIRO faça o primeiro passo, depois comece a trabalhar com seus arquivos.

  1. Preserve os timestamps antigos . Ele opera a partir do diretório atual, exclui todos os arquivos ocultos e os salva no arquivo temporário em /tmp/files . Você sempre pode alterar parâmetros, mas é melhor ficar com -printf '"%t" "%p"\n' , pois o último comando touch utiliza isso.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Modifique seus arquivos o quanto quiser

  3. agora crie um arquivo que ajude a restaurar os timestamps:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. E, finalmente, aplique as datas antigas aos arquivos modificados

    sh job.sh

Ressalva: funciona para arquivos com espaçamento de nome, caracteres especiais, mas, por exemplo, nenhum arquivo com um sinal $ .

    
por 22.07.2016 / 08:19
0

Melhor maneira de copiar apenas o registro de data e hora no Windows:

  • para arquivos : use o comando "touch", conforme descrito aqui link :

To copy any file's last created/modified/accessed time stamp to another, you can use:

touch /c /m /a /r SourceFile DestFile

(Esta versão do Touch faz parte do link do Win32 Console Toolbox

  • para diretórios : use o comando "robocopy", com o link

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" /E /COPYALL /DCOPY:DAT /XF . /R:10 /W:5 /V /ETA

    
por 08.02.2017 / 10:54