¿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.
¿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:
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}'
chmod 777 dir
su comando imprima permisos como767
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
stat -f '%A %N' *
hace lo mismo en una Mac (FreeBSD)
stat
no es, ls
por 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 awk
se permite en una tubería, se find
debe permitir donde stat
se llama -exec
; entonces puede usar stat
directamente sin*
stat -c '%a %n' * **/*
.
Puedes usar el siguiente comando
stat -c "%a %n" *
También puede usar cualquiera filename
o en directoryname
lugar de *
obtener un resultado específico.
En Mac, puedes usar
stat -f '%A %N' *
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
man stat
macOS 10.14.4, entonces el comando debería ser stat -f "%Lp %N" *
. %Lp
parece imprimir lo mismo que %A
.
@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--t
amd 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
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 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' *
Agregue %y
si 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 ~/.bashrc
y agregue un alias para su cuenta o globalmente editando/etc/profile.d/custom.sh
Al escribir, se cls
muestran 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;}'"
Árbol de carpetas
Mientras edita su bashrc o custom.sh, incluya el siguiente alias para ver una representación gráfica donde la escritura lstree
mostrará 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
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.
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}"
}
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}'"