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
rsync
copy
synchronization
timestamp
artella
fonte
fonte
Respostas:
Usando
-t
(preservar timestamps) e--size-only
comparará apenas os 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 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:
fonte
--existing
para evitar cópias acidentais de novos arquivos.--archive
(ou-a
) inclui-r
,-t
e mais :)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.
fonte
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:
E obtenha os comandos de atualização de tempo apropriados:
Não é um script completo, mas um bom ponto de partida! :)
fonte
Use o diretório de origem (por exemplo
/path/to/source
) como referência para o comando touch. Apenascd
no diretório de destino e façaVocê 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
)fonte
touch -ar
mas isso ainda não muda o ctime. Suponho que isso raramente seja desejado.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.
fonte
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.
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 otouch
comando posterior utiliza isso.find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
Modifique seus arquivos o quanto quiser
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
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.fonte
read -r line
. Bem, sempre useread
com-r
. Além disso, você pode evitar a aberturajob.sh
para 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
Melhor maneira de copiar apenas o registro de data e hora no Windows:
(Esta versão do Touch faz parte do Win32 Console ToolBox http://www.stevemiller.net/apps/ )
fonte
O manual do rsync:
man rsync
listas de-t
e-N
switch, que pode valer a pena mexer com.fonte
-N
. Por que você recomenda isso de qualquer maneira?