Re: diff(ing) 2 directories ?



Mel wrote:
is there code out there to do a diff on 2 directory contents, and report on
files that are new, none existent, etc.

thanks for your help


Assuming unix, I use the following shell script:-
---- cut here -------
#!/usr/local/bin/bash
#
# cmptree: compare directory trees recursively and report the differences.
# Author: Ives Aerts

function gettype () {
   if [ -L $1 ]; then
      echo "softlink"
   elif [ -f $1 ]; then
      echo "file"
   elif [ -d $1 ]; then
      echo "directory"
   else
      echo "unknown"
    fi
}

function exists () {
   if [ -e $1 -o -L $1 ]; then
      return 0;
   else
      echo "$1 does not exist."
      return 1;
   fi
}

function comparefile () {
   cmp -s $1 $2
   if [ $? -gt 0 ]; then
      echo "$1 different from $2"
   #  else
   #    echo "$1 same as $2"
   fi
   return
}

function comparedirectory () {
   local result=0
   for i in `(ls -A $1 && ls -A $2) | sort | uniq`; do
       compare $1/$i $2/$i || result=1
   done
   return $result
}

function comparesoftlink () {
   local dest1=`ls -l $1 | awk '{ print $11 }'`
   local dest2=`ls -l $2 | awk '{ print $11 }'`

   if [ $dest1 = $dest2 ]; then
      return 0
   else
      echo "different link targets $1 -> $dest1, $2 -> $dest2"
      return 1
   fi
}

# compare a file, directory, or softlink
function compare () {
   (exists $1 && exists $2) || return 1;

   local type1=$(gettype $1)
   local type2=$(gettype $2)

   if [ $type1 = $type2 ]; then
      case $type1 in
        file)
             comparefile $1 $2
             ;;
        directory)
             comparedirectory $1 $2
             ;;
        softlink)
             comparesoftlink $1 $2
             ;;
        *)
             echo "$1 of unknown type"
             false
             ;;
      esac
   else
      echo "type mismatch: $type1 ($1) and $type2 ($2)."
      false
   fi
   return
}

if [ 2 -ne $# ]; then
   cat << EOU
   Usage: $0 dir1 dir2
   Compare directory trees:
   files are binary compared (cmp)
   directories are checked for identical content
   soft links are checked for identical targets
EOU
exit 10
fi

compare $1 $2
exit $?
-------- cut here ---------------

Ivan...
.



Relevant Pages


Loading