Ok, ich habe die "chmod" -Manpages für Mac OS X, BSD und Linux noch einmal gelesen und ein paar Experimente durchgeführt. Folgendes habe ich über symbolische Modi gelernt. Es kann kompliziert werden, aber es lohnt sich zu verstehen:
- Die allgemeine Form ist Klausel [, Klausel …], wobei:
- Klausel : = [ugoa] [+ - =] [rwxXstugo]
- [ugoa] ( who ) (mehrere angeben) bedeutet, dass die Berechtigung für Benutzer, Gruppen, andere oder alle festgelegt wird. Wenn nichts angegeben ist, ist der Standardwert 'a', aber die umask ist in Kraft.
- [+ - =] ( Aktion ) (eine angeben) bedeutet:
- + bedeutet, dass die angegebenen Berechtigungen zu den bereits gültigen Berechtigungen hinzugefügt werden
- - bedeutet, dass die angegebenen Berechtigungen aus den bereits gültigen Berechtigungen entfernt werden
- = bedeutet, dass die Berechtigungen auf die angegebenen Berechtigungen gesetzt werden und alle anderen gelöscht werden
- [rwxXstugo] ( Berechtigung ) (geben Sie ein Vielfaches von rwxXst ODER eines von ugo an) legt die Berechtigungen für die angegebenen Benutzer wie folgt fest:
- r - lesen
- w - schreiben
- x - ausführen / suchen
- X - Ausführen / Suchen, wenn das Verzeichnis ODER ein Ausführungsbit bereits gesetzt wurde.
- s - suid oder sgid
- t - klebrig
- u - Benutzerberechtigung kopieren
- g - Gruppenberechtigung kopieren
- o - andere Erlaubnis kopieren
So würde zum Beispiel a+x
eine Datei von jedem ausführbar gemacht. a+X
würde eine Datei für alle ausführbar machen, WENN sie für alle ausführbar gewesen wäre.
a+x
würde ein Verzeichnis für alle durchsuchbar machen. a+X
würde auch ein Verzeichnis für alle durchsuchbar machen.
Der Hauptunterschied zwischen BSD und Linux besteht darin, dass bei BSD die Ermittlung auf der Grundlage der Berechtigungen der Datei erfolgt, bevor chmod ausgeführt wurde. Unter Linux erfolgt die Ermittlung unmittelbar vor der Ausführung der + X-Klausel.
Mit BSD a-x,a+X
würde die Kombination die Ausführungs- / Suchberechtigung entfernen und dann ein Verzeichnis für alle durchsuchbar machen und eine Datei für alle ausführbar machen, wenn sie ursprünglich für alle ausführbar gewesen wäre.
a-x,a+X
Würde unter Linux die Ausführungs- / Suchberechtigung entfernen und dann ein Verzeichnis für alle durchsuchbar machen, während eine Datei für niemanden ausführbar bleibt.
Hier ein konkretes Beispiel: Auf einer BSD-Maschine: Ein Verzeichnis, eine ausführbare Datei und eine nicht ausführbare Datei:
drwxr-x--- 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--- 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Beachten Sie, dass sowohl das Verzeichnis als auch "fie" vom Benutzer ausführbar / durchsuchbar sind, jedoch nicht von anderen.
Jetzt führen wir aus chmod a-x,a+X *
. Die erste Klausel entfernt das Ausführungs- / Suchbit von allen Benutzern für alle Dateien, die zweite Klausel fügt es jedoch für "fee" und "fie" wieder hinzu. "fee", weil es sich um ein Verzeichnis handelt, und "fie", weil es zu Beginn mindestens ein ausführbares Bit enthält.
drwxr-x--x 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--x 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Ich hatte das gleiche Ergebnis ausgeführt chmod -x+X
.
Fazit: Jak Gibbs Lösung wird unter Linux funktionieren, aber für BSD müssten Sie zwei Durchgänge durchführen.
Ich habe dies nicht auf SVr4 oder anderen Unix-Varianten getestet.