use Fcntl ':mode'; my %TYPE = (S_IFDIR,'d',S_IFCHR,'c',S_IFBLK,'b',S_IFREG,'-',S_IFLNK,'l', S_IFSOCK,'s'); sub o { my ($mode, $xr, $xid) = @_; (($mode & ($xr | $xid)) == ($xr | $xid)) ? 's' : ($mode & $xr) ? 'x' : ($mode & $xid) ? 'S' : '-'; } sub strmode { my ($mode) = @_; ($TYPE{$mode & S_IFMT} || '?') . (($mode & S_IRUSR) ? 'r' : '-') . (($mode & S_IWUSR) ? 'w' : '-') . o($mode, S_IXUSR, S_ISUID) . (($mode & S_IRGRP) ? 'r' : '-') . (($mode & S_IWGRP) ? 'w' : '-') . o($mode, S_IXGRP, S_ISGID) . (($mode & S_IROTH) ? 'r' : '-') . (($mode & S_IWOTH) ? 'w' : '-') . o($mode, S_IXOTH, S_ISVTX) } #### #!/usr/bin/perl -l sub i{'-'} sub o{$m&$_[0]?$m&$_[1]?'s':x:$m&$_[1]?S:i} print qw(? c d b - l s)[($m=(lstat)[2])>>13] ,$m&256?r:i ,$m&128?w:i ,o(64,2048) ,$m&32?r:i ,$m&16?w:i ,o(8,1024) ,$m&4?r:i ,$m&2?w:i ,o(1,512) ," $_"for@ARGV; #### #!/usr/bin/perl -l for$f(@ARGV){ $_=sprintf"%9b",($m=(lstat$f)[2])&511; y/01/\0\xff/; $_&=rwxrwxrwx; y/\0/-/; print qw(? c d b - l s)[$m>>13],"$_ $f" }