誰にも見えないブログ

雑なメモ。まとまってない文章等

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のみを出力できた。

※相互にユニークな空のフォルダを含み合っている場合は別の方法を考える必要がある。

参考

stackoverflow.com