Bash-dircmp
Материал из Ksimute
Случилось тут создание 20 терабайтного файлового хранилища, с reiserfs. А реальные пацаны всегда на измене ибо с такими партициями мало кто работал. Надо проверить содержимое. Нашел в интернетах скрипт на эту тему:
Да, кстати reiserfs 32-х битный и может адресовать только 16 терабайт. Адресовать более 16 терабайт на данный момент может в линуксе только XFS соответстенно на нем строили остальные хранилища.
http://dircmp.sourceforge.net/ Модифицировал его немного.
#! /bin/sh +x
f_error=/tmp/jcjerr$$.txt
f_list1=/tmp/jcjlst1$$.txt
f_list2=/tmp/jcjlst2$$.txt
f_temp=/tmp/jcjtmp$$.txt
\rm -f $f_error $f_list1 $f_list2 $f_temp
prog=`basename $0`
if [ $# -ne 2 ] ; then
echo "Usage : $prog directory1 directory2"
exit 1
fi
dir1="$1"
dir2="$2"
error() {
echo "$prog : ERREUR $1"
[ -s "$f_error" ] && cat "$f_error"
}
error_and_quit() {
error "$1"
\rm -f $f_error $f_list1 $f_list2 $f_temp
exit 1
}
echo "checking parameters"
cd $dir1 2>$f_error
[ $? -ne 0 ] && error_and_quit "when cd in $dir1"
cd $dir2 2>$f_error
[ $? -ne 0 ] && error_and_quit "when cd in $dir2"
echo "building lists of files"
cd $dir1 2>$f_error
[ $? -ne 0 ] && error_and_quit "when cd in $dir1"
find -name \* -type f -print > $f_list1 2>$f_error
[ $? -ne 0 ] && error_and_quit "when find in $dir1"
[ -s "$f_error" ] && error_and_quit "when find in $dir1"
cd $dir2 2>$f_error
[ $? -ne 0 ] && error_and_quit "when cd in $dir2"
find -name \* -type f -print > $f_list2 2>$f_error
[ $? -ne 0 ] && error_and_quit "when find in $dir2"
[ -s "$f_error" ] && error_and_quit "when find in $dir2"
echo "comparison"
sort $f_list1 > $f_temp 2>$f_error
[ $? -ne 0 ] && error_and_quit "when sorting list or files in $dir1"
mv $f_temp $f_list1
[ $? -ne 0 ] && error_and_quit "when rewriting list or files in $dir1"
sort $f_list2 > $f_temp 2>$f_error
[ $? -ne 0 ] && error_and_quit "when sorting list or files in $dir2"
mv $f_temp $f_list2
[ $? -ne 0 ] && error_and_quit "when rewriting list or files in $dir2"
comm -23 $f_list1 $f_list2 > $f_temp 2>$f_error
[ $? -ne 0 ] && error_and_quit "when 1rst comparing list or files"
if [ -s $f_temp ] ; then
echo "MISSING IN $dir2 :"
cat $f_temp
echo
fi
comm -13 $f_list1 $f_list2 > $f_temp 2>$f_error
[ $? -ne 0 ] && error_and_quit "when 2nd comparing list or files"
if [ -s $f_temp ] ; then
echo "MISSING IN $dir1 :"
cat $f_temp
echo
fi
comm -12 $f_list1 $f_list2 > $f_temp 2>$f_error
[ $? -ne 0 ] && error_and_quit "when 3rd comparing list or files"
for i in `cat $f_temp` ; do
#for i in toto ; do
f1=${dir1}/$i
f2=${dir2}/$i
j=`md5sum $f1 2>$f_error`
if [ $? -ne 0 ] ; then
error "when md5sum $f1"
else
md1=`echo $j | awk '{ print $1 }' 2>$f_error`
if [ $? -ne 0 ] ; then
error "when awk after md5sum $f1"
else
j=`md5sum $f2 2>$f_error`
if [ $? -ne 0 ] ; then
error "when md5sum $f2"
else
md2=`echo $j | awk '{ print $1 }' 2>$f_error`
if [ $? -ne 0 ] ; then
error "when awk after md5sum $f2"
elif [ "$md1" != "$md2" ] ; then
echo "DIFFERENCE between $f1 ($md1) and $f2 ($md2) !"
# else
# echo "OK : $i"
fi
fi
fi
fi
done
\rm -f $f_error $f_list1 $f_list2 $f_temp
exit 0