Frage Wie rekursiv chmod alle Verzeichnisse außer Dateien?


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

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


517
2018-01-06 01:56


Ursprung


Verbunden: Ändern Sie alle Datei- und Ordnerberechtigungen eines Verzeichnisses in 644/755bei SO - kenorb


Antworten:


Rekursiv geben Verzeichnisse Lese- und Ausführungsrechte:

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

Rekursiv geben Dateien Leseberechtigungen:

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

Oder wenn es viele Objekte zu verarbeiten gibt:

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

Oder, um zu reduzieren chmod Laichen:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

720
2018-01-06 01:58



Die ersten beiden Beispiele schlagen bei Verzeichnissen mit zu vielen Dateien fehl: -bash: /bin/chmod: Argument list too long. Der letzte Befehl funktioniert mit vielen Dateien, aber bei Verwendung sudo man muss vorsichtig sein vor xargs statt chmod: find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755 - Agargara
Auch zu beachten, diese Befehle sind inklusive der Basis dir. Also im obigen Beispiel dir wird auch auf 755 gesetzt. - CenterOrbit
chmod ... $(find /path/to/base/dir -type ...) schlägt für Dateinamen mit Leerzeichen im Namen fehl. - Dan Dascalescu
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 /path/to/base/dir -type f -exec chmod 644 {} \;). - Peter K


Ein üblicher Grund für diese Art von Sache ist es, Verzeichnisse auf 755, aber Dateien auf 644 zu setzen. In diesem Fall gibt es einen etwas schnelleren Weg als Nik's find Beispiel:

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

Das Wichtige, was hier zu beachten ist, ist das Großbuchstabe X verhält sich anders als Kleinbuchstaben x. Im Handbuch können wir lesen:

Die Ausführungs / Such-Bits, wenn die Datei ein Verzeichnis oder eines der Ausführungs / Such-Bits ist, werden in dem ursprünglichen (unmodifizierten) Modus gesetzt.

Mit anderen Worten, chmod u + X für eine Datei wird das Ausführungsbit nicht setzen; und g + X wird es nur setzen, wenn es bereits für den Benutzer eingestellt ist.


261
2018-01-06 03:22



-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 - släcker
Dieses Muster wird die Situation nicht beheben, wenn jemand es getan hat chmod -R 777 seit der +X Die Option wird die vorhandenen Ausführungsbits für Dateien nicht zurücksetzen. Durch die Verwendung von -x werden Verzeichnisse zurückgesetzt und verhindert, dass sie in sie absteigen. - Andrew Vit
@ ring0: Ich habe nicht die Absicht, die Frage wörtlich zu beantworten - das hat Nik schon sehr gut gemacht. Ich weise auf eine billigere Lösung für den häufigsten Fall hin. Und ja, Sie erhalten unterschiedliche Berechtigungen für Dateien und Verzeichnisse mit X, wie in den Kommentaren erläutert. - bobince
go+rX,go-w -> go=rX nicht wahr? - Pierre de LESPINAY
Sie können auch verwenden chmod u-x,u+X in Kombination, usw., um Ausführungsbits für Dateien zu entfernen, aber sie für Verzeichnisse hinzuzufügen. - w0rp


Wenn Sie sicherstellen wollen, dass die Dateien auf 644 gesetzt sind und Dateien im Pfad vorhanden sind, die das Flag "execute" aufweisen, müssen Sie zuerst das Flag "execute" entfernen. + X entfernt das Ausführungs-Flag nicht von 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, so dass alle darunter liegenden Dateien nicht geändert werden.


12
2018-01-22 16:14



Das funktioniert für mich, und ich verstehe nicht, warum das nicht so wäre. (Klar, wenn du es nur getan hast chmod -R ugo-x pathDas könnte ein Problem sein. Aber der komplette Befehl wird das tun chmod u+rwX auf jedes Verzeichnis, bevor es versucht, in es herunterzusteigen.) Ich glaube jedoch, dass chmod R u=rw,go=r,a+X path ist ausreichend - und es ist kürzer. - Scott
Ich fand, das hat richtig funktioniert; Es gab keine Probleme mit der Eingabe von Verzeichnissen - Someone Somewhere


Ich habe mich entschieden, selbst ein kleines Drehbuch zu schreiben.

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

Es führt grundsätzlich das rekursive chmod aus, bietet aber auch ein wenig Flexibilität für Befehlszeilenoptionen (legt Verzeichnis- und / oder Dateiberechtigungen fest oder schließt beides aus, es setzt alles automatisch auf 755-644 zurück). Es prüft auch auf einige Fehlerszenarien.

Ich habe auch darüber geschrieben auf meinem Blog.


4
2017-09-18 14:00





Rekursiv geben Verzeichnisse Lese- und Ausführungsrechte:

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

Rekursiv geben Dateien Leseberechtigungen:

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

Besser spät als nie, lass mich Niks Antwort auf der Seite der Korrektheit verbessern. Meine Lösung ist langsamer, aber es funktioniert mit einer beliebigen Anzahl von Dateien, mit beliebigen Symbolen in Dateinamen, und Sie können es mit sudo normal ausführen (aber beachten Sie, dass es verschiedene Dateien mit sudo entdecken könnte).


3
2018-02-21 11:58





Probieren Sie dieses Python-Skript aus. Es erfordert keine Erstellung von Prozessen und führt nur zwei Systemaufrufe pro Datei aus. Abgesehen von einer Implementierung in C, wird es wahrscheinlich der schnellste Weg sein, es zu tun (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 ein try / catch um den letzten chmod herum erforderlich, da das chmodding einiger spezieller Dateien fehlgeschlagen ist.


0
2018-03-26 04:37





Sie können auch verwenden tree:

tree -faid /your_directory | xargs -L1 -I{} sudo chmod +x {}

-1
2018-02-16 09:34





Sie können das folgende Bash-Skript als Beispiel verwenden. Stellen Sie sicher, dass Sie ausführbare Berechtigungen haben (755). Verwenden Sie einfach ./autochmod.sh für das aktuelle Verzeichnis oder ./autochmod.sh <Verzeichnis>, 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 '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done

-2
2018-01-29 11:56



Beeindruckend! So viele Probleme! (1) Wenn $1 ist nicht null, aber ist dann nicht der Name eines Verzeichnisses (z. B. ist ein Tippfehler) dir wird eingestellt auf . ohne Nachricht (2) $1 sollte sein "$1" und $dir sollte sein "$dir". (3) Du musst es nicht sagen "./"; "." ist in Ordnung (und genau genommen brauchen Sie hier keine Anführungszeichen). (4) Dies ist keine rekursive Lösung. (5) Auf meinem System ls -l … | awk '{ print $8 }' Ruft die Änderungszeiten der Dateien ab. Du brauchst { print $9 } bekommen das erste Wort von der Dateiname Und selbst dann (6) verarbeitet dies keine Dateinamen mit Leerraum. ... - Scott
... Und, last but not least (∞), wenn dieses Skript im aktuellen Verzeichnis ist, wird es chmod  selbst bis 644, also macht sich selbst nicht ausführbar! - Scott