2つのディレクトリ下のファイル構成を比較するシェルスクリプト


タイトルの通りです

#!/bin/sh
#
# 名称
#    dir_diff - 2つのディレクトリ下のファイル構成を比較する
#
# 書式
#    dif_diff [-v] [dir1] dir2
#
# 解説
#    指定した2つのディレクトリ下にあるファイル構成を比較し、
#    等しくないファイルをリスト表示する。
#    以下の3パターンの表示を行う。
#
#     1.1番目のディレクトリ下にあって、2番目のディレクトリ下にはないファイル
#     2.2番目のディレクトリ下にあって、1番目のディレクトリ下にはないファイル
#     3.両方のディレクトリにはあっても、名前が同じだけで実体が異なるファイル
#
#    -v  詳細表示オプション
#        2つのディレクトリ下に同じ名称のファイルがあって、その中身が異なって
#        いるとき、ファイルの何行目がどのように違っているのかを表示する。
#
# 戻り値
#    0  2つのディレクトリのファイル構成が等しい時
#    1  使用法の誤りか、何らかのエラーで終了した時
#    2  2つのディレクトリのファイル構成が異なっていた時
#
###############################################################################
CMDNAME=`basename $0`
USAGE="Usage: $CMDNAME [-v] [dir1] dir2"

CURDIR=`pwd`
DIR1=
DIR2=
DIR1_FILES=/tmp/files1.$$
DIR2_FILES=/tmp/files2.$$
ALL_FILES=/tmp/allfiles.$$
COMMON_FILES=/tmp/comfiles.$$
TMP=/tmp/tmp.$$
FOUND=FALSE
VERBOSE=FALSE

trap `rm -f /tmp/*.$$; exit 1`    1 2 3 15

#
# オプション処理
#
while :
do
    case $1 in
        -v) VERBOSE=TRUE
            shift
            ;;
        --) shift
            break
            ;;
        -*) echo "$USAGE" 1>&2
            exit 1
            ;;
        *)  break
            ;;
    esac
done


#
# コマンド行に指定された引数のチェック
#
if [ $# -eq 1 ]; then
    DIR1="."
    DIR2="$1"
elif [ $# -eq 2 ]; then
    DIR1="$1"
    DIR2="$2"
else
    echo "$USAGE" 1>&2
    exit 1
fi

if [ ! -d $DIR1 ]; then
    echo "$DIR1 is not a directory." 1>&2
    exit 1
fi
if [ ! -d $DIR2 ]; then
    echo "$DIR2 is not a directory." 1>&2
fi

cd $DIR1
find . \( -type f -o -type l \) -print | sort > $DIR1_FILES
cd $CURDIR
cd $DIR2
find . \( -type f -o -type l \) -print | sort > $DIR2_FILES
cd $CURDIR

cat $DIR1_FILES $DIR2_FILES | sort | uniq    > $ALL_FILES
cat $DIR1_FILES $DIR2_FILES | sort | uniq -d > $COMMON_FILES


cat $DIR1_FILES $ALL_FILES | sort | uniq -u > $TMP
if [ -s $TMP ]; then
    FOUND=TRUE
    echo ""
    echo "File missing from $DIR1:"
    for f in `cat $TMP`
    do
        f=`expr $f : '..\(.*\)'`
        echo " $f"
    done
fi

cat $DIR2_FILES $ALL_FILES | sort | uniq -u > $TMP
if [ -s $TMP ]; then
    FOUND=TRUE
    echo ""
    echo "File missing from $DIR2:"
    for f in `cat $TMP`
    do
        f=`expr $f : '..\(.*\)'`
        echo " $f"
    done
fi

FIRST=TRUE
for f in `cat $COMMON_FILES`
do
    cmp -s $DIR1/$f $DIR2/$f
    if [ $? -ne 0 ]; then
        FOUND=TRUE
        f=`expr $f : '..\(.*\)'`
        if [ "$FIRST" = "TRUE" ]; then
            FIRST=FALSE
            echo ""
            echo "Files that are not the same:"
        fi

        if [ "$VERBOSE" = "TRUE" ]; then
            echo ""
            echo "File: $f"
            diff $DIR1/$f $DIR2/$f
        else
            echo "  $f "
        fi
    fi
done


rm -f /tmp/*.$$
if [ $FOUND = TRUE ]; then
    exit 2
else
    echo "The directories are the same."
    exit 0
fi