読者です 読者をやめる 読者になる 読者になる

特定のディレクトリ間の特定のファイルだけでDiffを取るシェルスクリプト

やりたいこと

・特定の2つのディレクトリ間でDiffをとりたい
・ただし、特定の条件のファイルのみで

例えば、tmpファイルや画像などはDiffに含みたくない

やったこと

簡単にシェルスクリプトを作成して対応

使い方の例

カレントディレクトリにファイルやディレクトリが作成されるので、無害なところでやること

作業ディレクトリに移動する

$ cd /path/to/work_dir

後述のシェルスクリプトを動かす

$ ./findiff.sh /path/to/target/A /path/to/target/B

以下のようなファイルが作為されているはず

$ ls

・targetA
・targetB
・diff_log

diff_logのなかに比較した結果が入っている

findiff.sh の中身

・今回対象がWeb系だったのでPHPやなんかを対象にする
ディレクトリもいらなさそうなものを対象に

$ cat findiff.sh

#!/bin/sh

CURRENT_DIR=`pwd`

TARGET_A=$1  
TARGET_A_DIR=$CURRENT_DIR/TARGET_A

TARGET_B=$2  
TARGET_B_DIR=$CURRENT_DIR/TARGET_B

INCLUDE_PATTERN=" find ./ -type f -name '*.php' -or -name '*.tmpl' -or -name '*.ctp' -or -name '*.inc'  -or -name '*.css'  -or -name '*.js' "  
EXCLUDE_PATTERN=' xargs grep -l "" |  grep -v "temp/" |  grep -v "_bk" | grep -v "/_" | grep -v "/\." '

# ディレクトリの存在確認  
if [ ! -d $TARGET_A ]; then  
    echo "$TARGET_A が存在しません" 1>&2  
    exit;  
fi

# ディレクトリの存在確認  
if [ ! -d $TARGET_B ]; then  
    echo "$TARGET_B が存在しません" 1>&2  
    exit;  
fi

echo "過去データの削除"  
rm -rf $TARGET_A_DIR  
rm -rf $TARGET_B_DIR

echo "TARGET_Aのコピー開始"  
cd $TARGET_A  
eval $INCLUDE_PATTERN | eval $EXCLUDE_PATTERN |  cpio -pdv $TARGET_A_DIR


echo "TARGET_Bのコピー開始"  
cd $TARGET_B  
eval $INCLUDE_PATTERN | eval $EXCLUDE_PATTERN |  cpio -pdv $TARGET_B_DIR

cd $CURRENT_DIR

echo "比較開始"  
diff -rbB $TARGET_A_DIR $TARGET_B_DIR  > $CURRENT_DIR/diff_log

echo "結果:diff_log"