O comando da lista Unix 'ls' pode gerar permissões chmod numéricas?

179

É possível ao listar um diretório exibir permissões numéricas do unix, como 644, em vez da saída simbólica -rw-rw-r--

Obrigado.

Jon Winstanley
fonte

Respostas:

339

quase pode ..

 ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'
miku
fonte
31
Para criá-lo como um alias (exemplo abaixo: comando 'cls'), use: alias cls="ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\"%0o \",k);print}'"
danger89
6
Copiei e colei a linha do danger89 e descobri que estranhamente a saída começava com% 0..o por linha, em vez de dizer 755. Se alguém mais se deparar com isso, a causa parece ser um caractere oculto entre 0 e o. Uma vez excluído, o comando é configurado corretamente. Felicidades!
Donna
Eu acho que há um problema de cálculo. Após chmod 777 diro seu comando imprime permissões como767
Julian F. Weinert
Como Donna menciona, há um personagem engraçado (ou 2) entre o 0 e o, também, estranhamente, parece que isso é adicionando-o ...
nbsp
3
Isso falha ao reconhecer os bits t e s. Você deve usar o comando 'stat' para obter as informações de permissão do arquivo. Calculá-lo manualmente levará a erros!
Evan Langlois
148

O mais próximo que consigo pensar (mantendo-o bastante simples) é stat, supondo que você saiba quais arquivos você está procurando. Caso contrário, *encontre a maioria deles:

/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...

Ele lida com pegajoso, suid e empresa fora da caixa:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
JB.
fonte
20
Isso funciona muito bem no Linux, eu encontrei stat -f '%A %N' *faz a mesma coisa em um Mac (FreeBSD)
reevesy
2
Eu acho que o argumento é que statnão é, lsportanto, esta não é a resposta correta. No entanto, acredito que esta é a resposta correta no contexto da saída desejada. Se awkfor permitido em um tubo, finddeve ser permitido onde staté chamado -exec; então você pode usar statdiretamente sem*
javafueled
2
Isto é muito melhor mais curto e 100% trabalhando em qualquer sistema
Kangarooo
Se você deseja usar stat para ver os direitos recursivamente, em bash, use stat -c '%a %n' * **/*.
Denis Chevalier
61

você pode apenas usar o GNU find.

find . -printf "%m:%f\n"
ghostdog74
fonte
Este é um comando que realmente me lembro. Útil e eficaz.
Trent
5
Isso também deve ter -maxdepth 1opção, caso contrário, ele percorre toda a árvore de diretórios.
Ruslan
36

Você pode usar o seguinte comando

stat -c "%a %n" *

Além disso, você pode usar qualquer um filenameou em directorynamevez de *obter um resultado específico.

No Mac, você pode usar

stat -f '%A %N' *
Mohd Abdul Mujib
fonte
1
Não funcionou para mim. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb
1
obras sobre ubuntu 14,04 .. nunca tem que lembrar isso eu adicionei um alias no meu .bashrc: Alias xxx = "status -c '% a% n' *"
faeb187
1
Útil! Como você desenterra o% A que nem aparece no man of stat no Mac?
igonejack
1
Na verdade, é um comando do FreeBSD, e o Mac é construído com base nele, usando-o como kernel superior.
Mohd Abdul Mujib
Se usarmos apenas as informações apresentadas no man statmacOS 10.14.4, o comando deverá ser stat -f "%Lp %N" *. %Lpparece imprimir a mesma coisa que %A.
César Andreu
17

@The MYYN

uau, legal awk! Mas e quanto a suid, sgid e sticky bit?

Você precisa estender seu filtro com s e t, caso contrário eles não contarão e você obterá o resultado errado. Para calcular o número octal para esses sinalizadores especiais, o procedimento é o mesmo, mas o índice está em 4 7 e 10. os sinalizadores possíveis para arquivos com o conjunto de bits de execução são ---s--s--tamd para arquivos sem o conjunto de bits de execução.---S--S--T

ls -l | awk '{
    k = 0
    s = 0
    for( i = 0; i <= 8; i++ )
    {
        k += ( ( substr( $1, i+2, 1 ) ~ /[rwxst]/ ) * 2 ^( 8 - i ) )
    }
    j = 4 
    for( i = 4; i <= 10; i += 3 )
    {
        s += ( ( substr( $1, i, 1 ) ~ /[stST]/ ) * j )
        j/=2
    }
    if ( k )
    {
        printf( "%0o%0o ", s, k )
    }
    print
}'  

Para teste:

touch blah
chmod 7444 blah

vai resultar em:

7444 -r-Sr-Sr-T 1 cheko cheko   0 2009-12-05 01:03 blah

e

touch blah
chmod 7555 blah

darei:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah
user224243
fonte
3
+1 Obrigado! I encurtado para um alias de 1-line:alias "lsmod=ls -al|awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'"
Jeroen Wiert Pluimers
+1 levou a idéia adiante para restaurar as permissões de arquivos de trabalho: ysgitdiary.blogspot.fi/2013/04/…
Yordan Georgiev
5
Não use lsmod como um alias. Esse é um comando posix conhecido para listar mods do kernel.
Shadowbq # 6/14
@JeroenWiertPluimers Isso está me dando um erro de sintaxe do awk
Evan Langlois
@EvanLanglois, faça uma nova pergunta.
Jeroen Wiert Pluimers
9

Use isso para exibir os valores numéricos de permissão do Unix (valores octais) e o nome do arquivo.

stat -c '%a %n' *

Use isso para exibir os valores numéricos de permissão do Unix (valores octais) e o sgid e o bit adesivo da pasta, nome de usuário do proprietário, nome do grupo, tamanho total em bytes e nome do arquivo.

stat -c '%a %A %U %G %s %n' *

insira a descrição da imagem aqui

Adicione %yse precisar da hora da última modificação no formato legível por humanos. Para mais opções, consulte stat .

Versão melhorada usando um Alias

Usar um alias é uma maneira mais eficiente de realizar o que você precisa e também inclui cores. A seguir, são exibidos os resultados organizados pelos diretórios de grupo primeiro, exibidos em cores, tamanhos de impressão em formato legível por humanos (por exemplo, 1K 234M 2G) edite ~/.bashrce adicione um alias para sua conta ou globalmente editando/etc/profile.d/custom.sh

Digitar clsexibe os novos resultados do comando LS.

alias cls="ls -lha --color=always -F --group-directories-first |awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'"

Alias ​​é a solução mais eficiente

Árvore de pastas

Enquanto você estiver editando seu bashrc ou custom.sh, inclua o seguinte alias para ver uma representação gráfica em que a digitação lstreeexibirá sua estrutura atual da árvore de pastas

alias lstree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"

Seria exibido:

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz
Erick Gonzalez
fonte
4

Você não usa ls para obter as informações de permissão de um arquivo. Você usa o comando stat. Ele fornecerá os valores numéricos que você deseja. O "Modo Unix" diz que você deve inventar seu próprio script usando ls (ou 'eco *') e stat e o que mais você quiser para fornecer as informações no formato que você deseja.

Evan Langlois
fonte
1

Partindo da resposta escolhida e da sugestão de usar um alias , eu a converti em uma função para que seja possível passar um diretório para a lista.

# ls, with chmod-like permissions and more.
# @param $1 The directory to ls
function lls {
  LLS_PATH=$1

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