두 디렉토리의 어떤 파일들이 다른지 보고 싶을 경우, 보통diff -r dir1 dir2 이런식으로 사용하게 되는데, 이렇게 하면 설명이 장황하게 나옵니다.그래서 diff -r -q dir1 dir2 이렇게 사용하게 됩니다.다음 프로그램은 이와 유사한 기능을 하는 bash shell 프로그램입니다.diff 가 다른 파일은 differ 라고 메시지를 보여주는 대신 cmptree 는 different from 이렇게보여주네요. 별 차이는 없지만, shell programming을 공부하기에 좋은 코드 인 거 같습니다.
#!/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 $?
'Linux' 카테고리의 다른 글
NAS 와 스마트 TV 연결하여 영화 감상하기 (0) | 2016.08.01 |
---|---|
Thunderbird 에서 하이퍼링크를 Firefox 가 아닌 다른 웹브라우저로 여는 방법 (0) | 2013.04.09 |
[Debian] gitweb installation (0) | 2012.12.14 |
Debian - Apache 설치와 개인 home directory 설정 (0) | 2012.03.29 |
[Debian] /etc/passwd 파일 설명 (0) | 2012.01.27 |