Isto deve lidar com qualquer conjunto de permissões, incluindo sticky, setuid e setgid ("s" significa "set" em vez de "sticky", que é "t"). Zeros à esquerda são impressos.
ls -lahd "$file" | awk '{k = 0; for (g=2; g>=0; g--) for (p=2; p>=0; p--) {c = substr($1, 10 - (g * 3 + p), 1); if (c ~ /[sS]/) k += g * 02000; else if (c ~ /[tT]/) k += 01000; if (c ~ /[rwxts]/) k += 8^g * 2^p} if (k) printf("%05o ", k)}'
Aqui está em várias linhas para facilitar a leitura:
awk '{k = 0;
for (g=2; g>=0; g--)
for (p=2; p>=0; p--) {
c = substr($1, 10 - (g * 3 + p), 1);
if (c ~ /[sS]/)
k += g * 02000;
else
if (c ~ /[tT]/)
k += 01000;
if (c ~ /[rwxts]/)
k += 8^g * 2^p
}
if (k) {
printf("%05o ", k);
}'
Demo:
$ touch foo
$ chmod 7654 foo
$ ls -l foo
-rwSr-sr-T 1 user user 0 2012-01-29 13:21 foo
$ ls -l foo | awk '...'
07654