É 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.
É 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:
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}'
chmod 777 dir
o seu comando imprime permissões como767
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
stat -f '%A %N' *
faz a mesma coisa em um Mac (FreeBSD)
stat
não é, ls
portanto, esta não é a resposta correta. No entanto, acredito que esta é a resposta correta no contexto da saída desejada. Se awk
for permitido em um tubo, find
deve ser permitido onde stat
é chamado -exec
; então você pode usar stat
diretamente sem*
stat -c '%a %n' * **/*
.
Você pode usar o seguinte comando
stat -c "%a %n" *
Além disso, você pode usar qualquer um filename
ou em directoryname
vez de *
obter um resultado específico.
No Mac, você pode usar
stat -f '%A %N' *
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
man stat
macOS 10.14.4, o comando deverá ser stat -f "%Lp %N" *
. %Lp
parece imprimir a mesma coisa que %A
.
@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--t
amd 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
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;}'"
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' *
Adicione %y
se 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 ~/.bashrc
e adicione um alias para sua conta ou globalmente editando/etc/profile.d/custom.sh
Digitar cls
exibe 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;}'"
Á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 lstree
exibirá 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
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.
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}"
}
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}'"