私は台本を見ました。
echo 'rwxrwxrw-' | perl -ne 'BEGIN{sub conv{ chomp(my $ins=shift); my $k=0; for(my $i=0;$i<=8;$i++) { my $tmps = ( substr($ins, $i, 1) =~ /[rwx]/ ); $k+= ( $tmps*(2**(8-$i)) ); }; if ($k) { sprintf(" %0o ", $k); } else { "??" ; }; }; } print(conv($_)."\n");'
本当に素晴らしいですが、粘着性のあるビット、suid、sgidなどの追加の権限がありません。スクリプトに含めていただきありがとうございます。
答え1
これはバッシュです:
perms="rwxr-xr-x"
p=0
for ((i=0; i<${#perms}; i++)); do
((p <<= 1))
[[ ${perms:i:1} == "-" ]] || ((p += 1))
done
printf "%o\n" $p # ==> 755
粘着性のあるビットなどを処理しません。これを行うには、次を使用します。stat
$ touch afile
$ chmod 2700 afile
$ ls -l afile
-rwx--S--- 1 jackman jackman 0 Nov 29 09:36 afile*
$ stat -c '%a' afile
2700
Perlには以下の機能が組み込まれています。stat
機能:
$ perl -e '@fields = stat "afile"; printf "%04o\n", $fields[2] & 07777'
2700
答え2
stat
Sticky、setuid、setgidを扱うとき(扱いが難しい場合でも)を使用する必要はなく、BASHismも必要ありません。 BASHのない非常に古いUNIXの/ tmpの例:
ls -ld /tmp | \
tee /dev/stderr | \
awk '{ k=0; for(i=0; i<=8; i++) k+=((substr($1, i+2, 1) ~ /[rwxs]/)*2^(8-i));
if ($1 ~ /^.{3}[Ss]/) k+=2048; if($1 ~ /^.{6}[Ss]/) k+=1024;
if ($1 ~ /[Tt]/) k+=512; if(k) printf("%04o\n",k) }'
drwxrwxrwt 3 sys sys 2560 Jul 16 12:39 /tmp
1776
言い換えれば、グレンジャックマンこのソリューションperl
stat
は単純化のために優先され、わずかに変更するだけでシェル変数でターゲットを受け入れることができます(同じ古いUNIXでも動作します)。
$ what="/tmp"
$ perl -s -e '@fields = stat "$f"; printf "%04o\n", $fields[2] & 07777' -- -f="$what"
1777
awkスクリプトは見つかったスクリプトに基づいています。ここ