ファイルパーミッションを、chmodで使える形式で保存する


ファイルを一旦消した後で復元したい

何らかの都合でファイルを一旦消した後でパーミッションを復元したい場合、あるいはファイルのパーミッションを他の新規ファイルにもコピーしたい場合はないだろうか。

パーミッション情報を確認したければlsコマンド(-lオプション)を使い、設定したければchmodコマンドを使う。ところがls -lの出力文字列はchmodに使えない。人が手作業でやるならよいが、これじゃ自動化できないので、ls -lのパーミッション情報をchmodに流し込める形式に変換するシェルスクリプトを書いてみた。

できあがった変換シェルスクリプト

ちゃんと、setuid、setgid、stickyビットにも対応させた。

パーミッションを保存・復元するシェルスクリプト
# パーミッション情報をchmodで使える8進数で保存
mode=$(ls -l "$file"                                                | # ファイル情報取得
       awk '{print substr($1,2,9);}'                                | # パーミッション文字列抽出
       sed 's/..\(.\)..\(.\)..\(.\)/\1\2\3 &/'                      | # 3者の実行ビット文字を手前にコピー
       awk '{gsub(/[x-]/,"0",$1);gsub(/[^0]/,"1",$1);print $1 $2;}' | # 実行ビットが"-","x"以外ならビット立て
       tr 'STrwxst-' '00111110'                                     | # 残りは小文字ならビット立て
       xargs printf 'ibase=2;%s\n'                                  | # 得られた文字列を2進数と見なし……
       bc                                                           | # ……一旦10進数に変換
       xargs printf '%04o'                                          ) # 8進数化(4桁にゼロパディングしつつ)

# $fileに対して、あんなことこんなこと……

# 復元
chmod $mode "$file"

パズルとして見れば面白いけど、もっと簡単にできてほしいところ。

ちなみにstatコマンドを使うというのはナシ。表示形式が環境によってまちまちなのでスクレイピング面倒だし……。これだからPOSIXの範囲にないコマンドは、ブツクサブツクサ……。