So erstellen Sie ein Verzeichnis und geben die Berechtigung in einem einzigen Befehl

107

Wie erstelle ich ein Verzeichnis und erteile die Berechtigung in einem einzigen Befehl unter Linux?

Ich muss viele Ordner mit voller Erlaubnis erstellen 777.

Befehle

mkdir path/foldername
chmod 777 path/foldername 

Ich mag es nicht, zwei Befehle zu erstellen und Berechtigungen zu erteilen. Kann ich das mit einem einzigen Befehl tun?

Poorani
quelle
1
mkdir temp; chmod 777 tempist eine Zeile. Sie können 'temp' zu einer Variablen machen und als Bash-Befehl speichern. Wollen Sie das tun?
Styfle
1
hi @ white-rose, bitte sehen Sie die neueste Antwort, es sollte die akzeptierte Antwort sein. Bonus, es kombiniert mkdir, chmod UND chown in einer einzigen Kugel!
Costin Gușă

Antworten:

205

Laut der Manpage von mkdir ...

mkdir -m 777 dirname
Alex
quelle
1
Kannst du mir bitte etwas über die Option -m erzählen?
Poorani
Die Option @Whiterose -m ist für den Modus. Setzt die Berechtigungsbits für die neu erstellten Verzeichnisse auf den von der Variablen Mode angegebenen Wert. Die Mode-Variable nimmt die gleichen Werte wie der Mode-Parameter für den Befehl chmod an, entweder in symbolischer oder numerischer Form.
TMKasun
14
mkdir -p -m ist fehlerhaft, da der Modus nur auf das letzte Verzeichnis in dem von Ihnen eingegebenen Pfad angewendet wird. Zum Beispiel mkdir -p -m 707 eins / zwei / drei. Selbst wenn alle drei Verzeichnisse neu erstellt wurden, verfügt nur das letzte über die angeforderten Berechtigungen und die anderen standardmäßig. install -d -m ist genauso kaputt.
Anzeigename
Neben -pdem oben bereits erwähnten Problem mit @DisplayName gibt es auch ein anderes. Das -mgilt nur , wenn ein Verzeichnis tatsächlich erstellt wird. Wenn es bereits existiert, wird sein Modus nicht geändert. Abhängig von Ihrem Kontext kann dies gut oder schlecht sein.
Adam Badura
1
mkdir -m777 Verzeichnis
Hugo Deiró
19
install -d -m 0777 /your/dir

sollte dir geben, was du willst. Beachten Sie, dass jeder Benutzer das Recht hat, Hinzufügen und Löschen von Dateien in dieses Verzeichnis zu schreiben.

Markus W Mahlberg
quelle
1
Bonus, Sie können auch -g und / oder -o hinzufügen und Sie können mkdir, chmod und chown in einem einzigen Schuss haben!
Costin Gușă
4
Es ist kaputt. installiere -d -m 070 eins / zwei / drei. Selbst wenn alle drei Verzeichnisse im Pfad neu erstellt wurden, werden nur für das letzte die angeforderten Berechtigungen festgelegt. mkdir -p -m wird auf die gleiche Weise gebrochen.
Anzeigename
@DisplayName: Legt dennoch die richtigen Berechtigungen für fest three, wobei die Standardberechtigungen für den Pfad dazu ausreichen.
Markus W Mahlberg
16

Wenn das Verzeichnis bereits vorhanden ist:

mkdir -m 777 /path/to/your/dir

Wenn das Verzeichnis nicht vorhanden ist und Sie die übergeordneten Verzeichnisse erstellen möchten:

mkdir -m 777 -p /parent/dirs/to/create/your/dir
Pedro Trujillo
quelle
Dies gibt nur dem endgültigen Unterverzeichnis die Erlaubnis 777. Wie kann ich dies tun und auch allen übergeordneten Verzeichnissen die Berechtigung 777 erteilen?
Levi Johansen
1
Ich habe keine Antwort darauf, aber ich glaube, die Antwort darauf ist hier: stackoverflow.com/questions/3740152/…
Pedro Trujillo
Beachten Sie, dass dieser Befehl das Problem "So erstellen Sie ein Verzeichnis und geben Sie die Berechtigung in einem einzigen Befehl" lösen soll. Ich glaube, die Lösung für Ihre Frage wird ungefähr so ​​aussehen:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo
10

IMO, es ist besser, den installBefehl in solchen Situationen zu verwenden. Ich habe versucht, systemd-journaldüber Neustarts hinweg dauerhaft zu bleiben.

install -d  -g systemd-journal -m 2755 -v /var/log/journal
Badi
quelle
7

Sie könnten ein einfaches Shell-Skript schreiben, zum Beispiel:

#!/bin/bash
mkdir "$1"
chmod 777 "$1"

Nach dem Speichern und Aktivieren des ausführbaren Flags können Sie es anstelle von mkdir und chmod ausführen:

./scriptname path/foldername

Die Antwort von Alex ist jedoch viel besser, da sie einen Prozess anstelle von drei erzeugt. Ich wusste nichts über die -mOption.

Delan Azabani
quelle
Danke delan .. Ich habe diesen Befehl auch in Shell-Skript geschrieben .. Aber ich möchte in einem einzigen Befehl tun.
Poorani
7

