Bashシェルスクリプトで2つのディレクトリを比較し内容に差異があったファイル名を一覧表示する
はじめに
diff
コマンドを使えば 2 つのファイルの内容の差分を確認することができます。
diff
コマンドには、2 つのファイルだけではなく、2 つのディレクトリの中にあるすべてのファイルに対して差分を確認する機能もあります。 ( ex: diff -r dir1/ dir2
)
diff -r
ではファイルのコンテンツ差分がすべて表示されますが、
差分のあったファイルの名前だけが欲しい 場合はどうしたら良いでしょうか?
検証環境
diff -r
を使ってディレクトリ間のファイルの差分を出力
diff -r
コマンドについておさらいです。
diff -r
を使って、2 つのディレクトリに格納されているファイルの差分を表示してみます。
挙動を確認するために、適当なディレクトリ階層とファイルを用意します。
dir1 というディレクトリが用意されました。
次に、 dir1 ディレクトリをコピーして dir2 ディレクトリを作成します。
内容は全く同じです。
ここで dir1 ディレクトリのファイルをいくつか書き換えてみます。
diff -r
でディレクトリ間の差分を確認してみます。
想定通りに差分が表示されました。
- 4.txt は dir2 にしか無い
- 1.txt の 1 行目に差分
- 2.txt の最終行に差分
diff -r --brief
を使ってディレクトリ間の差分のあるファイル名のみを出力
今度は差分内容ではなく、 差分のあるファイルの名前だけを出力 させてみたいと思います。
先程の -r
オプションに加えて、 --brief
オプションを付与すると、差分があるファイル名のみが表示されます。
--new-file
オプションについて
4.txt は dir1 ディレクトリに存在しないため、 1.txt や 2.txt
とは異なった表示のされ方をしています。
表示のされ方を合わせるためには --new-file
オプションを付与します。
--new-file
オプションですが、注意しないといけないことがあります。
中身が空のファイル( ex: .gitkeep
)が存在していた場合、 --new-file
オプションを付けると差分から無視されてしまいます。
--new-file
オプションを付与しなければ、先程作成した 5.txt
も差分として表示されます。
空のファイルを意図的に無視したい場合には便利なオプションですが、そうでない場合には注意が必要です。
ひとこと
diff -r --brief
オプションを付与しても、出力される情報はファイル名以外のメッセージも表示されるため、厳密にファイル名のみが欲しい場合にはメッセージを切り取る手間が必要です。
ディスカッション
コメント一覧
まだ、コメントがありません