Wie rekonstruiere ich alle Verzeichnisse außer Dateien?

404092
Olivier Lalonde

Wie chmod 755 alle Verzeichnisse aber keine Datei (rekursiv)?

Umgekehrt, wie chmod nur Dateien (rekursiv) aber kein Verzeichnis?

532
Verwandte Themen: [Alle Dateien und Ordnerberechtigungen eines Verzeichnisses in 644/755 ändern] (http://stackoverflow.com/q/18817744/55075) in SO kenorb vor 8 Jahren 0
Verwandte Themen: [Alle Ordnerberechtigungen mit einem Befehl ändern] (https://unix.stackexchange.com/q/349053/23408) bei U & L. Scott vor 5 Jahren 0

8 Antworten auf die Frage

739
nik

Um rekursiv Verzeichnisse mit Lese- und Ausführungsrechten zu versehen:

find /path/to/base/dir -type d -exec chmod 755 {} + 

So geben Sie Dateien Leserechte rekursiv :

find /path/to/base/dir -type f -exec chmod 644 {} + 

Oder, wenn viele Objekte verarbeitet werden sollen:

chmod 755 $(find /path/to/base/dir -type d) chmod 644 $(find /path/to/base/dir -type f) 

Oder, um das chmodLaichen zu reduzieren :

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755  find /path/to/base/dir -type f -print0 | xargs -0 chmod 644 
Die ersten beiden Beispiele schlagen für Verzeichnisse mit zu vielen Dateien fehl: `-bash: / bin / chmod: Argumentliste zu lang. Der letzte Befehl funktioniert mit vielen Dateien, aber wenn Sie `sudo` verwenden, müssen Sie darauf achten, dass er vor xargs anstelle von chmod steht:` find / path / to / base / dir -type d -print0 | Sudo xargs -0 chmod 755 ` Agargara vor 6 Jahren 4
Beachten Sie auch, dass diese Befehle * inklusive * des Basisverzeichnisses sind. Im obigen Beispiel wird `dir` ebenfalls auf 755 gesetzt. CenterOrbit vor 6 Jahren 2
`chmod ... $ (find / path / to / base / dir -type ...)` schlägt bei Dateinamen mit Leerzeichen im Namen fehl. Dan Dascalescu vor 6 Jahren 1
Ich denke, die korrekteste (aber nicht schnellste) Version in Bezug auf Leerzeichen und Symbole in Dateinamen und Anzahl der Dateien ist `find / path / to / base / dir -type d -exec chmod 755 {} \;` (`find / Pfad / zu / base / dir -type f -exec chmod 644 {} \; `). Peter K vor 6 Jahren 5
266
bobince

Ein häufiger Grund für diese Art von Dingen ist, Verzeichnisse auf 755, aber Dateien auf 644 festzulegen. In diesem Fall gibt es einen etwas schnelleren Weg als das findBeispiel von Nik :

chmod -R u+rwX,go+rX,go-w /path 

Bedeutung:

  • -R = rekursiv;
  • u+rwX = Benutzer können lesen, schreiben und ausführen;
  • go+rX = Gruppe und andere können lesen und ausführen;
  • go-w = Gruppe und andere können nicht schreiben

Beachten Sie hierbei, dass Großbuchstaben Xanders als Kleinbuchstaben sind x. Im Handbuch können wir lesen:

Die Ausführungs- / Suchbits, falls es sich bei der Datei um ein Verzeichnis oder um eines der Ausführungs- / Suchbits handelt, werden in den ursprünglichen (unveränderten) Modus gesetzt.

Mit anderen Worten, chmod u + X in einer Datei setzt das Ausführungsbit nicht; und g + X setzt es nur, wenn es für den Benutzer bereits festgelegt ist.

-R = rekursiv; u + rwX = Benutzer können lesen, schreiben und ausführen; go + rX = group und andere können lesen und ausführen; go-w = Gruppe und andere können nicht schreiben släcker vor 14 Jahren 4
Dieses Muster kann die Situation nicht korrigieren, wenn jemand `chmod -R 777` ausgeführt hat, da die Option + X` die vorhandenen Ausführungsbits in Dateien nicht zurücksetzt. Durch die Verwendung von -x werden Verzeichnisse zurückgesetzt und ein Absteigen verhindert. Andrew Vit vor 11 Jahren 22
Aber wie beantwortet Ihr Befehl die Frage des OPs: Legen Sie je nach Datei / Verzeichnis unterschiedliche Zugriffssteuerungslisten fest. Ihr Befehl legt ACL unabhängig davon fest, ob es sich um ein Verzeichnis oder eine Datei handelt Ring Ø vor 11 Jahren 0
@ ring0: Ich habe nicht vor, die Frage wörtlich wie gestellt zu beantworten - Nik hat das schon ganz gut gemacht. Ich weise auf eine günstigere Lösung für den häufigsten Fall hin. Und ja, Sie erhalten mit 'X' unterschiedliche Berechtigungen für Dateien und Verzeichnisse, wie in den Kommentaren erläutert. bobince vor 11 Jahren 2
"go + rX, go-w" -> "go = rX", nicht wahr? Pierre de LESPINAY vor 9 Jahren 5
„chmod -Ru + rwX, g + rwX, o + rX *` hat mir das Leben beim Ausführen von Fedora, das Berechtigungen für die Bereitstellung von Dokumenten hat, sehr vereinfacht. Tiny Giant vor 9 Jahren 0
Sie können auch `chmod ux, u + X` in Kombination usw. verwenden, um Ausführungsbits für Dateien zu entfernen, sie jedoch für Verzeichnisse hinzuzufügen. w0rp vor 8 Jahren 4
12
mpolden

Wenn Sie sicherstellen möchten, dass die Dateien auf 644 gesetzt sind und sich im Pfad Dateien befinden, die das Ausführungsflag enthalten, müssen Sie zuerst das Ausführungsflag entfernen. + X entfernt das Ausführungsflag nicht aus Dateien, die es bereits haben.

Beispiel:

chmod -R ugo-x,u+rwX,go+rX,go-w path 

Update: Dies scheint fehlzuschlagen, da die erste Änderung (ugo-x) das Verzeichnis nicht ausführbar macht, sodass alle darunter liegenden Dateien nicht geändert werden.

Das funktioniert für mich und ich kann nicht verstehen, warum es nicht so wäre. (Sicher, wenn Sie nur "chmod -R ugo-x path" gemacht haben, könnte dies ein Problem sein. Der vollständige Befehl führt jedoch die Option "chmod u + rwX" für jedes Verzeichnis aus, bevor er versucht, in dieses Verzeichnis zu gelangen.) Ich glaube, dass "chmod R u = rw, go = r, ein + X-Pfad" ausreichend ist - und es ist kürzer. Scott vor 9 Jahren 1
Ich fand das richtig funktioniert; Es gab keine Probleme bei der Eingabe von Verzeichnissen Someone Somewhere vor 5 Jahren 0
4
francisbyrne

Ich beschloss, dafür selbst ein kleines Skript zu schreiben.

Rekursives chmod-Skript für Verzeichnisse und / oder Dateien - Gist

Im Grunde ist dies das rekursive chmod, es bietet jedoch auch ein bisschen Flexibilität für Befehlszeilenoptionen (setzt Verzeichnis- und / oder Dateiberechtigungen oder schließt beide aus, es setzt automatisch alles auf 755-644 zurück). Es werden auch einige Fehlerszenarien geprüft.

Ich habe darüber auch in meinem Blog geschrieben .

2
Peter K

Um rekursiv Verzeichnisse mit Lese- und Ausführungsrechten zu versehen:

find /path/to/base/dir -type d -exec chmod 755 {} \; 

So geben Sie Dateien Leserechte rekursiv :

find /path/to/base/dir -type f -exec chmod 644 {} \; 

Lieber spät als nie, lass mich die Antwort von Nik auf die richtige Seite bringen. Meine Lösung ist langsamer, aber es funktioniert mit einer beliebigen Anzahl von Dateien, mit beliebigen Symbolen in Dateinamen, und Sie können es normalerweise mit Sudo ausführen (aber beachten Sie, dass möglicherweise andere Dateien mit Sudo erkannt werden).

Dies ist ein *** Downgrade *** von [Nik Antwort] (https://superuser.com/q/91935/150988#91938). Warum glaubst du, dass Niks Antwort nicht stimmt? Scott vor 5 Jahren 0
@Scott, die Antwort von Nik schlägt mit (vey) einer großen Anzahl von Dateien fehl. Peter K vor 5 Jahren 0
Ich bin zu 99% sicher, dass Sie sich irren. Können Sie Belege für Ihre Behauptung vorlegen? Scott vor 5 Jahren 0
Ja, es sieht so aus, als ob ich falsch liege. find ... + scheint die Zeile in mehrere Befehle aufzuteilen, schöner Fang! Peter K vor 5 Jahren 0
0
mic_e

Versuchen Sie dieses Python-Skript. Es müssen keine Prozesse gestartet werden, und es werden nur zwei Systemaufrufe pro Datei ausgeführt. Abgesehen von einer Implementierung in C wird dies wahrscheinlich der schnellste Weg sein (ich brauchte es, um ein Dateisystem von 15 Millionen Dateien zu reparieren, die alle auf 777 gesetzt waren).

#!/usr/bin/python3 import os for par, dirs, files in os.walk('.'): for d in dirs: os.chmod(par + '/' + d, 0o755) for f in files: os.chmod(par + '/' + f, 0o644) 

In meinem Fall war um das letzte chmod herum ein try / catch erforderlich, da das chmodding einiger spezieller Dateien fehlgeschlagen ist.

-1
Eduard Florinescu

Sie können auch verwenden tree:

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}' 

und wenn Sie den Ordner anzeigen möchten, fügen Sie ein Echo hinzu

 tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}' 
@Scott 1) ​​Sie haben Recht bei + x Ich habe 755 geändert; 2) 3) Um dieses Problem zu lösen, setze ich den Platzhalter in ein einfaches Anführungszeichen wie dieses '{}'. Eduard Florinescu vor 5 Jahren 0
@Scott Ich stimme zu, dass dies nicht die beste Antwort ist, ist aber langsam, wird aber hier für "didaktische" Zwecke verlassen. Die Kommentare werden weitere Erklärungen liefern. Außerdem können die Leute etwas über `xargs'-Probleme erfahren. Einfache Anführungszeichen in Dateinamen sind für viele Befehle und Skripts selbst ein Problem. Deshalb habe ich alle Dateien aufgelistet, die einzelne Anführungszeichen enthalten, und sie entfernt (die Anführungszeichen, die ich meine). Eduard Florinescu vor 5 Jahren 0
@Scott Auf meinen Systemen habe ich nach allen Dateien gesucht, die einfache Anführungszeichen enthielten, und die einzelnen Anführungszeichen ersetzt Eduard Florinescu vor 5 Jahren 0
@Scott Wie würden Sie die Tatsache beheben, dass xargs die einzelnen Anführungszeichen nicht richtig löst? Eduard Florinescu vor 5 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (https://chat.stackexchange.com/rooms/84264/discussion-between-eduard-florinescu-and-scott). Eduard Florinescu vor 5 Jahren 0
-2
user26528

Sie können das folgende Bash-Skript als Beispiel verwenden. Stellen Sie sicher, dass Sie ihm ausführbare Berechtigungen geben (755). Verwenden Sie einfach ./autochmod.sh für das aktuelle Verzeichnis oder ./autochmod.sh <dir>, um ein anderes Verzeichnis anzugeben.

#!/bin/bash  if [ -e $1 ]; then if [ -d $1 ];then dir=$1 else echo "No such directory: $1" exit fi else dir="./" fi  for f in $(ls -l $dir | awk ''); do if [ -d $f ];then chmod 755 $f else chmod 644 $f fi done 
Beeindruckend! So viele Probleme! (1) Wenn "$ 1" nicht null ist, aber nicht der Name eines Verzeichnisses ist (z. B. ein Tippfehler), wird "dir" ohne Nachricht auf "." Gesetzt. (2) "$ 1" sollte "$ 1" sein und "$ dir" sollte "$ dir" sein. (3) Sie müssen nicht `" ./ "` sagen; `". "` ist in Ordnung (und streng genommen brauchen Sie hier keine Anführungszeichen). (4) Dies ist keine rekursive Lösung. (5) Auf meinem System ist ls -l… | awk '' `erhält die Änderungszeiten der Dateien. Sie benötigen ``, um das erste Wort des Dateinamens zu erhalten. Und selbst dann (6) werden Dateinamen mit Leerzeichen nicht behandelt. … Scott vor 9 Jahren 2
… Und zu guter Letzt (∞) wenn sich dieses Skript im aktuellen Verzeichnis befindet, wird es chit _self_ bis 644 sein und sich somit nicht ausführbar machen! Scott vor 9 Jahren 1