it-swarm.com.de

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

Ist es beim Auflisten eines Verzeichnisses möglich, numerische Unix-Berechtigungen anzuzeigen, z. B. 644, anstatt der symbolischen Ausgabe -rw-rw-r--

Vielen Dank.

167
Jon Winstanley

Verwenden Sie diese Option, um die Oktalwerte (numerische chmod-Berechtigungen) und den Dateinamen anzuzeigen:

stat -c '%a %n' *

 enter image description here

Weitere Optionen finden Sie unter stat .

Eine effizientere Methode für die Verwendung eines Alias ​​finden Sie in meinem Kommentar unten.

301
miku

Am nächsten kann ich mir vorstellen, dass es stat ist, vorausgesetzt, Sie wissen, welche Dateien Sie suchen. Wenn Sie dies nicht tun, kann * die meisten davon finden:

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

Es behandelt klebrig, suid und company out of the box:

$ stat -c '%a %n' /tmp /usr/bin/Sudo
1777 /tmp
4755 /usr/bin/Sudo
138
JB.

sie können einfach GNU find verwenden.

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

Sie können den folgenden Befehl verwenden

stat -c "%a %n" *

Sie können auch eine beliebige filename oder directoryname anstelle von * verwenden, um ein bestimmtes Ergebnis zu erhalten.

Auf Mac können Sie verwenden 

stat -f '%A %N' *
28

Die MYYN

wow, Nice awk! Aber was ist mit suid, sgid und sticky bit? 

Sie müssen Ihren Filter um s und t erweitern, sonst werden sie nicht gezählt und Sie erhalten das falsche Ergebnis. Um die Oktalzahl für diese speziellen Flags zu berechnen, ist die Prozedur dieselbe, aber der Index befindet sich auf 4, 7 und 10. Die möglichen Flags für Dateien mit gesetztem Ausführungsbit sind ---s--s--t AMD 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
}'  

Für 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
14
user224243

Sie verwenden ls nicht, um die Berechtigungsinformationen einer Datei abzurufen. Sie verwenden den stat-Befehl. Sie erhalten die gewünschten numerischen Werte. Der "Unix-Weg" besagt, dass Sie Ihr eigenes Skript mithilfe von ls (oder 'echo *') und stat erstellen sollten, und wie auch immer Sie die Informationen in dem gewünschten Format angeben möchten.

4
Evan Langlois

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) sowie die sgid und das Sticky-Bit des Ordners, den Benutzernamen des Besitzers, den Gruppennamen, die Gesamtgröße in Byte und den Dateinamen anzuzeigen.

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

enter image description here

Fügen Sie %y Hinzu, wenn Sie den Zeitpunkt 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 die gewünschten Ergebnisse zu erzielen. Dazu gehört auch Farbe. Im Folgenden werden Ihre Ergebnisse zuerst nach Gruppenverzeichnissen geordnet, in Farbe angezeigt und die Druckgrößen in einem für Menschen lesbaren Format (z. B. 1K 234M 2G). Bearbeiten Sie Ihren ~/.bashrc Und fügen Sie einen Alias ​​für Ihr Konto oder global durch Bearbeiten von /etc/profile.d/custom.sh

Wenn Sie cls eingeben, werden die Ergebnisse Ihres neuen LS-Befehls 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 is the most efficient solution

Ordnerstruktur

Während Sie Ihren bashrc oder custom.sh bearbeiten, fügen Sie den folgenden Alias ​​hinzu, um eine grafische Darstellung zu erhalten, in der durch Eingabe von lstree Ihr aktueller Ordner angezeigt wird Baumstruktur

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
3
Erick Gonzalez

nein, es können nur numerische uids/guids gedruckt werden.

2
dusoft

tl; dr: Die schnelle Antwort auf die Frage lautet: Nein, ich kann keine numerischen Berechtigungen drucken. Verwenden Sie stat .

Erweiterte Berechtigungen gehen in der Übersetzung verloren, wenn Sie mit awk herumfummeln.

z.B:

$ ls -la /usr/local/src/
total 8
drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

Die vorgeschlagene Lösung würde dies drucken:

$ ls -la /usr/local/src | awk '{>
total 8
765 drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
765 drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

Welches ist absolut falsch.

stat dagegen macht es richtig:

$ stat /usr/local/src Datei: /usr/local/src Größe: 4096 Blöcke: 8 IO Block: 4096 Verzeichnis Gerät: 801h/2049d Inode: 917803 Links: 2 Zugriff: (2775/drwxrwsr-x) Uid: (0/root) Gid: (50/staff) Zugriff: 2018-10-24 12: 30: 58.197907324 +0900 Modifizieren: 2018-10-23 11: 18: 59.810677000 +0900 Änderung: 2018-10-23 11: 18: 59.810677000 +0900 Geburt: -

Bonus von Mann Status:

$ stat -c %a /usr/local/src
2775

Dies wurde auf dem Debian-Stall getestet.

0
Steve Clement

Aufbauend auf dem gewählten Antwort und dem Vorschlag, einen Alias ​​zu verwenden , habe ich ihn in eine Funktion umgewandelt, so dass ein Verzeichnis an die Liste übergeben werden kann.

# 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}"
}
0