Grok Mogger wrote:
I have about 36 GB of files on a hard disk that I've transfered to another disk. I'd like to cksum or md5sum the files just to make sure that they were all copied well. I can't seem to find a way to recurse through the directories and do this to a lot of files. I've looked around a lot, and finding nothing I'm about to start writing my own script, but I thought I'd ask here first. It just seems like something that there would be a way to do already, and I'm just missing it.

Thanks,
- GM

My approach may be overkill for your purposes, but it handles
pathological filename characters including single quotes, leading/trailing
spaces, and backslashes, which I occasionally find in system backups.
Since using these scripts, I've gone several years now without any filename
problems in my backups.

In addition, unlike some of the more common approaches mentioned here,
I wanted my scripts to be compatible with Debian archive md5sum
indices files, account for all file types instead of just regular files,
and facilitate error logging.

They are crudely written and slow, and not the best example of bash
scripting, particularly the way I use scripts as subroutines.  I appreciate
any suggestions for improvement.

(Somewhere in the debian-user archives you might find early versions of my
entire set of archiving scripts, if you are interested.)

This script creates the gzipped md5sum list:
rm $1/md5sums.gz
DATE=`date +%j%H%M%S`
pushd $1; find -exec /use/local/bin/make-md5sum {} \; | cat 
>/tmp/md5sums.$DATE;popd
gzip -c /tmp/md5sums.$DATE >$1/$2/md5sums.gz

This script uses the md5sum list to check the backup:
zcat $1/md5sums.gz | sed 's/  /&"/' | sed 's/$/"&/' |  sed 's/\\/\\\\/g' |  
/usr/local/bin/md5chk $1

Here are the "subroutine" scripts, make-md5sum and md5chk.

/usr/local/bin/make-md5sum:
if [ -h "$1" ]
then
        echo "00000000000000000000000000000000  $1"
else
if [ -f "$1" ]
then
        md5sum "$1"
else
if [ -e "$1" ]
then
        echo "00000000000000000000000000000001  $1"
else
        echo ----------  path not found ----------- >&2
        echo "---->>>>>  $1  <<<<<-----" >&2
        echo --------- possible name problem ------------>&2
fi
fi
fi

/usr/local/bin/md5chk:
cd $1
while read md5 filep
do
        filepath=`echo "$filep" | sed 's/"//g'`

        if [ -h "$filepath" ]
        then
                testmd5="00000000000000000000000000000000"
        else
        if [ -f "$filepath" ]
        then
                testmd5=`md5sum "$filepath" | (read md5 filepath; echo $md5;)`
        else
        if [ -e "$filepath" ]
        then
                testmd5="00000000000000000000000000000001"
        else
                echo "$filepath" not found | tee >&2
                echo
                continue
        fi
        fi
        fi

        if [ "$testmd5" != "$md5" ]
        then
                echo "$filepath md5sums don't match" | tee >&2
                echo "orig md5sum= $md5" | tee >&2
                echo "test md5sum= $testmd5" | tee >&2
                echo
        fi
done


--
To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to