UNIXシェルスクリプト第10章 Part2

2つのディレクトリを比較するシェルスクリプト DirCmp

※指定した2つのディレクトリ下にあるファイル構成を比較し、

等しくないファイルをリスト表示する。以下の3パターンの表示を行う。

1番目のディレクトリ下にあって、2番目のディレクトリ下にはないファイル。

2番目のディレクトリ下にあって、1番目のディレクトリ下にはないファイル。

両方のディレクトリにはあっても、名前が同じだけで実体が異なるファイル。

 

-v 詳細表示オプション

  2つのディレクトリ下に同じ名称のファイルがあってその中身が異なっているとき、

  ファイルの何行目がどのように違っているのかを表示する。

 

DIR1_FILES=/tmp/files1.$$

$$にはスクリプトを実行した時のプロセスIDが入る。

そのため別の人が同時に複数動作させても利用する一時ファイルはそれごとに異なって混乱することはない。一時ファイルを利用する場合にはこのように$$変数を使うのはいいこと。

正常終了時も、途中終了時もこれらの一時ファイルを削除するようにしないといけない。

 

trp `rm -f /tmp/*.$$; exit 1`    1 2 3 15

このシェルスクリプトは実行中には1,2,3,15番のシグナルしか受け付けない。

つまりハングアップ、割り込み、クイット、終了。

これらのシグナルを受け取って処理が途中で中断された場合には、trapコマンドの引数が実行される。

 

find . \( -type f -o -type l \) -print | sort > $DIR1_FILES

カレントディレクトリ内で、ファイルタイプが f または l のファイルを探して、一覧表示する。ファイルタイプ l はシンボリックリンクを表す。

findコマンドがタイプ指定の部分を解釈しなくてはならないので、丸括弧を使い、\でエスケープしている。

sortコマンドでソートし、その結果を$DIR1_FILESに書き込む。

 

cat $DIR1_FILES $DIR2_FILES | sort | uniq -d > $COMMON_FILES

uniqコマンドは重複した行を1行にして表示する。

-dオプションは重複した行だけを表示する。

-uオプションは重複していない行だけを表示する。

なお、uniqコマンドは前後に並んだ行を比べるだけなので、先にsortコマンドで並べ替えておく必要がある。

 

if [ -s $TMP ] ; then

-sオプションはファイルが存在し、かつサイズが0でなければ真。

 

cmp -s $DIR1/$f $DIR2/$f

cmpコマンドは内容を比較する。

cmpコマンドの終了コードはファイルの内容が異なっていれば1になり、一致していれば0になる。

 

diff $DIR1/$f $DIR2/$f

diffコマンドでファイルの内容の違いを出力する。