Nur um einige der oben genannten Antworten zu erweitern und zu verbessern:

Zuerst überprüfe ich die Manpage mkdir auf GNU Coreutils 8.26 - sie gibt uns diese Informationen über die Optionen '-m' und '-p' (kann auch als --mode = MODE bzw. --parents angegeben werden ):

... setze [s] Dateimodus (wie in chmod), nicht a = rwx - umask

... kein Fehler, falls vorhanden, übergeordnete Verzeichnisse nach Bedarf erstellen

Die Aussagen sind meiner Meinung nach vage und unklar. Grundsätzlich heißt es jedoch, dass Sie das Verzeichnis mit Berechtigungen erstellen können, die durch die numerische Notation "chmod" (Oktale) angegeben sind, oder "in die andere Richtung" gehen und eine / Ihre Umask verwenden können.

Randnotiz: Ich sage "andersherum", da der Umask-Wert genau das ist, wonach er sich anhört - eine Maske , die Berechtigungen versteckt / entfernt, anstatt sie wie bei der numerischen Oktalschreibweise von chmod zu "gewähren".

Sie können den Shell-eingebauten Befehl ausführen, um umaskzu sehen, was Ihre dreistellige Umask ist. für mich ist es 022. Dies bedeutet, dass ich beim Ausführen mkdir yodirectoryin einem bestimmten Ordner (z. B. Mahome) stateine Ausgabe bekomme, die dieser ähnelt:

               755                   richard:richard         /mahome/yodirectory
 #          permissions                 user:group      what I just made (yodirectory),
 # (owner,group,others--in that order)                 where I made it (i.e. in mahome)
 # 

Um noch ein kleines bisschen mehr über diese oktalen Berechtigungen hinzuzufügen. Wenn Sie ein Verzeichnis erstellen, nimmt "Ihr System" Ihre Standardverzeichnis-Dauerwellen "[was für neue Verzeichnisse gilt (der Wert sollte 777 sein)] und klatscht auf Ihre (u) -Maske, wodurch einige dieser Dauerwellen effektiv ausgeblendet werden." Meine Umask ist 022 - wenn wir jetzt 022 von 777 "subtrahieren" (technisch gesehen ist das Subtrahieren eine übermäßige Vereinfachung und nicht immer korrekt - wir schalten tatsächlich Dauerwellen aus oder maskieren sie) ... erhalten wir 755 wie angegeben (oder "statted"). ) vorhin.

Wir können die '0' vor den 3-stelligen Oktalen weglassen (sie müssen also nicht 4-stellig sein), da wir in unserem Fall keine Stickybits, Setuids oder Setgids wollten (oder eher nicht erwähnten) (Vielleicht möchten Sie diese untersuchen, übrigens, sie könnten nützlich sein, da Sie 777 gehen). Mit anderen Worten, 0777 impliziert (oder entspricht) 777 (aber 777 ist nicht unbedingt gleich 0777 - da 777 nur die Berechtigungen angibt, nicht die Setuids, Setgids usw.)

Um dies nun im weiteren Sinne auf Ihre Frage anzuwenden, haben Sie (bereits) einige Optionen. Alle obigen Antworten funktionieren (zumindest gemäß meinen Coreutils). Es kann jedoch (oder wahrscheinlich) zu Problemen mit den oben genannten Lösungen kommen, wenn Sie Unterverzeichnisse (verschachtelte Verzeichnisse) mit 777 Berechtigungen gleichzeitig erstellen möchten . Insbesondere, wenn ich in Mahome Folgendes mit einer Umask von 022 mache:

mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff

Ich werde Dauerwellen 755für beide yodirectoryund yostuffmit nur 777Dauerwellen für bekommen mastuffinyostuff. Es scheint also, dass das umaskalles ist, worauf geklatscht wird, yodirectoryund yostuff... um dies zu umgehen, können wir eine Unterschale verwenden:

( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )

und das ist es. 777 Dauerwellen für Yostuff, Mastuffinyostuff und Yodirectory.

YenForYang
quelle
7

Mit dem folgenden Befehl können Sie ein Verzeichnis erstellen und gleichzeitig Berechtigungen erteilen

mkdir -m777 path/foldername 
Omer Gafar
quelle
1
Es gibt kein Leerzeichen zwischen -m und 777
Omer Gafar
1

Nicht tun: mkdir -m 777 -p a/b/c da dadurch nur die Berechtigung 777für das letzte Verzeichnis festgelegt wird, c; a und b werden mit der Standardberechtigung Ihrer umask erstellt.

Um neue Verzeichnisse mit Berechtigung zu erstellen 777, führen mkdir -pSie stattdessen eine Unterschale aus, in der Sie die Umask überschreiben:

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

Beachten Sie, dass dies die Berechtigungen nicht ändert, wenn a, b und c bereits vorhanden sind.

John Mellor
quelle
Ja, wenn Sie eine 4-stellige Umask übergeben, muss die führende Ziffer immer Null sein (obwohl Sie sie weglassen können). Es mag für die Symmetrie mit chmod sein, wo die erste Oktalziffer die Bits setuid, setgid und sticky setzt, aber wenn ja, ist es ziemlich sinnlos, da umask es Ihnen nicht erlaubt, diese einzuschränken.
John Mellor