Ferramenta Mac OS X para sincronizar / copiar APENAS registro de data e hora em vez de dados de um arquivo? Não há transferência de dados de arquivo, apenas os metadados do sistema de arquivos são sincronizados

5

Esta é a minha situação atual (simplificada, na verdade, é claro, muitos e grandes arquivos):

Dir1/
  a b c
Dir2/
  a b c d

Isso já aconteceu antes:

  • a b c foi copiado de Dir1 para Dir2.
  • No Dir2, os registros de data e hora de um b c foram modificados acidentalmente.
  • foi adicionado ao Dir2 intencionalmente.

Agora eu quero fazer isso: Sincronizar Dir2 de volta para Dir1. (Para quem diz respeito: eu uso o rsync)

  • d é novo e, portanto, deve ser copiado.
  • a b c em Dir2 e Dir1 são idênticos em tamanho e conteúdo de dados, mas seus carimbos de vídeo são diferentes. Assim, eles seriam desnecessariamente copiados.

Eu sei que o rsync pode comparar arquivos por --checksum ou --size-only. Mas essa verificação intensiva de disco / cpu teria que ser repetida em todas as sincronizações futuras. Em vez disso, eu prefiro corrigir de uma vez por todas o meu erro, restaurando os timestamps de arquivos originais daqueles em Dir1 para aqueles em Dir2 com uma ferramenta. Então, meu erro foi corrigido e futuras sincronizações podem ser executadas com eficiência.

No Windows, essas ferramentas podem copiar somente carimbos de data e hora (sem copiar dados):

  • Robocopy com a opção / COPY: T
  • WinSCP em Sincronizar o modo de registro de data e hora

Alguém conhece uma ferramenta CLI / GUI apropriada para o Mac OS X?

    
por porg 26.08.2011 / 23:02

3 respostas

1

O sinalizador --size-only no rsync não é nem intensivo de CPU nem de disco comparado com a verificação rsync padrão; na verdade, é mais rápido porque normalmente o rsync verificará o tamanho do arquivo E o timestamp. Você pode usar o comando touch para corresponder explicitamente os timestamps no abc em Dir2. Você pode excluir os arquivos em dir2 e rsync novamente. Essas sugestões são ótimas se for uma tonelada de arquivos para que você possa envolvê-los em um script ou encontrar. Note que se você simplesmente executar o rsync novamente, em um modo típico, mas com o optinoal --partial também (diga rsync -az --partial Dir1 Dir2) ele não copiará os arquivos novamente, ao invés disso, ele tentará sincronizá-los inteligentemente que eu acredito que acabaria transferindo apenas os timestamps neste caso.

    
por 26.08.2011 / 23:44
0

É possível que os timestamps não sejam importantes para você? Não está claro a partir da pergunta se você está mais interessado em preservá-los ou em fazer rsyncs sem precisar copiar todos esses dados. Se você não se importa com os timestamps, pode usar o comando touch para definir uma data específica em todos os arquivos nas duas máquinas, para que sejam iguais. Algo como:

find dirX -type f -print | xargs touch -t 201108250000

Em seguida, executar o rsync deve funcionar sem ter que se preocupar, pois os timestamps serão os mesmos nas duas caixas. Eu não estou perto da minha caixa OS X para testar se isso funciona, mas eu já fiz isso no Linux antes.

    
por 26.08.2011 / 23:37
0

Não tenho certeza de uma maneira legal de fazer isso com o rsync, nem tenho nenhuma experiência com o max osx, mas uma tentativa no linux e espero que funcione para você ou esteja perto o suficiente .

Atenção: Esta é certamente a maneira menos mínima de conseguir isto:)

Precisamos passar por cada arquivo em dir1 que também está em dir2 e realizar nossa magia negra

#!/bin/bash
# warning, really inelegant bash follows
FROMDIR='dir1'
TODIR='dir2'

for FROMFILE in 'find $FROMDIR -type f'; do
        TOFILE='echo "$FROMFILE" | sed "s/^$FROMDIR/$TODIR/"'
        echo "trying $FROMFILE to $TOFILE"

        if [ -e "$TOFILE" ]; then
                NEWDATE=$(stat -c %y $FROMFILE | awk '{print $2, $1}')
                echo "would perform 'touch -d '$NEWDATE' $TOFILE'"
                #touch -d "$NEWDATE" $TOFILE # uncomment me if you want to perform changes
        fi  
done

quando você executa isso pela primeira vez, ele não fará modificações e, em vez disso, apenas fará o eco do que faria, se achar que é isso que você deseja, descomente a linha #touch -d "$NEWDATE" $TOFILE

explicação

stat -c %y filename

nos fornece o horário modificado de um arquivo em um formato legível por humanos

touch -d "timestamp" filename

irá definir a data modificada do nome do arquivo para timestamp, no entanto o toque parece ser muito exigente com o formato de tempo (ele não corresponde exatamente à saída do stat% y, e também não parece permitir a época).

awk '{print $2,$1}'

reorganizará a saída de stat -c %y para que possa ser obtida por touch -d

colocando isso junto, conseguimos

NEWDATE=$(stat -c %y fromfile | awk '{print $2, $1}')
touch -d "$NEWDATE" tofile
    
por 03.01.2013 / 07:01

Tags