È possibile quando si elenca una directory per visualizzare autorizzazioni unix numeriche come 644 anziché l'output simbolico -rw-rw-r--
Grazie.
È possibile quando si elenca una directory per visualizzare autorizzazioni unix numeriche come 644 anziché l'output simbolico -rw-rw-r--
Grazie.
Risposte:
quasi può ..
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
tuo comando stampa i permessi come767
Il più vicino a cui riesco a pensare (mantenendolo abbastanza semplice) è stat
, supponendo che tu sappia quali file stai cercando. In caso contrario, *
puoi trovarne la maggior parte:
/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...
Gestisce sticky, suid e company out of the box:
$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
stat -f '%A %N' *
fa la stessa cosa su un Mac (FreeBSD)
stat
non è ls
quindi questa non è la risposta corretta. Tuttavia, credo che questa sia la risposta corretta nel contesto dell'output desiderato. Se awk
è consentito in una pipe, find
dovrebbe essere consentito dove stat
viene chiamato -exec
; quindi puoi usarlo stat
direttamente senza*
stat -c '%a %n' * **/*
.
Puoi usare il seguente comando
stat -c "%a %n" *
Inoltre puoi usare qualsiasi filename
o directoryname
invece di *
ottenere un risultato specifico.
Su Mac, puoi usare
stat -f '%A %N' *
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
man stat
macOS 10.14.4, il comando dovrebbe essere stat -f "%Lp %N" *
. %Lp
sembra stampare la stessa cosa di %A
.
@The MYYN
wow, bello awk! Ma che dire di suid, sgid e sticky bit?
Devi estendere il tuo filtro con s, altrimenti non contano e ottieni un risultato sbagliato. Per calcolare il numero ottale per questi flag speciali, la procedura è la stessa ma l'indice è a 4 7 e 10. i flag possibili per i file con il set di bit di esecuzione sono ---s--s--t
amd per i file senza set di bit di esecuzione sono---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
}'
Per il test:
touch blah
chmod 7444 blah
comporterà:
7444 -r-Sr-Sr-T 1 cheko cheko 0 2009-12-05 01:03 blah
e
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;}'"
Utilizzare questo per visualizzare i valori di autorizzazione numerici Unix (valori ottali) e il nome del file.
stat -c '%a %n' *
Utilizzare questo per visualizzare i valori di autorizzazione numerici Unix (valori ottali) e il bit sgid e sticky della cartella, il nome utente del proprietario, il nome del gruppo, la dimensione totale in byte e il nome del file.
stat -c '%a %A %U %G %s %n' *
Aggiungi %y
se hai bisogno del tempo dell'ultima modifica in formato leggibile. Per ulteriori opzioni vedere stat .
Versione migliore usando un alias
L'uso di un alias è un modo più efficiente per ottenere ciò di cui hai bisogno e include anche il colore. Di seguito vengono visualizzati i risultati organizzati per primi nelle directory di gruppo, visualizzati a colori, dimensioni di stampa in formato leggibile (ad es. 1K 234M 2G), modifica il tuo ~/.bashrc
e aggiungi un alias per il tuo account o globalmente modificando/etc/profile.d/custom.sh
La digitazione cls
mostra i nuovi risultati 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;}'"
Albero delle cartelle
Durante la modifica di bashrc o custom.sh includere il seguente alias per visualizzare una rappresentazione grafica in cui la digitazione lstree
visualizzerà la struttura della struttura di cartelle corrente
alias lstree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'"
Visualizzerebbe:
|-scripts
|--mod_cache_disk
|--mod_cache_d
|---logs
|-run_win
|-scripts.tar.gz
Non usi ls per ottenere le informazioni sui permessi di un file. Si utilizza il comando stat. Ti darà i valori numerici che desideri. "Unix Way" dice che dovresti inventare il tuo script usando ls (o 'echo *') e stat e qualunque altra cosa ti piaccia dare le informazioni nel formato che desideri.
Partendo dalla risposta scelta e dal suggerimento di utilizzare un alias , l'ho convertito in una funzione in modo che sia possibile passare una directory all'elenco.
# 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}'"