Atualiza a soma de verificação do md5 quando os arquivos são modificados

0

Eu tenho um servidor que quando o conteúdo de uma pasta específica é modificado, ele calcula uma soma de verificação.

O problema é que o cálculo da soma de verificação leva cerca de 30 minutos, uma vez que está recalculando todos os arquivos dessa pasta, mesmo que um arquivo de texto simples tenha sido modificado. Portanto, enquanto a soma de verificação estiver sendo executada, os arquivos não serão usados.

O cálculo da soma de verificação é feito com o seguinte comando.

find . -type f | xargs md5sum > some_file

Todos os dias, novos arquivos são adicionados à pasta e outros são excluídos.

Existe uma maneira de atualizar o arquivo de soma de verificação somente nos arquivos modificados / adicionados / excluídos sem calcular o md5 para o resto dos arquivos?

Editar: esclarecimento

A soma de verificação precisa conter um md5 para cada arquivo nessa pasta. O que eu estou tentando alcançar é uma maneira de editar / atualizar o arquivo de soma de verificação quando algo muda na pasta:

  1. Remover o md5 para o arquivo quando excluído
  2. Adicionar md5 para o arquivo quando adicionado na pasta
  3. Atualizar o código hash quando o arquivo é modificado

Tudo isso sem recalcular toda a pasta do topo

    
por Jimmy_A 29.12.2017 / 10:18

1 resposta

2

Este é um script muito difícil de tentar fazer o que você quer. Sinta-se à vontade para copiar, modificar, otimizar - seria bom ter alguma resposta se funcionar para você. Se testou na minha pasta "Downloads" e encontrou apenas um erro restante (um nome de arquivo contendo [ , que grep não gostou).

Editar: Modificada a fonte novamente, pois a criação de registros de data e hora (na primeira versão) não é mais necessária, pois arquivos novos / modificados são encontrados com find -newer . Também foram adicionados parâmetros para definir o nome do arquivo de hash e, possivelmente, a pasta de início para começar; então o script não precisa ser chamado no diretório principal.

#!/bin/bash
#
# Script to create md5 hashes for files in and below the current directory
# or the directory passed at the commandline
# In the first run, create the sums for all files.
# In the second run,
#  - if the files have not changed, keep the entries
#  - if the files have been deleted, forget the entry
#  - if the files have changed, create new md5 hash.
#
# Rough version - should be optimized
#

if [ $# -lt 1 ] ; then
  echo "Usage:"
  echo "$0 <hashfile> [<topdir>]"
  echo
  exit
fi

export HASHFILE=$1
export TOPDIR='.'
if [ $# -eq 2 ] ; then TOPDIR=$2; fi

export BACKFILE=$HASHFILE.bck
export TMPFILE=$HASHFILE.tmp

# In the first run, we create the file $HASHFILE if it does not exist
# You have to make sure that $HASHFILE does not contain any garbage for the first run!!

if [ ! \( -f $HASHFILE -a -s $HASHFILE \) ]; then
  echo -n "Creating $HASHFILE for the first time..."
  find $TOPDIR -type f -print0 | xargs -0 md5sum > $HASHFILE
  echo "done."
  exit
fi

# In the second run, we proceed to find the differences.
# First, find the newer files

find $TOPDIR -type f -newer $HASHFILE -print > $TMPFILE

# Now save the old file and create a new one, starting with new files

mv $HASHFILE $BACKFILE
echo -n "Processing new or modified files ..."
cat $TMPFILE | while read filename ; do
  md5sum "$filename" >> $HASHFILE
done
echo "done."

# Now walk through the old file and process to new file

cat $BACKFILE | while read md5 filename ; do
  # Does the file still exist?
  if [ -f "$filename" ] ; then
    # Has the file been modified?
    if grep -q -e "^$filename$" $TMPFILE ; then 
      echo "$filename has changed!"
    else
      echo "$md5  $filename" >> $HASHFILE
      #echo "$filename has not changed."
    fi
  else
    echo "$filename has been removed!"
  fi
done

# We now may delete temporary files
# rm $BACKFILE
# rm $TMPFILE

exit
    
por ridgy 29.12.2017 / 13:44