chmodとchownの--referenceオプション

ウェブの環境調整中です。プロダクトを置き換えるのにパッケージではなく、tarballを展開してちょこちょことなにやら実施。ところが、tarballに含まれているファイルやディレクトリのpermissionやowner,groupが現環境とちがっていていろんなところで不具合がでます。
そこで、tarballで上書きしたディレクトリ以下で、バックアップをとっていたディレクトリ以下と比較して違ったらそのパーミションを出力するスクリプトを書きました。出力はこんな。

$ check_perm.sh
/home/hoge/foo.txt new=drwxrw-rw-,org=drwxrwxrwx

チェックしたのはいいけど、こんなの視認してchmodするのなんか馬鹿げてる。とってもたくさんあるんですもの。
じゃあ、chmodが食えるような引数に変換するか、lsの出力を777とか数字でだせないのかなと調べる。
うーん、できなかないけど難しそうだな。

こういうときはmanを読むのだ。chmodのmanを読むと --referenceというオプションがある。

       --reference=RFILE
              use RFILE's mode instead of MODE values

RFILEのモードをMODE値の代わりに使う。とのこと。RFILEってなんじゃい。
ちょっと実験。

$ chmod --reference=hoge fuga

とやると、hogeのpermissionでfugaを設定してくれるみたい。chownも同じ。それは便利だ。ということでこんな感じのスクリプトを作成。

#!/bin/bash
for i in `cat filelist`
do
    if [ -e /home/foo/baa_bak/$i ] ; then
        chmod --reference=/home/foo/baa_bak/$i /home/foo/baa/$i
        chown --reference=/home/foo/baa_bak/$i /home/foo/baa/$i
    fi
done