Wie kann ich nur in Unterverzeichnissen chmod?

7

Gegeben der folgende Verzeichnisbaum:

.
├── d1
   └── workspace
├── d2
   └── workspace
├── d3
   └── workspace
├── d4
   └── workspace
└── d5
    └── workspace

Ich muss die Berechtigungen für alle workspaceVerzeichnisse wie folgt festlegen :

chmod -R 774 d1 / Arbeitsbereich
chmod -R 774 d2 / Arbeitsbereich
...

Wie kann ich die oben genannten Operationen in einem Befehl für alle workspaceVerzeichnisse ausführen ? Ich kann den folgenden Befehl ausführen:

chmod -R 774 *

Dies ändert jedoch auch den Modus der übergeordneten Verzeichnisse, was nicht erwünscht ist.

Meysam
quelle
774? Das macht nicht viel Sinn.
Michael Hampton
1
Das -4 am Ende bedeutet, dass jeder die Verzeichnisliste lesen kann, aber mit den darin enthaltenen Dateien nichts anderes tun kann. Bei einem Verzeichnis mit Gruppenschreibzugriff sind 775 (= jeder kann das Verzeichnis lesen und auf die Dateien zugreifen, wenn seine Berechtigungen dies zulassen) oder 770 (kein Zugriff auf andere Personen als den Eigentümer und die autorisierte Gruppe) die am häufigsten verwendeten Optionen.
TelcoM

Antworten:

17

Sie können Platzhalter im Verzeichnis der obersten Ebene verwenden.

chmod 774 d*/workspace

Um es genauer zu machen, können Sie den Platzhalter auch auf deine einzelne Ziffer beschränken.

chmod 774 d[0-9]/workspace

Ein allgemeinerer Ansatz könnte mit sein find.

find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;
Thomas
quelle
4
Vielleicht -type dzu Ihrem findBefehl hinzufügen ?
user1404316
Wie @ user1404316 hervorgehoben hat, ist es besser, das -type dArgument mit find zu verwenden, sodass nur Verzeichnisse zurückgegeben werden, anstatt zu hoffen, dass es keine Dateien gibt, deren Namen mit 'd' beginnen.
djsmiley2kStaysInside
d*/und stimmt d[0-9]/nur mit Verzeichnissen überein, deren Namen mit beginnen d, und der findBefehl betrachtet überhaupt keine Namen, die mit beginnen d. Das Problem besteht darin, benannte Dateien zu vermeiden workspace.
Scott
Unabhängig davon, ob sie es tatsächlich wollen oder nicht, hat das OP ein -RFlag verwendet. Vielleicht möchten sie, dass die Berechtigungen rekursiv unter den Arbeitsbereichsverzeichnissen festgelegt werden.
Jeff Schaller
@ JeffSchaller: Du hast recht. Ich habe die Frage gelesen, als müssten die Berechtigungen nur für das workspaceVerzeichnis festgelegt werden. @Meysam: Vielleicht können Sie klären, ob die Berechtigungen nur für das workspaceVerzeichnis festgelegt werden sollen, oder ob Sie dies für diese Verzeichnisse rekursiv tun.
Thomas
4

In einer Shell wie dieser können bashSie die erweiterte Globbing-Option verwenden, um zuerst alle genannten Verzeichnisse workspaceund chmodsie auf einmal zu markieren

shopt -s nullglob globstar

Die Option nullglobist sicher , dass die glob Erweiterung wirft keinen Fehler zu machen , wenn es nicht nicht alle Dateien auf dem Weg finden. Dadurch wird auch sichergestellt, dass die leere Glob-Zeichenfolge nicht als Teil des Arrays enthalten ist. Die globstarOption ist für rekursives Globbing aktiviert.

Markieren Sie nun diese Verzeichnisse in einem Shell-Array als

dirs=(**/workspace/)

Als weitere Überprüfung der Integrität können Sie zuerst das Array drucken, um festzustellen, ob alle erforderlichen Verzeichnisse berücksichtigt wurden. Überprüfen Sie, ob alle Verzeichnisse unten aufgeführt sind, wenn Sie den folgenden printf()Befehl ausführen.

printf '%s\n' "${dirs[@]}"

Dadurch wird das Array mit allen rekursiven füllen workspaceOrdner, jetzt wir verwenden müssen , chmodauf sie

(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"
Inian
quelle
0

Der chmodBefehl hat eine nette Verknüpfung zum Setzen des ausführbaren Bits nur für Verzeichnisse, wie folgt:

chmod a+X *

Dies ist sehr praktisch, um einen ganzen Verzeichnisbaum für jedermann lesbar zu machen, ohne das ausführbare Bit für reguläre Dateien zu setzen:

chmod -R a+rX *
G. Sliepen
quelle
2
XSetzt das ausführbare Bit für Verzeichnisse und alle Dateien mit einem gesetzten ausführbaren Bit . Im Allgemeinen macht das keinen großen Unterschied (da bei ausführbaren Dateien normalerweise das Bit für alle gesetzt ist), aber es kann in einigen Fällen von Bedeutung sein. Beachten Sie auch, dass Sie mit diesem Trick den Modus 774 nicht erhalten können.
Stephen Kitt
-1
find . -mindepth 1 -type d -exec chmod 774 {} \;
Neal Garrett
quelle