Kann der Unix-Listenbefehl 'ls' numerische chmod-Berechtigungen ausgeben?


179

Ist es möglich, beim Auflisten eines Verzeichnisses numerische Unix-Berechtigungen wie 644 anstelle der symbolischen Ausgabe -rw-rw-r-- anzuzeigen?

Vielen Dank.

Antworten:


339

es kann fast ..

 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
Verwenden Sie zum Erstellen als Alias ​​(Beispiel unten: Befehl 'cls'): 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}'"
risk89

6
Ich habe die Zeile aus risk89 kopiert und eingefügt und festgestellt, dass die Ausgabe seltsamerweise mit% 0..o pro Zeile statt 755 begann. Wenn jemand anderes darauf stößt, scheint die Ursache ein verstecktes Zeichen zwischen 0 und o zu sein. Nach dem Löschen ist der Befehl gut eingerichtet. Prost!
Donna

Ich denke, es gibt ein Berechnungsproblem. Nachdem chmod 777 dirIhr Befehl Berechtigungen als767
Julian F. Weinert

Wie Donna erwähnt, gibt es ein lustiges Zeichen (oder 2) zwischen 0 und o, seltsamerweise sieht es so aus, als würde SO es hinzufügen ...
nbsp

3
Dies erkennt die Bits t und s nicht. Sie sollten den Befehl 'stat' verwenden, um die Dateiberechtigungsinformationen abzurufen. Die manuelle Berechnung führt zu Fehlern!
Evan Langlois

148

Am nächsten kann ich mir vorstellen (es einfach genug zu halten) stat, vorausgesetzt, Sie wissen, nach welchen Dateien Sie suchen. Wenn Sie dies nicht tun, *können Sie die meisten von ihnen finden:

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

Es handhabt klebrig, suid und Gesellschaft aus der Box:

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

20
Dies funktioniert gut unter Linux, ich fand, stat -f '%A %N' *macht das gleiche auf einem Mac (FreeBSD)
Reevesy

2
Ich denke , das Argument ist , dass statist nicht lsdeshalb ist dies nicht die richtige Antwort. Ich glaube jedoch, dass dies die richtige Antwort im Zusammenhang mit der gewünschten Ausgabe ist. Wenn awkes in einer Pipe finderlaubt statist , sollte es erlaubt sein, wo es gerufen wird -exec; dann können Sie statdirekt ohne*
javafueled

2
Dies ist viel besser kürzer und 100% funktioniert auf jedem System
Kangarooo

