Angenommen, ich habe die folgende Ausgabe von ls -l
:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
Wie kann ich dies automatisch in das von verwendete Format konvertieren chmod
?
Beispielsweise:
$ echo drwxr-xr-x | chmod-format
755
Ich verwende OS X 10.8.3.
permissions
ls
chmod
Tyilo
quelle
quelle
stat
. Hast Du es? (Es ist ein GNU-Tool, das hauptsächlich unter Linux und nicht unter Unix verfügbar ist.)stat foo
gibt16777219 377266 drwxr-xr-x 119 Tyilo staff 0 4046 "Apr 7 17:49:03 2013" "Apr 7 18:08:31 2013" "Apr 7 18:08:31 2013" "Nov 25 17:13:52 2012" 4096 0 0 /Users/Tyilo
. Ich sehe es nicht755
.Antworten:
Einige Systeme haben Befehle, um die Berechtigungen einer Datei als Nummer anzuzeigen, aber leider nichts portierbares.
zsh
hat einstat
(akazstat
) eingebautesstat
Modul:Dann ist das
mode
in$s[mode]
aber ist der Modus, das heißt Typ + Dauerwellen.Wenn Sie die in Oktal ausgedrückten Berechtigungen möchten, benötigen Sie:
BSDs (einschließlich Apple OS / X ) verfügen ebenfalls über einen
stat
Befehl.GNU find (von 1990 und wahrscheinlich früher) kann die Berechtigungen als Oktal ausgeben:
Später (2001, lange nach
zsh
stat
(1997), aber vor BSDstat
(2002)) wurde ein GNU-stat
Befehl mit einer anderen Syntax eingeführt:Lange zuvor hatte IRIX bereits einen
stat
Befehl (bereits 1994 in IRIX 5.3 vorhanden ) mit einer anderen Syntax:Wenn es keinen Standardbefehl gibt, ist die beste Option für die Portabilität die Verwendung von
perl
:quelle
Sie können GNU
stat
auffordern, die Berechtigungen im oktalen Format auszugeben, indem Sie die-c
Option verwenden. Vonman stat
:Also in deinem Fall:
Oder Sie können es sogar automatisieren, indem Sie
stat
die Ausgabe als gültigen Befehl formatieren :Die obige Lösung funktioniert auch für mehrere Dateien, wenn ein Platzhalter verwendet wird:
Funktioniert ordnungsgemäß mit Dateinamen, die Leerzeichen enthalten, schlägt jedoch bei Dateinamen mit einfachen Anführungszeichen fehl.
quelle
stat
habe keine-c
Option. Ich verwende OS X 10.8.3.stat -f 'chmod %p "%N"'
Um von der symbolischen in die oktale Notation zu konvertieren, habe ich mir einmal Folgendes ausgedacht :
Erweitert:
Das gibt die Oktalzahl aus der Ausgabe
ls -l
einer Datei zurück.quelle
dpkg
, um die Berechtigungen auf "wie installiert" zurückzusetzen. Vielen Dank für die Beantwortung der Frage, unabhängig davon, mit welchem Befehl die Berechtigungszeichenfolge erstellt wurde.Dieser Befehl unter Mac sh
Wenn Sie nur die numerische Berechtigung möchten, verwenden Sie nur% Lp.
beispielsweise:
Der 700 ist die numerische Berechtigung, die in chmod verwendet werden kann, und Desktop ist der Dateiname.
quelle
Hier ist eine Antwort auf Frage Y (ohne Rücksicht auf Frage X ), inspiriert von dem Versuch des OP:
Das Obige enthält ein paar Bashismen. Die folgende Version scheint POSIX-kompatibel zu sein:
Anmerkungen:
LC_COLLATE=C
weist die Shell an, Buchstabenfolgenmuster wie in der ASCII-Reihenfolge zu behandeln,[a-e]
entspricht also[abcde]
. In einigen Gebietsschemas (z. B. en_US)[a-e]
ist äquivalent zu[aAbBcCdDeE]
(dh[abcdeABCDE]
) oder vielleicht[abcdeABCD]
- siehe Warum unterscheidet die Bash-Case-Anweisung nicht zwischen Groß- und Kleinschreibung? )In der zweiten Version (der POSIX-kompatiblen):
Die erste
case
Aussage könnte umgeschrieben werden:Aber ich denke, die Art und Weise, wie ich es jetzt habe, macht es einfacher zu sehen, dass
l
der Brief anders gehandhabt wird. Alternativ könnte es umgeschrieben werden:da
r
,w
,x
,s
, undt
sind die einzigen Buchstaben , die jemals in einem Modus Zeichenfolge (außer erscheinen sollenl
).Die zweite
case
Aussage könnte umgeschrieben werden:um die Regel durchzusetzen, dass nur Buchstaben für die Angabe von Modusbits gültig sind. (Im Gegensatz dazu ist die prägnantere Version im vollständigen Skript faul und wird
-rw@rw#rw%
als äquivalent zu akzeptiertrwSrwSrwT
.) Alternativ könnte sie umgeschrieben werden:da
S
,s
,T
,t
,L
, undl
sind die einzigen Buchstaben , die jemals in einem Modus Zeichenfolge (außer erscheinen sollenr
,w
undx
).Verwendung:
Und ja, ich weiß, dass es besser ist, keinen
echo
Text zu verwenden, der damit beginnt-
. Ich wollte nur das Anwendungsbeispiel aus der Frage kopieren. Beachten Sie , offensichtlich, dass dies ignoriert die 0 - ten Zeichen (dh der führendend
/b
/c
/-
/l
/p
/s
/D
) und der 10. (+
/.
/@
). Es wird davon ausgegangen, dass die Betreuer vonls
niemalsr
/R
oderw
/W
als gültige Zeichen in der dritten, sechsten oder neunten Position definieren werden (und wenn dies der Fall ist, sollten sie mit Stöcken geschlagen werden ).Außerdem habe ich gerade den folgenden Code von cas unter So stellen Sie die standardmäßige Gruppen- / Benutzereigenschaft aller Dateien unter / var wieder her :
Ich habe diesen Code getestet (aber nicht gründlich), und es scheint zu funktionieren, abgesehen von der Tatsache, dass er nicht erkannt wird
l
oderL
an sechster Stelle steht. Beachten Sie jedoch, dass meine Antwort zwar in Bezug auf Einfachheit und Klarheit überlegen ist, meine jedoch kürzer ist (nur der Code in der Schleife wird gezählt; der Code, der eine einzelne-rwxrwxrwx
Zeichenfolge verarbeitet, ohne Kommentare zu zählen) durch Ersetzen durch .if condition; then …
condition && …
Natürlich sollten
ls
Sie die Ausgabe von nicht analysieren .quelle
#!/bin/sh
und benutzte dann ein paar Bashismen. Hoppla. Aber Sie haben ein paar verpasst: und scheinen auch kein POSIX zu sein (der Standard erwähnt überhaupt nichts und ist eichhörnchengeschützt auf und ). Umgekehrt habe ich nicht verwendet ; dass nur in erscheint cas ‚s Antwort, die ich zitierte von hier . Auch meine Antwort tut Griff ‚l‘ und ‚L‘, und ich bereits darauf hingewiesen , dass cas Antwort nicht.$((
variable++
))
$((
number
**
number
))
**
++
--
[[…]]
$((- -a))
wenn Sie eine doppelte Negation wünschen, und nicht, wenn Sie$((--a))
eine Dekrementierungsoperation meinen.seq
kein POSIX-Befehl ist. Möglicherweise können Sie den Operator $ {var #?} Verwenden, um Ausdruck zu vermeiden. Nicht, dass LC_COLLATE LC_ALL nicht überschreibt8
oder keine gibt9
und es keine Möglichkeit gibt, mehr als7
eine Dezimalstelle zu erreichen, kann er von der Scharade abziehen. …………………… (Dieser Kommentar ist eine Antwort auf einen Kommentar von Stéphane Chazelas, der verschwunden ist.)Wenn es Ihr Ziel ist, Berechtigungen von einer Datei zu übernehmen und sie auch einer anderen zu geben, hat GNU
chmod
bereits eine "Referenz" -Option dafür .quelle
chmod
wird die GNUchmod
dort nicht sein .Eine Alternative, wenn Sie die Berechtigungen speichern möchten, um sie später wiederherzustellen, oder für eine andere Datei, ist die Verwendung
setfacl/getfacl
, und es werden auch (POSIX-Entwurfs-) ACLs als Bonus wiederhergestellt.(Verwenden Sie unter Solaris
-f
anstelle von-M
).Sie sind zwar auf einigen BSDs verfügbar, jedoch nicht auf Apple OS / X, wo die ACLs
chmod
nur bearbeitet werden .quelle
Unter Mac OS X (10.6.8) müssen Sie verwenden
stat -f format
(da es sich tatsächlich um NetBSD / FreeBSD handeltstat
).Um nur eine symbolische Berechtigungszeichenfolge zu übersetzen, die von
ls -l
in octal erzeugt wurde (nur mit Shell-Builtins), siehe: showperm.bash .quelle