it-swarm.com.de

Wie entferne ich rekursiv Ausführungsberechtigungen aus Dateien, ohne Ordner zu berühren?

Ich habe ein Backup auf einem NTFS-Laufwerk erstellt, und dieses Backup hat sich wirklich als notwendig erwiesen. Das NTFS-Laufwerk hat jedoch die Berechtigungen durcheinander gebracht. Ich möchte sie wieder normal machen, ohne jede einzelne Datei manuell zu reparieren.

Ein Problem ist, dass plötzlich alle meine Textdateien Ausführungsberechtigungen erhalten haben, was falsch ist. Also habe ich versucht:

Sudo chmod -R a-x folder\ with\ restored\ backup/

Es ist jedoch falsch, da die Berechtigung x auch aus Verzeichnissen entfernt wird, wodurch sie unlesbar werden.

Was ist in diesem Fall der richtige Befehl?

48
gaazkam

Wenn Sie die Ausführungsberechtigungen für alle Benutzer in allen Ordnern festlegen können:

chmod -R -x+X *

Das -x entfernt Ausführungsberechtigungen für alle
Das +X fügt Ausführungsberechtigungen für alle hinzu, aber nur für Verzeichnisse.

Im Folgenden finden Sie eine Lösung, die find verwendet, um Ordner nicht wie gewünscht zu berühren.

74
Jak Gibb

Ok, ich habe die Manpages "chmod" für Mac OS X, BSD und Linux erneut gelesen und einige 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: goa] [+ - =] [rwxXstugo]
  • [ugoa] ( who ) (mehrere angeben) bedeutet, die Berechtigung für Benutzer, Gruppe, andere oder alle festzulegen. Wenn nicht angegeben, ist der Standardwert 'a', aber mask ist wirksam.
  • [+ - =] ( Aktion ) (bitte 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, die Berechtigungen auf die angegebenen Berechtigungen zu setzen und alle anderen zu löschen
  • [rwxXstugo] ( Berechtigung ) (Mehrfaches von rwxXst angeben OR eines von ugo) legt die Berechtigungen für den angegebenen Benutzer fest (s) wie folgt:
    • r - lesen
    • w - schreibe
    • x - ausführen/suchen
    • X - iff-Verzeichnis ausführen/suchen OR ein Ausführungsbit wurde bereits gesetzt.
    • s - suid oder sgid
    • t - klebrig
    • u - Benutzerberechtigung kopieren
    • g - Gruppenberechtigung kopieren
    • o - andere Erlaubnis kopieren

So zum Beispiel a+x würde eine Datei von jedem ausführbar machen. a+X würde eine Datei von jedem ausführbar machen, WENN sie von irgendjemandem 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 Bestimmung basierend auf den Berechtigungen der Datei erfolgt. == [- vorher chmod wurde ausgeführt. Unter Linux erfolgt die Bestimmung unmittelbar vor der Ausführung der + X-Klausel.

Also mit BSD die Kombination a-x,a+X würde die Berechtigung zum Ausführen/Suchen entfernen und dann ein Verzeichnis für alle durchsuchbar machen und eine Datei für alle ausführbar machen if sie war ursprünglich von allen ausführbar.

Unter Linux a-x,a+X würde 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 einem BSD-Computer: 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, nicht jedoch von anderen.

Jetzt führen wir chmod a-x,a+X *. Die erste Klausel entfernt das Execute/Search-Bit von allen Benutzern für alle Dateien, die zweite Klausel fügt es jedoch sowohl für "fee" als auch für "fie" wieder hinzu. "Gebühr", weil es ein Verzeichnis ist, und "Pfui", weil es zu Beginn mindestens ein ausführbares Bit hatte.

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 bei der Ausführung von chmod -x+X.

Fazit: Jak Gibbs Lösung funktioniert unter Linux, aber für BSD müssten Sie zwei Durchgänge machen.

Ich habe dies nicht auf SVr4 oder anderen Unix-Varianten getestet.

16
Edward Falk

Ein Weg, es zu tun:

find backup -type f -exec chmod 0644 {} +
10
Satō Katsura
 find backup ! -type l ! -type d -exec chmod a-x {} +

Würde die Ausführungsberechtigung für Dateien entfernen, die nicht vom Typ Verzeichnis (wie von Ihnen angefordert) oder symbolischer Link sind (Symlinks sind im Allgemeinen immer rwxrwxrwx und chmod würde sich auswirken das Ziel des Symlinks auf ihnen).

Beachten Sie, dass:

 find backup -type f -exec chmod a-x {} +

würde nur die Berechtigung von regulären Dateien ändern. Das würde Verzeichnisse und Symlinks ausschließen, aber auch Geräte, Named Pipes, Sockets und möglicherweise andere, abhängig vom System (obwohl im Fall einer Sicherung eines NTFS-Dateisystems durch das OP diese wahrscheinlich nicht vorhanden sind).

7

Verwenden Sie in zsh das Glob-Qualifikationsmerkmal ., um nur reguläre Dateien (ohne symbolische Links) abzugleichen, und D, um Punktdateien abzugleichen:

Sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Wenn die Befehlszeile zu lang ist, können Sie zargs verwenden:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- Sudo chmod a-x