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.

Jon Winstanley
quelle

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}'
miku
quelle
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
JB.
quelle
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"
Ghostdog74
quelle
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' *
Mohd Abdul Mujib
quelle
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
user224243
quelle
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
Erick Gonzalez
quelle
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.

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