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」コマンドがなかったのでしょう。;-)