Linux
PowerShell

[Linux][Powershell]パーミッションを八進表記と記号表記で相互変換する

概要

Excelに書かれた大量の八進表記のパーミッションを記号表記に書き換える必要があったので、手っ取り早くPowershellで一括変換できるコードを書いてみた。ついでに逆変換も書いた。
いまいち影の薄いSUIDとかスティッキービットも考慮してます。
途中まではちゃんと2進数に変換したりしてアルゴリズム通りに変換しようとしてたけど、だんだんとif文てんこ盛りのごちゃごちゃしたコードになってしまったから、結局読みやすさ書きやすさ優先して総当りで順番に置換していく感じにした。

コード(gist)

SUIDとかの特殊な権限に関してはWikipediaに書いてあるので省略

使用しているPowershellのバージョンは5.0

簡単な解説

八進表記から記号表記に変換する場合

基本的なrwxへの変換は所詮8パターンしかないので、あらかじめ8個の数字と8個の文字列で対応表を作っておいて置換するだけ。

その後、特殊な権限への対応として、1文字目で指定された数字に対応した位置の実行権の部分をxからsやt(または-からSやT)に入れ替えているだけ。

妙に長くて冗長な雰囲気のするコードになったけど、まぁ読みやすくはあると思う。

記号表記から八進表記に変換する場合

こちらは先に特殊な権限への対応を先に行っておく必要がある。

特殊な権限が付く場合、実行権部分がxの代わりにs,t(または-の代わりにS,T)と書かれるため、s,tをxに、S,Tを-に置換しておく。
また、八進表記の1文字目は3つあるそれぞれの実行権を1,2,4としてフラグが立っている部分のみを合算した値になるため、単純な計算で求めることができる。

あとは、八進表記を記号表記に変換する場合と同じように、基本的な8パターンの変換を行うだけ。

余談

Wikipediaにも書いてあるけど、Linuxでパーミッションの確認するときはstatコマンドを使うと八進表記と記号表記の両方を表示できて便利

結果をワンライナーで出力することもできるし、ls -lをawkして頑張るより使い勝手も見栄えも良いと思う。

# 「ファイル名、パーミッション(八進)、パーミッション(記号)、所有者、所有グループ」をワンライナーで表示
stat PATH --printf "%n\t%a\t%A\t%U\t%G\t\n"