タイトルの通りです
#!/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