lsコマンドのパーミッションを数字形式で表示する

個人的な技術メモから抜粋シリーズ(シリーズ化するのか!?)第1弾。

見慣れている人でも注意深くみないと間違えやすいlsコマンドのパーミッション。 数字形式での表示をlsがサポートしていればいいのだが、類似するコマンドもない。 ということで、ls -lの行頭にあるパーミッションを数値で拡張表現してくれるperlスクリプトを作成した。

1行目にも数値が表示されるのはご愛嬌。

#!/bin/perl

#
# define functions.
#
sub retSnum($$){
        my $w = shift;
        my $f = shift;
        my $n = 0;

        if(($f eq 'U') && ($w eq 's' || $w eq 'S')){ $n = 4; }
        if(($f eq 'G') && ($w eq 's' || $w eq 'S')){ $n = 2; }
        if(($f eq 'S') && ($w eq 't' || $w eq 'T')){ $n = 1; }

        return $n;
}

sub retPnum($){
        my $w = shift;
        my $n = 0;

        if($w eq 'r'){ $n = 4; }
        if($w eq 'w'){ $n = 2; }
        if($w eq 'x'){ $n = 1; }
        if($w eq 's'){ $n = 1; }
        if($w eq 't'){ $n = 1; }

        return $n;
}



#
# main procedure.
#
while(<>){
        chomp;

        my $unit1       = 0;
        my $unit2       = 0;
        my $unit3       = 0;
        my $unit4       = 0;

        my $i = 0;
        foreach $w (split //, $_) {
                if($i > 9) { break; }
                if(1 <= $i && $i <=3 ) { $unit1 += retSnum($w,'U'); $unit2 += retPnum($w); }
                if(4 <= $i && $i <=6 ) { $unit1 += retSnum($w,'G'); $unit3 += retPnum($w); }
                if(7 <= $i && $i <=9 ) { $unit1 += retSnum($w,'S'); $unit4 += retPnum($w); }
                $i++;
        }

        printf("%d%d%d%d %s\n", $unit1, $unit2, $unit3, $unit4, $_);
}

以下、実行結果。

% ls -l /usr/bin/sudo | ./perm2num.pl
4511 -r-s--x--x  1 root  wheel  164896 10 31 15:51 /usr/bin/sudo

setuid、setgid、sticky bitにも対応してます。

このスクリプトを書いたのは数年前だけど、 今調べたら「stat」コマンドなるものでもっと簡単に実現できそう。 なぜ当時はこれを書いたのか? おそらく普段業務で利用するSolaris10には「stat」コマンドがなかったのでしょう。;-)