Обновлять контрольную сумму md5 при изменении файлов

У меня есть сервер, который при изменении содержимого определенной папки вычисляет контрольную сумму.

Проблема заключается в том, что вычисление контрольной суммы занимает около 30 минут, поскольку она пересчитывает каждый отдельный файл в этой папке, даже если простой текстовый файл был изменен. Поэтому во время выполнения контрольной суммы файлы не должны использоваться.

Расчет контрольной суммы выполняется с помощью следующей команды.

find . -type f | xargs md5sum > some_file

Каждый день новые файлы добавляются в папку, а другие удаляются.

Есть ли способ обновить файл контрольной суммы только для измененных / добавленных / удаленных файлов без вычисления md5 для остальных файлов?

Редактировать: Уточнение

Контрольная сумма должна содержать md5 для каждого файла в этой папке. Я пытаюсь добиться способа редактирования / обновления файла контрольной суммы, когда что-то меняется в папке:

  1. Удалить md5 для файла при удалении
  2. Добавить md5 для файла при добавлении в папке
  3. Обновление хеш-кода при изменении файла

Все это без пересчета всей папки сверху

0
задан 29 December 2017 в 13:40

2 ответа

Это - очень грубый сценарий, пытающийся сделать то, что Вы хотите. Не стесняйтесь копировать, изменять, оптимизировать - было бы хорошо иметь некоторый ответ, если он работает на Вас. Если протестировали в моей папке "Downloads" и нашли только одну ошибку оставленной (имя файла, содержащее [, который grepне любил).

Править: Измененный источник снова, поскольку создание меток времени (в первой версии) больше не необходимо, поскольку новые/измененные файлы найдены с find -newer. Также добавленные параметры к setthe названию файла хеша и возможно главной папки для запуска с; таким образом, сценарий нельзя назвать из главного каталога.

#!/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
2
ответ дан 29 December 2017 в 13:40

Я написал скрипт под названием RDChecksum, который может обновлять контрольные суммы файлов на основе меток времени «последнего изменения»:

https://github.com/rdiez/Tools/tree/ master/RDChecksum

0
ответ дан 26 June 2020 в 13:27

Другие вопросы по тегам:

Похожие вопросы: