ディレクトリを再帰的に辿り、すべてのファイルにcmpを実行する。ただし、オブジェクトファイルに対してはobjdump -dで逆アセンブルしたものをcmpする。 自分でビルドしたパッケージと公式パッケージの差分の有無を確かめるために作成。 好きに使ってください。
- #!/bin/sh
- diff_recursive(){
- local a="$1"
- local b="$2"
- local f1
- if [ -d "$a" ]; then
- if [ -d "$b" ]; then
- ls "$a" | while read f1; do
- if ! [ -e "$b/$f1" ]; then
- echo "there is $a/$f1 but no $b/$f1"
- else
- diff_recursive "$a/$f1" "$b/$f1"
- fi
- done
- else
- echo "$a is a directory but $b is not"
- fi
- elif [ -L "$a" ]; then
- if ! [ -L "$b" ]; then
- echo "$a is a link buf $b is not"
- fi
- elif [ -f "$a" ]; then
- if [ -f "$b" ]; then
- if [ "$(file -b "$a"|head -c 3)" = ELF -a \
- "$(file -b "$b"|head -c 3)" = ELF -o \
- "$(file -b "$a")" = "current ar archive" -a \
- "$(file -b "$b")" = "current ar archive" ]
- then
- if ! objdump -d "$a" | tail -n +3 | ( exec 3<&0; (objdump -d "$b" | tail -n +3) | cmp -s /dev/fd/0 /dev/fd/4 4<&3 ) ; then
- echo "objdiff in $a and $b"
- fi
- else
- if ! cmp -s "$a" "$b"; then
- echo "diff in $a and $b"
- fi
- fi
- else
- echo "$a is a normal file but $b is not"
- fi
- else
- echo "$a is not supported type"
- fi
- }
- diff_recursive $1 $2