¿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.

Jon Winstanley
fuente

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}'
miku
fuente
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
JB
fuente
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"
ghostdog74
fuente
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' *
Mohd Abdul Mujib
fuente
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
usuario224243
fuente
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
Erick Gonzalez
fuente
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.

Evan Langlois
fuente
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}"
}
Curtis Blackwell
fuente