Frage Wie kann ich octal Dateiberechtigungen von der Befehlszeile erhalten?


Da ist ein chmod Befehl zum Festlegen von Dateiberechtigungen, aber kann ich Dateiberechtigungen im Oktalmodus (z. B. 755) über die Befehlszeile abrufen?


316
2018-06-17 08:04


Ursprung




Antworten:


Du kannst es versuchen

stat -c "%a %n" *

Ersetzen * mit dem relevanten Verzeichnis oder dem genauen Dateinamen, den Sie untersuchen möchten.

Von dem man-Seite von stat,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

Verwendung:

  • Mit Dateien:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Mit Ordnern:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(Referenz)


450
2018-06-17 08:08



auf Mac OS, verwenden stat -f '%A %a %N' * (Kredit: geeklog.adamwilson.info/article/58/...) - s2t2
Wenn Sie sich wohler fühlen ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends Looping auf die Ausgabe von ls ist eine schlechte Idee. Wenn Sie wirklich eine Schleife verwenden möchten, können Sie das tun for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Warum auf Mac OS ist alles leicht verändert (sogar in Unix-Iso-Utilities)? Gibt es einen tatsächlichen Grund dafür? - Vassilis
Bitte @hackel, sag uns, wie du dich wirklich fühlst. lol! - MikeSchinkel


Dateiberechtigungen in Linux können im oktalen Format mit dem Befehl Linux stat angezeigt werden.

Drücken Sie einfach Strg+Alt+T auf Ihrer Tastatur, um Terminal zu öffnen. Navigieren Sie beim Öffnen zu dem Verzeichnis, in dem Sie die Dateiberechtigungen im Oktalmodus suchen möchten.

stat -c '%A %a %n' *

% A Zugriffsrechte in lesbarer Form

% a Zugriffsrechte in oktal

% n Dateiname

Oktanzahl und Berechtigungen

Sie können die Oktalzahl verwenden, um den Modus / die Berechtigung darzustellen:

r: 4
w: 2
x: 1

Für den Dateibesitzer können Sie beispielsweise den Oktalmodus wie folgt verwenden. Lesen,   schreiben und ausführen (volle) Erlaubnis für eine Datei in oktal ist 0 + r + w + x =   0 + 4 + 2 + 1 = 7

Nur die Lese- und Schreibberechtigung für eine Datei in Oktal ist 0 + r + w + x = 0 + 4 + 2 + 0   = 6

Nur Lese- und Ausführungsrechte für eine Datei in Oktal sind 0 + r + w + x =   0 + 4 + 0 + 1 = 5

Verwenden Sie die obige Methode, um Berechtigungen für Gruppen und andere zu berechnen. Lass uns   Sagen Sie, dass Sie dem Besitzer die volle Erlaubnis geben wollen, lesen und ausführen   Erlaubnis zu gruppieren und nur die Erlaubnis für andere zu lesen, dann brauchen Sie   berechne wie folgt: Benutzer = r + w + x = 0 + 4 + 2 + 1 = 7 Gruppe =   r + w + x = 0 + 4 + 2 + 0 = 6 Andere = r + w + x = 0 + 0 + 0 + 1 = 1

Die effektive Erlaubnis ist 761.

Quelle: http://kmaiti.blogspot.com/2011/09/umask-concept.html


37
2018-06-17 08:14



Die ursprüngliche 0 steht auch für ein spezielles Bit: pastebin.com/6ymkFt71 - Braiam


Wie in "755" -artige Berechtigungen mit 'ls' durch Adam Courtemanche auf AgileAdam.comkönnen Sie erstellen ein Alias  lso das verhält sich wie ls -l aber verarbeitet leicht die Ausgabe1 um Berechtigungen auch in Oktal anzuzeigen. Dies fügt eine führende Spalte hinzu, die dreistellig zeigt2 oktale Berechtigungen. Wie geschrieben, funktioniert dies für die meisten Dateien und Verzeichnisse, aber es funktioniert nicht richtig, wenn der klebrig oder setuid / setgid Bits sind gesetzt.3

alias lso="ls -alG | 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}'"

Dies hat jedoch einen gravierenden Mangel techtonik  weist darauf hin. Sie Argumente können nicht übergeben werden dazu lso Alias ​​wie du möchtest das ls Befehlweil sie als zusätzliche Argumente herangezogen werden awk stattdessen. So kannst du nicht laufen lso in einer bestimmten Datei oder einem Verzeichnis, noch können Sie irgendwelche Optionen (wie -F, oder --color) zu lso.


Die Lösung ist zu definieren lso  Als ein Funktion anstatt ein Alias.

lso() { ls -alG "$@" | 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}'; }

Wenn du das interaktiv in deiner Shell ausprobierst, renne unalias lso Um den Alias ​​zu entfernen, können Sie dies entweder vor oder nach dem Definieren der Funktion tun. Wenn Sie es in eine Datei einfügen, die wie z ~/.bashrcnimm einfach die alias Linie und fügen Sie die Funktionsdefinition hinzu.

