Linuxでローカルに存在するディレクトリやファイルと、リモートに存在するディレクトリやファイルを比較する場面が多々あります。そのような場合、毎回リモートのファイルをローカルにコピーしてdiffコマンドで比較するのは非常に手間がかかります。そのような場合、本記事で紹介するコマンドを使ってローカルのファイルとリモートのファイルを簡単に比較する事ができます。
テストデータの用意
まずローカルのLinuxマシンに以下のような内容のファイルを用意しました。
$ cat local-sample.txt
1234567890
ABCDEFGHIJ
XYZXYZXYZ
あいうえお
かきくけこ
さしすせそ
一方、リモートのLinuxマシンに以下のような内容のファイルを用意しました。
cat remote-sample.txt
1234567890
ABCDEFGHIJ
XYZXYZXYZ
PPAPPPAP
あいうえお
かきくけこ
さしすせそ
この2つのファイルの違いは、リモートのファイルにだけ「PPAPPPAP」という行が存在しています。
ローカルとリモートのファイル比較方法
sshコマンドの標準入出力を使ってファイルを比較
$ ssh username@remote-server1 cat ~/remote-sample.txt | diff ~/local-sample.txt -
3a4
> PPAPPPAP
vimdiffコマンドを活用してファイルを比較
vimエディタをdiffモードで起動するvimdiffというコマンドを使って、ローカルとリモートのファイルを比較する方法です。この方法では、vimエディタ内で差分を確認できます。
$ vimdiff local-sample.txt scp://username@remote-server1/remote-sample.txt
実際に実行すると、次のようにvimエディタが起動してローカルとリモートのファイルの差分が表示されます。vimエディタ内でハイライト表示されている差分情報を確認しながら、差分を修正していくことが可能です。
diffコマンドでリモートとローカルのファイルを比較
diffコマンドに、リモートサーバー上のファイルと、ローカルファイルを指定して、ファイルの差分を確認することが出来ます。
$ diff <(ssh username@remote-server1 cat ~/remote-sample.txt) ~/local-sample.txt
4d3
< PPAPPPAP
ローカルとリモートのディレクトリ内容比較
次にローカルにあるディレクトリの内容と、リモートにあるディレクトリの内容を比較する方法です。ローカルとリモートにそれぞれ内容が異なるディレクトリとファイルを用意しました。
ローカルのlocal-test-dirには以下のようなディレクトリとファイルを作ります。
$ tree ./test-dir
./test-dir
├── 123.txt
├── dir1
│ └── hello_world.txt
└── local-sample.txt
2 directories, 3 files
リモートのremote-test-dirには以下のようなディレクトリとファイルを作ります。
$ tree ./test-dir
./test-dir
├── 123.txt
├── dir2
│ └── foobar.txt
└── remote-sample.txt
2 directories, 3 files
ここでは「123.txt」というファイルだけがローカルとリモートで全く同じ内容のファイルを含んでいます。
diffコマンドでディレクトリを比較
早速ローカルとリモートのディレクトリを比較してみます。以下のようにdiffコマンドでローカルとリモートのディレクトリ内容を比較し、差分を表示しています。123.txtは同じファイル名ですので差分として表示されません。
$ diff <(ssh username@remote-server1 find ~/test-dir | sort) <(find ~/test-dir | sort)
3,5c3,5
< /home/username/test-dir/dir2
< /home/username/test-dir/dir2/foobar.txt
< /home/username/test-dir/remote-sample.txt
---
> /home/username/test-dir/dir1
> /home/username/test-dir/dir1/hello_world.txt
> /home/username/test-dir/local-sample.txt
リモートでもローカルでも、findコマンドを実行して比較対象ディレクトリの中身をリストアップし、その結果をそれぞれsortコマンドで並べ替えてから、diffコマンドで結果を比較しています。
sdiffコマンドでディレクトリを比較
同じことをsdiffというコマンドを使って比較することも出来ます。sdiffコマンドは、diffコマンドの「–side-by-side」というオプションを付けたものと同じで、左右で比較できるdiffツールです。
$ sdiff <(ssh username@remote-server1 find ~/test-dir | sort) <(find ~/test-dir | sort)
/home/username/test-dir /home/username/test-dir
/home/username/test-dir/123.txt /home/username/test-dir/123.txt
/home/username/test-dir/dir2 | /home/username/test-dir/dir1
/home/username/test-dir/dir2/foobar.txt | /home/username/test-dir/dir1/hello_world.txt
/home/yshibuya/test-dir/remote-sample.txt | /home/username/test-dir/local-sample.txt
ディレクトリの比較で差分が出たファイルに対して、記事の最初で述べたようなファイルの比較を行うことによって、各ファイルの内容の差分を確認することが出来ます。
まとめ
この記事で記載した方法でローカルとリモートのファイルやディレクトリを比較することが出来ます。方法はいくつかありますが、実際の現場でどのコマンドが適しているか確認して、コマンドを実行して比較しましょう。