L'elenco Unix può comandare "ls" output permessi chmod numerici?


179

È possibile quando si elenca una directory per visualizzare autorizzazioni unix numeriche come 644 anziché l'output simbolico -rw-rw-r--

Grazie.

Risposte:


339

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}'

31
Per crearlo come alias (esempio sotto: comando 'cls'), usa: 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

6
Ho copiato e incollato la linea da danger89 e ho scoperto che stranamente l'output è iniziato con% 0..o per riga, invece di dire 755. Se qualcuno lo incontra, la causa sembra essere un carattere nascosto tra lo 0 e o. Una volta eliminato, il comando viene impostato correttamente. Saluti!
Donna,

Penso che ci sia un problema di calcolo. Dopo che il chmod 777 dirtuo comando stampa i permessi come767
Julian F. Weinert il

Come menziona Donna, c'è anche un personaggio divertente (o 2) tra lo 0 e o, stranamente sembra che SO lo stia aggiungendo ...
nbsp

3
Questo non riesce a riconoscere i bit t e s. È necessario utilizzare il comando 'stat' per ottenere le informazioni sull'autorizzazione del file. Calcolarlo a mano porterà ad errori!
Evan Langlois,

148

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

20
Funziona benissimo con Linux, ho scoperto che stat -f '%A %N' *fa la stessa cosa su un Mac (FreeBSD)
rivisitazione del

2
Immagino che l'argomento sia che statnon è lsquindi questa non è la risposta corretta. Tuttavia, credo che questa sia la risposta corretta nel contesto dell'output desiderato. Se awkè consentito in una pipe, finddovrebbe essere consentito dove statviene chiamato -exec; quindi puoi usarlo statdirettamente senza*
javafueled

2
Questo è molto più breve e funziona al 100% su qualsiasi sistema
Kangarooo

Se vuoi usare stat per vedere i diritti in modo ricorsivo, sotto bash, usa stat -c '%a %n' * **/*.
Denis Chevalier,

61

puoi semplicemente usare GNU find.

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

Questo è un comando che posso davvero ricordare. Utile ed efficace.
Trento,

5
Questo dovrebbe anche avere -maxdepth 1un'opzione, altrimenti attraversa l'intero albero di directory.
Ruslan,

36

Puoi usare il seguente comando

stat -c "%a %n" *

Inoltre puoi usare qualsiasi filenameo directorynameinvece di *ottenere un risultato specifico.

Su Mac, puoi usare

stat -f '%A %N' *

1
Non ha funzionato per me. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb,

1
funziona su Ubuntu 14.04 .. per non doverlo mai ricordare, ho aggiunto un alias nel mio .bashrc: alias xxx = "stat -c '% a% n' *"
faeb187,

1
Utile! Come si estrae la% A che non compare nemmeno in man of stat su Mac?
Igonejack il

1
In realtà è un comando di FreeBSD, e il Mac si basa proprio su quello usandolo come kernel superiore.
Mohd Abdul Mujib,

Se utilizziamo solo le informazioni presentate in man statmacOS 10.14.4, il comando dovrebbe essere stat -f "%Lp %N" *. %Lpsembra stampare la stessa cosa di %A.
Cesar Andreu,

17

@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--tamd 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

3
+1 Grazie! L'ho abbreviato in un alias di 1 riga: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 ha portato ulteriormente l'idea di ripristinare i permessi dei file di lavoro: ysgitdiary.blogspot.fi/2013/04/…
Yordan Georgiev

5
Non usare lsmod come alias .. è un comando posix noto per elencare le mod del kernel.
Shadowbq

@JeroenWiertPluimers Questo mi sta dando un errore di sintassi da awk
Evan Langlois

@EvanLanglois, quindi fai una nuova domanda.
Jeroen Wiert Pluimers,

9

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' *

inserisci qui la descrizione dell'immagine

Aggiungi %yse 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 ~/.bashrce aggiungi un alias per il tuo account o globalmente modificando/etc/profile.d/custom.sh

La digitazione clsmostra 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;}'"

Alias ​​è la soluzione più efficiente

Albero delle cartelle

Durante la modifica di bashrc o custom.sh includere il seguente alias per visualizzare una rappresentazione grafica in cui la digitazione lstreevisualizzerà 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

4

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.


1

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}"
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.