Warum funktioniert das? Im Gegensatz zu Aliasnamen, Bash Shell-Funktionen können Positionsparameter annehmend. h. Kommandozeilenargumente. "$@" wird auf die vollständige Argumentliste erweitertArgumente für die lso Funktion, an die übergeben werden soll ls. (Im Gegensatz zu einer Aliasdefinition wird ein Funktionskörper nicht in Anführungszeichen gesetzt. Daher war es notwendig, die \Zeichen vorher $ und ".)

Da kannst du Optionen an übergeben lso Wenn Sie auf diese Weise als Funktion definiert sind, möchten Sie möglicherweise die -a und -G Optionen aus der Definition - Sie können sie manuell in Fällen übergeben, in denen Sie sie möchten. (Das -l Option ist erforderlich für Details wie Dateiberechtigungen angezeigt werden überhauptEs gibt also keinen Vorteil, es zu entfernen.)

lso() { 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}'; }

Dank an techtonik zum Aufzeigen der Beschränkung beim Definieren lso als Alias ​​und motivierte mich daher, diesen Beitrag mit Material zu erweitern, um es stattdessen zu einer Funktion zu machen.


1Man beachte, dass dies zu missachten scheint die allgemeine Regel, die Ausgabe nicht zu analysieren ls. ls produziert sehr menschenlesbare Ausgabe; Dies führt zu Idiosynkrasien und Einschränkungen, die es im Allgemeinen als Eingabe für andere Befehle ungeeignet machen. In diesem Fall wir analysieren ls schon seit wir wollen das genaue Verhalten von ls außer unserem ein Änderung hinzugefügt.

2Eine Einschränkung dieses Alias, die auch für die darunter gezeigte Funktionsversion gilt und die als Fehler angesehen werden kann, besteht darin, dass sie nur drei Oktalziffern anzeigt selbst wenn die vierte oktale Ziffer Null ist. Wie jfmercer hat zu Recht hingewiesen, die oktalen Ziffern, die hier angezeigt werden, spiegeln nicht das Sticky-Bit, wenn vorhanden, noch Setuid- oder Setgid-Bits.

3Ernsthafter als nur die vierte oktale Ziffer nicht zu zeigen ist diese Methode geht davon aus sie sind nicht festgelegt, und wenn sie sind - wenn Sie sehen t, s, oder S in der Erlaubniszeichenfolge - dann sollten Sie die oktalen Ziffern ignorieren. Dies liegt daran, dass die Bits so aus der Berechtigungszeichenfolge abgeleitet werden, dass Sticky-Setuid- / Setgid-Bits nicht berücksichtigt werden.


33
2018-06-17 08:12



funktioniert nicht mit Verzeichnissen - awk: read error (Is a directory) - anatoly techtonik
@techtonik Danke für das Aufzeigen! Ich habe (endlich) diese Antwort aktualisiert, um eine Lösung dafür hinzuzufügen. - Eliah Kagan
Du kannst hinzufügen --color Parameter für Showfarben lso() { ls -alG "$@" --color | 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}'; } - tagplus5


Einfaches Erweitern vorheriger 'stat'-bezogener Antworten:

Sie können einfach ausführen:

stat <path_to_file>

Die Ausgabe enthält eine oktale Erlaubnis zusammen mit anderen Informationen.



Details (Statistikversion und Beispiel):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

Beachten Sie das: (0644/ -rw-r - r--)


17
2017-08-26 16:07





Für die Portabilität können Sie verwenden perl:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

Wenn Sie bemerken möchten, wenn ein Fehler auftritt, versuchen Sie Folgendes:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

6
2017-09-21 15:30



Die Lösung von @ cuonglm ist nicht nur portabel, sondern zeigt auch vier Oktalzeichen statt dreiund zeigt so den Zustand des "klebrigen Bits", der oft vergessen wird. - jfmercer


Sie können verwenden find mit dem -printf Aktion.

ls zeigt keine oktalen Berechtigungen, aber Sie können dies verwenden find-basierte Problemumgehung:

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

Um zum Beispiel mein Videos-Verzeichnis zu überprüfen:

$ find Videos -printf "%m:%f\n"
755:Videos

Das %m Formatbezeichner sagt dem -printf Aktion zum Drucken oktal Berechtigungen, während der %f Der Formatbezeichner bewirkt, dass der Dateiname gedruckt wird.

Sie können mehrere Dateinamen an übergeben find. Sie können sogar Globs (z. B. find * -printf "%m:%f\n").

Sie müssen keinen Test wie verwenden -name oder -iname; es genügt, die Namen der Dateien oder Verzeichnisse, an denen Sie interessiert sind, als Startpunkte zu übergeben find. Das heißt, geben Sie ihre Namen als Argumente unmittelbar nach dem Wort an find, wie oben gezeigt.

find gibt Ihnen eine große Kontrolle darüber, wie es die Ausgabe anzeigt. Insbesondere gibt es zwei Modifikationen, die Sie nützlich finden könnten:

  • Standardmäßig, find rekursiv Unterverzeichnisse, ähnlich wie ls -R. Wenn du nicht willst find Um die Unterverzeichnisse der Startpunkte zu besuchen, die Sie ihm übergeben haben, können Sie hinzufügen -maxdepth 0 (oder benutzen -maxdepth mit anderen Werten, um anzuzeigen, wie tief Sie möchten, dass es geht).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f zeigt nur einen Dateinamen, also wenn find muss rekursiv sein, um zu einer Datei zu gelangen, möglicherweise wissen Sie nicht, wo sie sich befindet. Um einen Pfad anzuzeigen, beginnend mit dem Startpunkt, unter dem die Datei gefunden wurde, verwenden Sie %p stattdessen.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

Sehen man find Weitere Informationen zur Verwendung des find Befehl.

Eine andere Methode (ls und awk)

Dies kann verwendet werden, um alle Verzeichnisdateien mit ihren Berechtigungen aufzulisten:

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

Dies ist im Wesentlichen derselbe Befehl wie in Adam Courtemanches lso alias, welche diese Antwort zitiert, laufe einfach als einzelner Befehl. Wenn Sie dies nur einmal oder in seltenen Fällen verwenden, sollten Sie es nicht als Alias- oder Shell-Funktion beschreiben.


2
2018-03-07 07:16