shellスクリプトでサーバ間の差分を出すときにいろいろ覚えた

shellスクリプトをつかってみる

菊池です
つい最近、本番のサーバとステージングの環境でファイルやディレクトリの権限の差異が発生して
差分を調査しなければならないことがありました。

サーバが1つや2つなら,treeコマンドやlsコマンドで出力したものを印刷でもして見比べればいいのですが

今回は10台以上のサーバの差分を出さなければならなかったので

スクリプトを書こうと思いました
今までであれば簡単なスクリプトでもpythonやrubyを使って書いていたのですが

今回はshellスクリプトに挑戦してみました。

ls?tree?find?

まずはじめにファイルのアクセス権とオーナーと言った情報とファイルやディレクトリの一覧を取得することになります
ファイルの一覧といえばまっさきに思いつくのはlsやtreeコマンドでした
どちらもオプションをつけることで再帰的に末端のファイルまで必要な情報とともに出力してくれます
しかし、treeコマンドの場合

出力に出てくるラインが邪魔で加工しにくいです。軽くディレクトリの構造などを見渡すにはいいのですが今回はボツです! ><

次にlsですが

なかなかいい感じなのですが、今回、同じファイル名で二箇所にあったり違う場所にあったりするので
ファイル名はフルパスでほしいので・・lsも今回はボツです

次にfind

おお、まさに欲しかった結果だ
findコマンドは探し者をするときに使うものだと思っていたのですが今回のような場合にも有用みたいです。

ファイル名が一致するものを並べて表示する

同じ場所にある同じ名前のファイルとディレクトリを比べたいのですが・・
そこで、joinです。


sqlのjoinと同じような動作をするコマンドです
キーにするフィールドを指定して、一致するものを並べて表示します
今回はファイル名にあたるフィールドをキーにしてjoinしました
こうすることでアクセス権と所有者の違いを簡単に比べることができます。

さあ書くぞ

方針

  1. サーバの情報をfindでとる
  2. ソートする
  3. awkでほしいフィールドだけ出力する
  4. 比べたいサーバでも1,2,3をおこなう
  5. joinでいい感じにする

どんっ!

糞読みにくいですけど、許してください
shellスクリプトの基礎がわかってないので、動くようになるまで大変でした

あとは・・並んで出力されたものを見比べて・・・
いやいやもちろん目視で確認なんかしませんよ!

違う箇所だけ出力します

よかったよかった