existe ls -l formatação numérica?

6

considere a saída deste comando ls -l:

$ ls -l /usr/bin | tail
-rwxr-xr-x 1 root root     105696 Oct 25  2014 zenity
-rwxr-xr-x 1 root root     188296 Oct 21  2013 zip
-rwxr-xr-x 1 root root      86096 Oct 21  2013 zipcloak
-rwxr-xr-x 1 root root      48459 Mar  3  2015 zipdetails
-rwxr-xr-x 1 root root       2953 Oct 29 10:45 zipgrep
-rwxr-xr-x 2 root root     166584 Oct 29 10:45 zipinfo

as permissões estão listadas nos simpáticos caracteres legíveis por humanos. Existe uma maneira de obter ls para produzir o equivalente numérico para essas permissões?

    
por j0h 10.11.2015 / 14:44

4 respostas

9

ls não tem esse sinalizador, mas o comando stat permite a exibição de permissões octal. Considere a saída de amostra para um arquivo de teste,

testdir:$ stat TESTER
  File: ‘TESTER’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 1197        Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2015-11-05 17:42:01.914917433 -0700
Modify: 2015-11-05 17:42:01.914917433 -0700
Change: 2015-11-05 18:41:04.463776180 -0700
 Birth: -

stat também tem --format flag, que permite "simular" ls -l :

testdir:$ stat --format="%a %h %U %G %s %y %n" * | head -n 3                   
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.918917452 -0700 Aaaaaaa.bbb - 0000003 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.922917471 -0700 Aaaaaaa.bbb - 0000004 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.930917509 -0700 Aaaaaaa.bbb - 0000005 tag tag_tag 9tag

A única limitação aqui é que o formato de hora não pode ser alterado e a saída de cores não pode ser adicionada.

Você pode sempre aliasar esse comando em .bashrc para algum comando mais curto, por exemplo, alias lsl2='stat --format="%a %h %U %G %s %y %n" *'

Como alternativa, criei uma pequena função que usa find e awk para formatação mais agradável

 function lsl2
   {
     find . -maxdepth 1 | sort |  xargs -I{} stat --format="%a %h %U %G %s %y %n" {}  | awk '{=substr(,1,5);    =" ";print}'
  }

Exemplo de saída

testdir:$ lsl2 | head -n 7
775 3 xieerqi xieerqi 4096 2015-11-05 22:20   .
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000003 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000004 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000005 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000006 tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000006 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000007 tag 9tag

testdir:$ type lsl2
lsl2 is a function
    
por Sergiy Kolodyazhnyy 10.11.2015 / 15:15
4

De acordo com o link , é não é possível.

Uma resposta a essa pergunta, no entanto, propõe uma maneira de "quase" conseguir isso:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/) \
         *2^(8-i));if(k)printf("%0o ",k);print}'

Você poderia fazer disso um alias para uso fácil - mas só eu não posso fazer isso.

    
por Tobias 10.11.2015 / 14:47
1

Aqui está um pipeline divertido

paste <(printf "%04d\n" $(stat -c '%a' *)) <(ls -l | sed 1d) | 
  sed -r 's/([[:digit:]]+)\t(.).........//' 
  • printf "%04d\n" $(stat -c '%a' *) - imprime os direitos de acesso octal com preenchimento zero para cada arquivo
  • ls -l | sed 1d - a listagem longa, menos a primeira linha "total 12345"
  • paste <(...) <(...) - obtém uma linha de cada substituição de processo e une-as a uma guia
  • sed -r 's/([[:digit:]]+)\t(.).........//' - substitui as permissões% legível de rwxrwxrwx pelo valor octal.
por glenn jackman 10.11.2015 / 15:14
1

Dê uma olhada no GNU find:

find -printf "%y %m %n %u %g %Ac %f\n" -maxdepth 1

Veja: man find

    
por Cyrus 10.11.2015 / 19:02