LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-05-31

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

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

パーミッション情報を確認したければ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の範囲にないコマンドは、ブツクサブツクサ……。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4