Restaurando as propriedades do arquivo, mas não os arquivos completos, do backup

2

Ao copiar dados do meu antigo armazenamento em um computador Linux para o novo NAS (baseado em Linux), acidentalmente falhei ao obter as propriedades (mais importantes: as datas de modificação) junto com o novo local. Eu também continuei a usar / modificar os arquivos no novo local e, portanto, não posso simplesmente copiar tudo de novo.

O que eu gostaria de fazer é uma comparação entre os arquivos no antigo e no novo armazenamento e, para aqueles idênticos, restaurar as propriedades do armazenamento do Linux para os arquivos de armazenamento do NAS.

Existe uma maneira inteligente, como um script ou uma ferramenta para fazer isso? Eu poderia executá-lo na caixa do Linux ou, na pior das hipóteses, de um computador remoto com Windows.

Grato por qualquer sugestão. / Jon

    
por Jon 23.04.2014 / 21:43

1 resposta

0

Eu apenas pensei em compartilhar melhor o código que eu criei. Apesar de não ser um programador bash, há muito conhecimento disponível através do Google, então acredito que este código fará o trabalho para mim. Basicamente o que faz é:

  • Faça um loop em todos os arquivos e pastas no novo local e para cada um deles:
    • verifique se o mesmo arquivo existe no local antigo
      • Se não, escreva uma entrada de log
      • Se sim, o carimbo de data / hora (data de modificação) coincide?
        • Sim - nada a fazer além de escrever uma entrada de log
        • Não, os carimbos de data e hora não correspondem
          • É um diretório ou o conteúdo do arquivo é idêntico? Em seguida, reconfigure o registro de data e hora para o registro de data e hora do arquivo no local antigo e grave uma entrada de registro
          • Se o conteúdo do arquivo for diferente, os timestamps também poderão funcionar. Basta escrever uma entrada de log.

Código:

shopt -s globstar

NEWDIR="/home/jon"
OLDDIR="/tmp/jon_old"
LOGFILE=restoreDates_$(date "+%Y-%m-%d-%H%M%S").log

echo $LOGFILE > $LOGFILE

for f in "$NEWDIR"/** ; do
OLDFILE=$(sed -e "s/$NEWDIR/$OLDDIR/" <<< $f)

  # Does corresponding file exist in old directory?

  if [ -a "$OLDFILE" ] ; then

    # Do both files have the same modify date?
    if [ $(stat -c %Y "$f") -eq $(stat -c %Y "$OLDFILE") ] ; then
        echo "$OLDFILE already has same modify date/time as $f" >> $LOGFILE
    else

        # Is this a directory?
        if [ -d "$f" ]; then
            echo "$f is a directory, modify timestamp will be reset to that of $OLDFILE; $(stat -c %y "$OLDFILE")" >> $LOGFILE
            touch -r "$OLDFILE" "$f"
        else
            # Not a directory - Is old file equal to the new?
            if $(cmp --silent "$f" "$OLDFILE"); then
                # yes
                echo "$OLDFILE and $f are identic, modify timestamp will be reset to $(stat -c %y "$OLDFILE")" >> $LOGFILE
                touch -r "$OLDFILE" "$f"
            else # File has changed
                echo "$OLDFILE differs from $f , which must have changed" >> $LOGFILE
            fi
        fi
    fi
  else # File does not exist in old directory
    echo "$OLDFILE does not exist (but $f do)" >> $LOGFILE
  fi

done;

Quaisquer comentários sobre o código são bem-vindos.

    
por 27.05.2014 / 22:55