isto é bash:
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
Não manipula bits pegajosos, etc. Para isso, use 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
O Perl tem uma função stat
incorporada:
$ perl -e '@fields = stat "afile"; printf "%04o\n", $fields[2] & 07777'
2700