¿El comando de lista Unix 'ls' puede generar permisos chmod numéricos?


179

¿Es posible cuando se enumera un directorio para ver permisos numéricos de Unix como 644 en lugar de la salida simbólica -rw-rw-r--

Gracias.

Respuestas:


339

casi puede ...

 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 crearlo como un alias (ejemplo a continuación: 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

66
Copié y pegué la línea desde danger89 y descubrí que, extrañamente, la salida comenzó con% 0..o por línea, en lugar de decir 755. Si alguien más se encuentra con esto, la causa parece ser un carácter oculto entre 0 y o. Una vez eliminado, el comando se configura muy bien. ¡Salud!
Donna

Creo que hay un problema de cálculo. Después de que chmod 777 dirsu comando imprima permisos como767
Julian F. Weinert

Como se menciona Donna, hay un personaje divertido (o 2) entre el 0 y o, también, extrañamente parece que también lo es de agregarlo ...
nbsp

3
Esto no reconoce los bits t y s. Debe usar el comando 'stat' para obtener la información de permiso de archivo. ¡Calcularlo a mano conducirá a errores!
Evan Langlois

148

Lo más cerca que puedo pensar (manteniéndolo lo suficientemente simple) es stat, suponiendo que sepa qué archivos está buscando. Si no lo hace, *puede encontrar la mayoría de ellos:

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

Maneja pegajoso, suid y compañía fuera de la caja:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo

20
Esto funciona muy bien en Linux, descubrí que stat -f '%A %N' *hace lo mismo en una Mac (FreeBSD)
reevesy

2
Supongo que el argumento es que statno es, lspor lo tanto, esta no es la respuesta correcta. Sin embargo, creo que esta es la respuesta correcta en el contexto de la salida deseada. Si awkse permite en una tubería, se finddebe permitir donde statse llama -exec; entonces puede usar statdirectamente sin*
javafueled

2
Esto es mucho más corto y funciona al 100% en cualquier sistema
Kangarooo

Si desea usar stat para ver los derechos de forma recursiva, en bash, use stat -c '%a %n' * **/*.
Denis Chevalier

61

puedes usar GNU find.

find . -printf "%m:%f\n"

Este es un comando que realmente puedo recordar. Útil y efectivo.
Trent

55
Esto también debería tener -maxdepth 1opción, de lo contrario atraviesa todo el árbol de directorios.
Ruslan

36

Puedes usar el siguiente comando

stat -c "%a %n" *

También puede usar cualquiera filenameo en directorynamelugar de *obtener un resultado específico.

En Mac, puedes usar

stat -f '%A %N' *

1
No funciono para mi. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb

1
funciona en ubuntu 14.04 .. para nunca tener que recordar esto He agregado un alias en mi .bashrc: alias xxx = "stat -c '% a% n' *"
faeb187

1
¡Servicial! ¿Cómo desenterrar el% A que ni siquiera aparece en man of stat en Mac?
igonejack

1
En realidad, es un comando de FreeBSD, y Mac simplemente se basa en usarlo como núcleo superior.
Mohd Abdul Mujib

Si solo usamos la información presentada en man statmacOS 10.14.4, entonces el comando debería ser stat -f "%Lp %N" *. %Lpparece imprimir lo mismo que %A.
Cesar Andreu

17

@The MYYN

wow, ¡qué bien! ¿Pero qué hay de suid, sgid y pegajoso?

Debe extender su filtro con syt, de lo contrario no contarán y obtendrá el resultado incorrecto. Para calcular el número octal para estos indicadores especiales, el procedimiento es el mismo, pero el índice está en 4 7 y 10. Los posibles indicadores para archivos con conjunto de bits de ejecución son ---s--s--tamd para los archivos sin conjunto de bits de ejecución.---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 prueba:

touch blah
chmod 7444 blah

resultará en:

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

y

touch blah
chmod 7555 blah

daré:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah

3
+1 ¡Gracias! Lo acorté a un alias de 1 línea: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 llevó la idea más allá para restaurar los permisos de archivos de trabajo: ysgitdiary.blogspot.fi/2013/04/…
Yordan Georgiev

55
No use lsmod como un alias ... ese es un comando posix conocido para enumerar las modificaciones del kernel.
shadowbq

@JeroenWiertPluimers Eso me está dando un error de sintaxis de awk
Evan Langlois

@EvanLanglois, así que haz una nueva pregunta.
Jeroen Wiert Pluimers

9

Use esto para mostrar los valores de permisos numéricos de Unix (valores octales) y el nombre del archivo.

stat -c '%a %n' *

Use esto para mostrar los valores de permisos numéricos de Unix (valores octales) y el bit sgid y adhesivo de la carpeta, el nombre de usuario del propietario, el nombre del grupo, el tamaño total en bytes y el nombre del archivo.

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

ingrese la descripción de la imagen aquí

Agregue %ysi necesita la hora de la última modificación en formato legible para humanos. Para más opciones ver estadísticas .

Mejor versión con un alias

Usar un alias es una forma más eficiente de lograr lo que necesita y también incluye color. A continuación, se muestran primero los resultados organizados por directorios de grupo, se muestran en color, se imprimen en formato legible para humanos (por ejemplo, 1K 234M 2G), edite ~/.bashrcy agregue un alias para su cuenta o globalmente editando/etc/profile.d/custom.sh

Al escribir, se clsmuestran los nuevos resultados del 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 ​​es la solución más eficiente.

Árbol de carpetas

Mientras edita su bashrc o custom.sh, incluya el siguiente alias para ver una representación gráfica donde la escritura lstreemostrará la estructura de árbol de carpetas actual

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

Mostraría:

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz

4

No utiliza ls para obtener la información de permiso de un archivo. Utiliza el comando stat. Le dará los valores numéricos que desea. La "Forma Unix" dice que debes inventar tu propio script usando ls (o 'echo *') y stat y cualquier otra cosa que quieras para dar la información en el formato que desees.


1

Partiendo de la respuesta elegida y la sugerencia de usar un alias , la convertí en una función para que sea posible pasar un directorio a la 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}"
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.