Rsync: copiando apenas sobre timestamps

42

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

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

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 /.

Minha pergunta é a seguinte: dado que eu sei que os arquivos são idênticos (em relação ao conteúdo), existe alguma maneira (via rsync ou não) de definir os carimbos de data / hora para os arquivos em B / para serem idênticos aos carimbos de data e hora dos arquivos em A /, sem copiar todos os arquivos de A / para B /?

obrigado

artella
fonte
Se você sabe que os arquivos são idênticos, por que você deve fazer o possível para não copiá-los para obter o carimbo de data / hora necessário?
Tim
3
@ Tim: talvez haja muitos dados.
Richard

Respostas:

75

Usando -t(preservar timestamps) e --size-onlycomparará apenas os arquivos no tamanho. Se o tamanho corresponder, o rsync não copiará o arquivo, mas, como -tespecificado, ele atualizará o registro de data e hora no arquivo de destino sem a necessidade de copiá-lo novamente.

Certifique-se de não usar -u(atualizar), pois isso ignorará os arquivos que já existem 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 em uma nova unidade e, portanto, os carimbos de data e hora foram atualizados para o horário atual. Usei o comando abaixo para sincronizar tudo corretamente em um período decente de tempo:

rsync -vrt --size-only /src /dest
Grant Pannell
fonte
2
Também sugiro adicionar --existingpara evitar cópias acidentais de novos arquivos.
leden
1
A bandeira --archive(ou -a) inclui -r, -te mais :)
Dor
6

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

user115916
fonte
3

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

Você pode obter uma lista de arquivos com registros de data e hora (horários de acesso) como este:

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

E obtenha os comandos de atualização de tempo apropriados:

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

Não é um script completo, mas um bom ponto de partida! :)

Pedra
fonte
Obrigado. Acho que provavelmente vou ficar com o Rsync no momento, mas definitivamente irei para a web e aprenderei os diferentes componentes do seu script, pois pode ser útil no futuro.
Art
Essa parecia ser exatamente a minha solução! Quero preservar os horários ao adicionar alguns metadados à minha biblioteca de músicas. No entanto, aparentemente, ele não pode manipular espaços nos nomes de arquivos):
Burcardo
2

Use o diretório de origem (por exemplo /path/to/source) como referência para o comando touch. Apenas cdno diretório de destino e faça

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

Você não pode copiar carimbos de data / hora de sub-segundo com rsync (ainda).

Isso também funciona para diretórios e pseudo arquivos (basta remover ou alterar o -type f)

knorke
fonte
Isso foi útil para mim, pois eu precisava que uma cópia fosse feita. Notei que ele não copia o ctime, o que foi bom no meu caso.
snapfractalpop
Basta ler a página de manual do 'touch'. Você pode definir atime e mtime ambos com este comando.
Knorke
Sim, eu sei que você pode usar, touch -armas isso ainda não muda o ctime. Suponho que isso raramente seja desejado.
snapfractalpop
Ah, eu vejo o problema agora. Obrigado. Sim, é difícil mudar o horário do trabalho e não sei por quê.
Knorke
1

Bem, você certamente poderia escrever um script que leia o registro de data e hora de um lado e depois use o touch para defini-lo no mesmo arquivo do outro lado.

Mas isso provavelmente levaria muito mais tempo do que simplesmente deixar o rsync tentar copiar todos os arquivos. Pouquíssimos dados serão realmente transferidos (apenas bloqueie hashes se os arquivos forem realmente idênticos). Mas o conteúdo completo de cada arquivo terá que ser lido de cada lado, pelo menos. Portanto, se você está limitado pela largura de banda do disco ou IOPS, pode demorar um pouco. Mas provavelmente ainda há menos tempo do que escrever e testar um script para fazê-lo.

rmalayter
fonte
Obrigado, eu não conhecia esse recurso do rsync (também é discutido na wikipedia).
Art
0

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

É baseado na solução fornecida pela Stone. No entanto, aqui, sobre o horário da modificação e um script de trabalho para restaurar os registros de data e hora. PRIMEIRO, execute o primeiro passo e comece a trabalhar com seus arquivos.

  1. Preserve timestamps antigos . Ele opera a partir do diretório atual, exclui todos os arquivos ocultos e o salva no arquivo temporário em /tmp/files. Você sempre pode alterar os parâmetros, mas é melhor ficar com ele, -printf '"%t" "%p"\n'pois o touchcomando posterior 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 ajuda a restaurar os carimbos de data e hora:

    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

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

Burcardo
fonte
Para evitar (alguns) problemas com barras invertidas em seus nomes de arquivo, use read -r line. Bem, sempre use readcom -r. Além disso, você pode evitar a abertura job.shpara cada arquivo. Basta colocar o redirecionamento no final do comando:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello 19/02
2ª Advertência: Este script não transfere os registros de data e hora dos diretórios. (Bem, o OP não pediu por isso.) #
1959 hagello
0

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

Para copiar o último carimbo de data / hora criado ou modificado de qualquer arquivo para outro, você pode usar:

toque em / c / m / a / r SourceFile DestFile

(Esta versão do Touch faz parte do Win32 Console ToolBox http://www.stevemiller.net/apps/ )

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

Pierre
fonte
-1

O manual do rsync: man rsynclistas de -te -Nswitch, que pode valer a pena mexer com.

Tim
fonte
Não pude ver -N. Por que você recomenda isso de qualquer maneira?
Tom Hale