任意のフォルダに含まれるファイル群を一括比較するシェル

この手の機能を実現し、かつGUIを提供するフリーウェアなんて沢山有りそうですが、何でもシェルで実現したいUnix好きエンジニアにはお奨めのシェルです。(^o^)v

以下のシェル内のSOURCE変数とTARGET変数に比較したいフォルダを指定し、実行するとtxt、jsp、html、jar、template、gif、xmldtd、js、css、configと言う拡張子を持ったファイルに対して比較処理が行われます。実装はかなりヘッポコでベタな感じなので、必要に応じて適宜修正して頂ければと思います。

ヘッポコついでに実装に関する補足ですが比較処理はdiffではなくcmpを利用していますので、何かしら違いが有ればその時点で比較処理が終了しますので、違いが見つかったファイルがテキストファイルなら後から手動でdiffで詳細を比較してみてください。

#!/bin/ksh

export SOURCE=/var/tmp/source
export TARGET=/var/tmp/target

CURRENT_DIR=`pwd`
cd $SOURCE

for FILE in `ls *.txt *.jsp *.html *.jar *.template *.gif *.xml *.dtd *.js *.css *.config */*.txt */*.jsp */*.html */*.jar */*.template */*.gif */*.xml */*.dtd */*.js */*.css */*.config */*/*.txt */*/*.jsp */*/*.html */*/*.jar */*/*.template */*/*.gif */*/*.xml */*/*.dtd */*/*.js */*/*.css */*/*.config */*/*/*.txt */*/*/*.jsp */*/*/*.html */*/*/*.jar */*/*/*.template */*/*/*.gif */*/*/*.xml */*/*/*.dtd */*/*/*.js */*/*/*.css */*/*/*.config`

do
    echo "cmp ${SOURCE}/${FILE} ${TARGET}/${FILE}"
    cmp ${SOURCE}/${FILE} ${TARGET}/${FILE}
done

cd $CURRENT_DIR
exit 0


実際にCygwin上で実行した結果は以下のような感じです。(テストデータとしてccc.txtに違いが有ります)

# ./fileCompare.ksh
ls: cannot access *.jsp: No such file or directory
ls: cannot access *.html: No such file or directory
ls: cannot access *.jar: No such file or directory
ls: cannot access *.template: No such file or directory
ls: cannot access *.gif: No such file or directory
ls: cannot access *.xml: No such file or directory
ls: cannot access *.dtd: No such file or directory
ls: cannot access *.js: No such file or directory
ls: cannot access *.css: No such file or directory
ls: cannot access *.config: No such file or directory
ls: cannot access */*.txt: No such file or directory
ls: cannot access */*.jsp: No such file or directory
ls: cannot access */*.html: No such file or directory
ls: cannot access */*.jar: No such file or directory
ls: cannot access */*.template: No such file or directory
ls: cannot access */*.gif: No such file or directory
ls: cannot access */*.xml: No such file or directory
ls: cannot access */*.dtd: No such file or directory
ls: cannot access */*.js: No such file or directory
ls: cannot access */*.css: No such file or directory
ls: cannot access */*.config: No such file or directory
ls: cannot access */*/*.txt: No such file or directory
ls: cannot access */*/*.jsp: No such file or directory
ls: cannot access */*/*.html: No such file or directory
ls: cannot access */*/*.jar: No such file or directory
ls: cannot access */*/*.template: No such file or directory
ls: cannot access */*/*.gif: No such file or directory
ls: cannot access */*/*.xml: No such file or directory
ls: cannot access */*/*.dtd: No such file or directory
ls: cannot access */*/*.js: No such file or directory
ls: cannot access */*/*.css: No such file or directory
ls: cannot access */*/*.config: No such file or directory
ls: cannot access */*/*/*.txt: No such file or directory
ls: cannot access */*/*/*.jsp: No such file or directory
ls: cannot access */*/*/*.html: No such file or directory
ls: cannot access */*/*/*.jar: No such file or directory
ls: cannot access */*/*/*.template: No such file or directory
ls: cannot access */*/*/*.gif: No such file or directory
ls: cannot access */*/*/*.xml: No such file or directory
ls: cannot access */*/*/*.dtd: No such file or directory
ls: cannot access */*/*/*.js: No such file or directory
ls: cannot access */*/*/*.css: No such file or directory
ls: cannot access */*/*/*.config: No such file or directory
cmp /var/tmp/source/aaa.txt /var/tmp/target/aaa.txt
cmp /var/tmp/source/bbb.txt /var/tmp/target/bbb.txt
cmp /var/tmp/source/ccc.txt /var/tmp/target/ccc.txt
/var/tmp/source/ccc.txt /var/tmp/target/ccc.txt 異なります: バイト 9、行 4

こんな簡単なスクリプトで沢山のファイル比較ができるなんてシェルって素晴らしいですね。(^o^)/

ファイルが存在しない拡張子のところは『ls: cannot access ・・・』が出力されていますが、この辺はstderrを/dev/nullへ出力するような対処が必要ですね・・・。(^o^;