指定したファイルのパーミションを取得する

| | コメント(2) | トラックバック(0)

カテゴリ:

指定したファイルがどういう権限をもっているかを、
Perlで知る方法です。
パーミッションを変更するのは chmodでできますし、
パーミッションをみるなら`ls -l`とかすれば見えることはみえるんですが、
もっと単刀直入にできないかなと。

Perlの組み込み関数「 stat 」を使えばひとまずその情報は取得出来ます。

my @stats = stat $file;
 
# 0  dev      ファイルシステムのデバイス番号
# 1  ino      iノード番号
# 2  mode     ファイルモード
# 3  nlink    このファイルへのハードリンク数
# 4  uid      ファイルの所有者のユーザID( 数字 )
# 5  gid      ファイルの所有者のグループID( 数字 )
# 6  rdev     デバイス識別子
# 7  size     ファイルのサイズ( バイト )
# 8  atime    最終アクセスしてからの経過したエポック時からの秒数
# 9  mtime    最終更新してからの経過したエポック時からの秒数
# 10 ctime    iノードが変更されてから経過したエポック時からの秒数
# 11 blksize  ファイルの読み書きに適切だと考えられるブロックサイズ
# 12 blocks   割り当てられている実際のブロック数

参考:ファイルの詳細な情報を取得する - stat関数 - サンプルコードによるPerl入門

これだとパーミッションの情報以外にもいろいろな情報が取得されて、3番目がパーミッションの情報であるファイル・モードです。(配列添字だと2)

他の情報はいらないので、ファイル・モードの情報だけ取り出すときは、
例えば下記のようにします。

my $mode = [ stat $file ]->[2];

Perl初心者にはこの表現は難しいとおもいますが、
stat $file とやると配列が返ってくるので、そいつをいきなり [ ] で受けとって、
無名配列化し、その3番目の要素(添字は2)にアクセスするという感じです。
やってることは下記と同じです。

my @stats = stat $file;
my $mode = $stats[2]

あるいは

my @stats = stat $file;
my $mode = [ @stats ]->[2]

または、無名配列化しないで受け取ってもいいです。

my $mode = ( stat $file )[2];

そうやって取得したモードはそのまま表示しても見慣れたパーミッション情報には
ならないので、マスクをかけてわかるようにします。

printf "Permissions are %04o\n", $mode & 07777;

参考:perlfunc - search.cpan.org #stat

( Perlの演算子「 & 」 はビットごとのAND ref

あるいは、モジュール「 Fcntl ':mode'; 」を使うことで、
もう少し簡単になります。
Fcntl モジュールは標準モジュールなので、わざわざインストールする必要がありません。

use Fcntl ':mode';
 
...略...
 
printf ("%o\n", S_IMODE($mode); #644というように8進表示
printf ("%b\n", S_IMODE($mode); #101100101という風に2進表示

参考:ファイルパーミッションを調べる - サンプルコードによるPerl入門

わざわざマスクをかけなくても、8進数表示したものの下三桁を取得するのでも
よいみたいです?(マスク不要なの?)

my $mode = ( stat $file )[2];
$p = substr( (sprintf "%03o", $mode), -3); #644というように8進表示

参考:ファイルパーミッションの取得 - Perl表技集

File::chmodというモジュールがありますが、
こちらは標準ではないのでインストールが必要になります。
このモジュールの getmod というメソッドを使えば、
もっと端的にパーミッションを取得できそうです。

File::chmod - Implements symbolic and ls chmod modes - metacpan.org

トラックバック(0)

このブログ記事を参照しているブログ一覧: 指定したファイルのパーミションを取得する

このブログ記事に対するトラックバックURL: https://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/1085

コメント(2)

>tokuhiromさん

ものすごく遅くなってしまいましたが、コメントありがとうございます。

File::statモジュールは当時の僕には使い方がわからず、少し調べてからお返事しようと思っていたらずるずると遅くなってしまいました。

ともかくありがとうございます。

http://search.cpan.org/~rjbs/perl-5.18.2/lib/File/stat.pm

標準モジュールである File::stat をつかうことで、すこしわかりやすくかくことができます。

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2013年4月25日 12:24に書いたブログ記事です。

ひとつ前のブログ記事は「SQLiteの命名規則」です。

次のブログ記事は「ファイルのユーザー名とグループ名を取得する」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。