У меня есть сервер, который при изменении содержимого конкретной папки вычисляет контрольную сумму.
Проблема в том, что вычисление контрольной суммы занимает около 30 минут с момента пересчета каждого отдельного файла в этой папке, даже если был изменен простой текстовый файл. Таким образом, пока контрольная сумма работает, файлы не должны использоваться.
Расчет контрольной суммы выполняется с помощью следующей команды:
find . -type f | xargs md5sum > some_file
Каждый день новые файлы добавляются в папку, а другие удаляются.
Есть ли способ обновить файл контрольной суммы только на измененных / добавленных / удаленных файлах без вычисления md5 для остальных файлов?
Изменить: Уточнение
Контрольная сумма должна содержать md5 для каждого отдельного файла в этой папке. То, что я пытаюсь достичь, - это способ редактировать / обновлять файл контрольной суммы, когда что-то меняется в папке:
Удалить md5 для файла при удалении Добавить md5 для файла при добавлении в папку Обновить хеш-код, когда файл измененныйВсе это без пересчета всей папки сверху
Это очень грубый сценарий, который пытается сделать то, что вы хотите. Не стесняйтесь копировать, изменять, оптимизировать - было бы неплохо иметь некоторый отклик, если он сработает для вас. Если они были протестированы в моей папке «Загрузки» и обнаружили только одну ошибку слева (имя файла, содержащее [, которое не понравилось grep).
Изменить: Изменен источник снова, поскольку создание временные метки (в первой версии) больше не нужны, поскольку новые / измененные файлы найдены с помощью find -newer. Также добавлены параметры для определения имени хэш-файла и, возможно, верхней папки для начала; поэтому сценарий не нужно вызывать из верхнего каталога.
#!/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
Это очень грубый сценарий, который пытается сделать то, что вы хотите. Не стесняйтесь копировать, изменять, оптимизировать - было бы неплохо иметь некоторый отклик, если он сработает для вас. Если они были протестированы в моей папке «Загрузки» и обнаружили только одну ошибку слева (имя файла, содержащее [, которое не понравилось grep).
Изменить: Изменен источник снова, поскольку создание временные метки (в первой версии) больше не нужны, поскольку новые / измененные файлы найдены с помощью find -newer. Также добавлены параметры для определения имени хэш-файла и, возможно, верхней папки для начала; поэтому сценарий не нужно вызывать из верхнего каталога.
#!/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
Это очень грубый сценарий, который пытается сделать то, что вы хотите. Не стесняйтесь копировать, изменять, оптимизировать - было бы неплохо иметь некоторый отклик, если он сработает для вас. Если они были протестированы в моей папке «Загрузки» и обнаружили только одну ошибку слева (имя файла, содержащее [, которое не понравилось grep).
Изменить: Изменен источник снова, поскольку создание временные метки (в первой версии) больше не нужны, поскольку новые / измененные файлы найдены с помощью find -newer. Также добавлены параметры для определения имени хэш-файла и, возможно, верхней папки для начала; поэтому сценарий не нужно вызывать из верхнего каталога.
#!/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