Wenn Sie stat verwenden möchten, um die Rechte unter Bash rekursiv anzuzeigen, verwenden Sie stat -c '%a %n' * **/*.
Denis Chevalier

61

Sie können einfach GNU find verwenden.

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

Dies ist ein Befehl, an den ich mich tatsächlich erinnern kann. Hilfreich und effektiv.
Trent

5
Dies sollte auch eine -maxdepth 1Option haben, da es sonst den gesamten Verzeichnisbaum durchläuft.
Ruslan

36

Sie können den folgenden Befehl verwenden

stat -c "%a %n" *

Sie können auch ein beliebiges filenameoder directorynameanstelle von verwenden *, um ein bestimmtes Ergebnis zu erhalten.

Auf dem Mac können Sie verwenden

stat -f '%A %N' *

1
Hat bei mir nicht funktioniert. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
Rschwieb

1
funktioniert unter Ubuntu 14.04 .. um mich nie daran erinnern zu müssen Ich habe einen Alias ​​in meine .bashrc eingefügt: alias xxx = "stat -c '% a% n' *"
faeb187

1
Hilfreich! Wie können Sie die% A ausgraben, die nicht einmal in man of stat auf dem Mac angezeigt werden?
Igonejack

1
Es ist eigentlich ein FreeBSD-Befehl, und der Mac baut zufällig darauf auf und verwendet ihn als oberen Kernel.
Mohd Abdul Mujib

Wenn wir nur die in man statmacOS 10.14.4 enthaltenen Informationen verwenden, sollte der Befehl lauten stat -f "%Lp %N" *. %Lpscheint das gleiche zu drucken wie %A.
Cesar Andreu

17

@ The MYYN

wow, schön awk! Aber was ist mit suid, sgid und sticky bit?

Sie müssen Ihren Filter mit s und t erweitern, sonst zählen sie nicht und Sie erhalten das falsche Ergebnis. Um die Oktalzahl für diese speziellen Flags zu berechnen, ist die Vorgehensweise dieselbe, aber der Index liegt bei 4, 7 und 10. Die möglichen Flags für Dateien mit gesetztem Ausführungsbit sind ---s--s--tamd für Dateien ohne gesetztes Ausführungsbit---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
}'  

Zum Test:

touch blah
chmod 7444 blah

wird darin enden, dass:

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

und

touch blah
chmod 7555 blah

wird geben:

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

3
+1 Danke! Ich habe es auf einen 1-Zeilen-Alias ​​gekürzt: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 nahm die Idee weiter, Arbeitsdateiberechtigungen wiederherzustellen: ysgitdiary.blogspot.fi/2013/04/…
Yordan Georgiev

5
Verwenden Sie lsmod nicht als Alias. Dies ist ein bekannter posix-Befehl zum Auflisten von Kernel-Mods.
Shadowbq

@JeroenWiertPluimers Das gibt mir einen Syntaxfehler von awk
Evan Langlois

@EvanLanglois also stell eine neue Frage.
Jeroen Wiert Pluimers

9

Verwenden Sie diese Option, um die numerischen Unix-Berechtigungswerte (Oktalwerte) und den Dateinamen anzuzeigen.

stat -c '%a %n' *

Verwenden Sie diese Option, um die numerischen Unix-Berechtigungswerte (Oktalwerte) und das sgid- und Sticky-Bit des Ordners, den Benutzernamen des Eigentümers, den Gruppennamen, die Gesamtgröße in Byte und den Dateinamen anzuzeigen.

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

Geben Sie hier die Bildbeschreibung ein

Fügen %ySie hinzu, wenn Sie die Zeit der letzten Änderung in einem für Menschen lesbaren Format benötigen. Weitere Optionen finden Sie unter stat .

Bessere Version mit einem Alias

Die Verwendung eines Alias ​​ist eine effizientere Methode, um das zu erreichen, was Sie benötigen, und es enthält auch Farbe. Im Folgenden werden Ihre Ergebnisse zuerst nach Gruppenverzeichnissen geordnet, in Farbe und Druckgrößen in lesbarem Format (z. B. 1K 234M 2G) angezeigt. Bearbeiten Sie Ihre ~/.bashrcund fügen Sie einen Alias ​​für Ihr Konto oder global durch Bearbeiten hinzu/etc/profile.d/custom.sh

Durch Eingabe clswerden Ihre neuen LS-Befehlsergebnisse angezeigt.

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 ​​ist die effizienteste Lösung

Ordnerbaum

Fügen Sie während der Bearbeitung von bashrc oder custom.sh den folgenden Alias ​​hinzu, um eine grafische Darstellung lstreeanzuzeigen, in der durch Eingabe Ihre aktuelle Ordnerbaumstruktur angezeigt wird

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

Es würde anzeigen:

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

4

Sie verwenden ls nicht, um die Berechtigungsinformationen einer Datei abzurufen. Sie verwenden den Befehl stat. Sie erhalten die gewünschten Zahlenwerte. Der "Unix-Weg" besagt, dass Sie Ihr eigenes Skript mit ls (oder 'echo *') und stat erfinden sollten und was auch immer Sie möchten, um die Informationen in dem gewünschten Format anzugeben.


1

Aufbauend auf der gewählten Antwort und dem Vorschlag, einen Alias ​​zu verwenden , habe ich ihn in eine Funktion konvertiert, sodass die Übergabe eines Verzeichnisses an die Liste möglich ist.

# 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}"
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.