Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Вывод на экран прав доступа в восьмеричном формате


Автор: Arsk 27.8.2012, 20:57
Здравствуйте!
Подскажите, пожалуйста, каким образом можно перевести права доступа в восьмеричный формат?
Допустим, команда ls выводит на экран права доступа в формате, например, "-rwxr-xr-x", необходимо это преобразовать в восьмеричный формат...
Кто-нибудь знает?

Автор: tzirechnoy 28.8.2012, 00:51
файл octal.awk:
Код

#!/usr/bin/awk -f
BEGIN { FS="[ ]" }
function failc( pos, char, file ) {
        print "Unknown mode char at pos ",pos,":",char," file ",file ;
        exit 2
}
(FNR==1) ;
(FNR>1) {
        split($1,MODE,""); perm=0;
             if (MODE[2]=="r") {perm+=400}
        else if (MODE[2]!="-") {failc(2, MODE[2], $0)};
             if (MODE[3]=="w") {perm+=200}
        else if (MODE[3]!="-") {failc(3,MODE[3], $0)};
             if (MODE[4]=="x") {perm+=100}
        else if (MODE[4]=="s") {perm+=4100}
        else if (MODE[4]=="S") {perm+=4000}
        else if (MODE[4]!="-") {failc(4,MODE[4],$0)};
             if (MODE[5]=="r") {perm+=40}
        else if (MODE[5]!="-") {failc(5,MODE[5],$0)};
             if (MODE[6]=="w") {perm+=20}
        else if (MODE[6]!="-") {failc(6,MODE[6],$0)};
             if (MODE[7]=="x") {perm+=10}
        else if (MODE[7]=="s") {perm+=2010}
        else if (MODE[7]=="S") {perm+=2000}
        else if (MODE[7]!="-") {failc(7,MODE[7],$0)};
             if (MODE[8]=="r") {perm+=4}
        else if (MODE[8]!="-") {failc(8,MODE[8],$0)};
             if (MODE[9]=="w") {perm+=2}
        else if (MODE[9]!="-") {failc(9,MODE[9],$0)};
             if (MODE[10]=="x") {perm+=1}
        else if (MODE[10]=="t") {perm+=1001}
        else if (MODE[10]=="T") {perm+=1000}
        else if (MODE[10]!="-") {failc(10,MODE[10],$0)};
             if (MODE[11]=="+") {
                print "Unable to convert POSIX ACL to file mode for",$0;
                exit 2; }
        else if (MODE[11]!="")  {failc(11,MODE[11],$0)};
        $1="0"perm;
        print;
}


Использовать в стиле ls -lb |octal.awk
Досконально не тэстировал, наверняка есть много неочевидного.

Автор: Arsk 28.8.2012, 14:29
Цитата(tzirechnoy @ 28.8.2012,  00:51)
файл octal.awk:
Код

#!/usr/bin/awk -f
BEGIN { FS="[ ]" }
function failc( pos, char, file ) {
        print "Unknown mode char at pos ",pos,":",char," file ",file ;
        exit 2
}
(FNR==1) ;
(FNR>1) {
        split($1,MODE,""); perm=0;
             if (MODE[2]=="r") {perm+=400}
        else if (MODE[2]!="-") {failc(2, MODE[2], $0)};
             if (MODE[3]=="w") {perm+=200}
        else if (MODE[3]!="-") {failc(3,MODE[3], $0)};
             if (MODE[4]=="x") {perm+=100}
        else if (MODE[4]=="s") {perm+=4100}
        else if (MODE[4]=="S") {perm+=4000}
        else if (MODE[4]!="-") {failc(4,MODE[4],$0)};
             if (MODE[5]=="r") {perm+=40}
        else if (MODE[5]!="-") {failc(5,MODE[5],$0)};
             if (MODE[6]=="w") {perm+=20}
        else if (MODE[6]!="-") {failc(6,MODE[6],$0)};
             if (MODE[7]=="x") {perm+=10}
        else if (MODE[7]=="s") {perm+=2010}
        else if (MODE[7]=="S") {perm+=2000}
        else if (MODE[7]!="-") {failc(7,MODE[7],$0)};
             if (MODE[8]=="r") {perm+=4}
        else if (MODE[8]!="-") {failc(8,MODE[8],$0)};
             if (MODE[9]=="w") {perm+=2}
        else if (MODE[9]!="-") {failc(9,MODE[9],$0)};
             if (MODE[10]=="x") {perm+=1}
        else if (MODE[10]=="t") {perm+=1001}
        else if (MODE[10]=="T") {perm+=1000}
        else if (MODE[10]!="-") {failc(10,MODE[10],$0)};
             if (MODE[11]=="+") {
                print "Unable to convert POSIX ACL to file mode for",$0;
                exit 2; }
        else if (MODE[11]!="")  {failc(11,MODE[11],$0)};
        $1="0"perm;
        print;
}


Использовать в стиле ls -lb |octal.awk
Досконально не тэстировал, наверняка есть много неочевидного.

А на Си это можно написать?

Автор: tzirechnoy 28.8.2012, 23:51
Цитата
А на Си это можно написать?


Не возражаю. Пишыте.

Автор: bsa 28.8.2012, 23:57
Цитата(Arsk @  27.8.2012,  21:57 Найти цитируемый пост)
Подскажите, пожалуйста, каким образом можно перевести права доступа в восьмеричный формат?
Код
struct stat buf;
if (stat("/path/to/file", &buf)) {
   perror("stat failed");
   exit(1);
}
printf("file permissions is %04o\n", buf.st_mode & 07777);

Автор: rsm 1.9.2012, 09:25
Из bash:
Код

stat -c '%a' file

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)