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.

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}'

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

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"

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' *

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

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

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.


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}"
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.