KsI-wiki online documents

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