linuxのdiffコマンドでファイルごとdiffを取るときに空のファイルを無視する方法
diffには-rというオプションでフォルダごと再帰的に比較することができる。
$man diff ...(略) -r, --recursive recursively compare any subdirectories found
以下のようなディレクトリtest1,test2をこのオプションを使って比較する
- test1とtest2というフォルダがあるとします。
- test1とtest2両方に同じファイルaが入ってる
- test2にはtest1に存在しないtestファイルとtestfが入っている。
. ├── test1/ │ └── a └── test2/ ├── a ├── test └── testf/
比較すると、test2にしか存在しない、testとtestf/が差分として結果に出力される
$ diff -r test1/ test2/ Only in test2/: test Only in test2/: testf
空のディレクトリを無視したい場合は、--ignore=empty-folderなんて便利なオプションは無いので、カラフォルダを一旦findコマンドで抽出した後、-xオプションで除外するようにしてdiffを実行する
diff $(find <空のフォルダを含んでいるディレクトリ> -empty -type d -exec sh -c 'echo -n "-x $(basename $1) "' _ {} \;) -r test1/ test2/
実行結果
$ diff $(find test2 -empty -type d -exec sh -c 'echo -n "-x $(basename $1) "' _ {} \;) -r test1/ test2/ Only in test2/: test
test2の空フォルダtestf/が除外されてtestのみを出力できた。
※相互にユニークな空のフォルダを含み合っている場合は別の方法を考える必要がある。