Come creare una directory e dare il permesso in un unico comando


107

Come creare una directory e dare il permesso in un unico comando in Linux?

Devo creare molte cartelle con piena autorizzazione 777.

comandi

mkdir path/foldername
chmod 777 path/foldername 

Non mi piace creare e dare il permesso in due comandi. Posso farlo con un solo comando?


1
mkdir temp; chmod 777 tempè una riga. Potresti rendere "temp" una variabile e salvarla come comando bash. È questo quello che stai cercando di fare?
stile

1
ciao @ rosa bianca, per favore guarda l'ultima risposta, dovrebbe essere la risposta accettata. bonus, combina mkdir, chmod E chown in un unico proiettile!
Costin Gușă

Risposte:


205

Secondo la pagina man di mkdir ...

mkdir -m 777 dirname

1
Puoi parlarmi dell'opzione -m?
poorani

L'opzione @Whiterose -m è per la modalità. Imposta i bit di autorizzazione per le directory appena create sul valore specificato dalla variabile Mode. La variabile Mode assume gli stessi valori del parametro Mode per il comando chmod, in forma simbolica o numerica.
TMKasun

14
mkdir -p -m non funziona, poiché la modalità viene applicata solo all'ultima directory nel percorso digitato. Ad esempio, mkdir -p -m 707 uno / due / tre. Anche se tutte e tre le directory sono state create di recente, solo l'ultima avrà le autorizzazioni richieste e le altre quelle predefinite. install -d -m è rotto allo stesso modo.
Nome visualizzato

Oltre al problema relativo a -p@DisplayName già menzionato sopra, ce n'è anche un altro. Si -mapplicherà solo se una directory viene effettivamente creata. Se esiste già, la sua modalità non verrà modificata. A seconda del contesto, questo potrebbe essere positivo o negativo.
Adam Badura

1
Directory mkdir -m777
Hugo Deiró

19
install -d -m 0777 /your/dir

dovrebbe darti quello che vuoi. Tieni presente che ogni utente ha il diritto di scrivere, aggiungere ed eliminare i file in quella directory.


1
bonus, puoi anche aggiungere -g e / o -o e puoi avere mkdir, chmod e chown in un solo colpo!
Costin Gușă

4
È rotto. installa -d -m 070 uno / due / tre. Anche se tutte e tre le directory nel percorso sono state create di recente, solo l'ultima avrà le autorizzazioni richieste impostate. mkdir -p -m è rotto allo stesso modo.
Nome visualizzato

@DisplayName: che tuttavia imposta le autorizzazioni corrette per three, con le autorizzazioni predefinite sufficienti per il percorso ad esso.
Markus W Mahlberg

16

Quando la directory esiste già:

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

Quando la directory non esiste e si desidera creare le directory padre:

mkdir -m 777 -p /parent/dirs/to/create/your/dir

Questo darà solo il permesso 777 alla sottodirectory finale. Come posso farlo e dare il permesso 777 anche a tutte le directory principali?
Levi Johansen

1
Non ho una risposta per questo, ma credo che la risposta sia qui: stackoverflow.com/questions/3740152/…
Pedro Trujillo

Notare che questo comando serve per risolvere questo problema "Come creare una directory e dare il permesso in un singolo comando". Credo che la soluzione alla tua domanda sarà qualcosa del tipo:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo

10

IMO, è meglio usare il installcomando in tali situazioni. Stavo cercando di rendere systemd-journaldpersistente durante i riavvii.

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

7

Potresti scrivere un semplice script di shell, ad esempio:

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

Una volta salvato e il flag eseguibile abilitato, puoi eseguirlo al posto di mkdir e chmod:

./scriptname path/foldername

Tuttavia, la risposta di alex è molto migliore perché genera un processo invece di tre. Non sapevo -mdell'opzione.


Grazie delan .. Ho anche scritto quel comando in script di shell .. Ma voglio farlo in un unico comando.
poorani

7

Solo per espandere e migliorare alcune delle risposte di cui sopra:

Per prima cosa, controllerò la pagina man di mkdir per GNU Coreutils 8.26 - ci fornisce queste informazioni sull'opzione '-m' e '-p' (può anche essere dato come --mode = MODE e --parents, rispettivamente ):

... imposta la [s] modalità file (come in chmod), non a = rwx - umask

... nessun errore se esistente, crea le directory padre come necessario

Le dichiarazioni sono vaghe e poco chiare a mio parere. Ma fondamentalmente, dice che puoi creare la directory con i permessi specificati da "chmod numeric notation" (ottali) oppure puoi andare "dall'altra parte" e usare una / tua umask.

Nota a margine: dico "dall'altra parte" poiché il valore umask è in realtà esattamente come suona - una maschera , che nasconde / rimuove i permessi piuttosto che "concedendoli" come con la notazione numerica ottale di chmod.

Puoi eseguire il comando incorporato della shell umaskper vedere qual è la tua umask a 3 cifre; per me lo è 022. Ciò significa che quando mkdir yodirectoryeseguo in una determinata cartella (ad esempio, mahome) e in statessa, ottengo un output simile a questo:

               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)
 # 

Ora, per aggiungere solo un po 'di più su quei permessi ottali. Quando crei una directory, "il tuo sistema" prende la tua directory predefinita perms '[che si applica per le nuove directory (il suo valore dovrebbe 777)] e schiaffeggia la tua (u) maschera, nascondendo effettivamente alcune di quelle permanenti'. La mia umask è 022 - ora se "sottraiamo" 022 da 777 (tecnicamente la sottrazione è una semplificazione eccessiva e non è sempre corretta - in realtà stiamo disattivando le permanenti o le mascheriamo ) ... otteniamo 755 come indicato (o "statted" ) in precedenza.

Possiamo omettere lo '0' davanti agli ottali a 3 cifre (quindi non devono essere a 4 cifre) poiché nel nostro caso non volevamo (o meglio non menzionavamo) alcun stickybits, setuid o setgid (potresti voler esaminare quelli, tra l'altro, potrebbero essere utili dato che stai andando 777). Quindi, in altre parole, 0777 implica (o è equivalente a) 777 (ma 777 non è necessariamente equivalente a 0777 - poiché 777 specifica solo i permessi, non i setuids, setgids, ecc.)

Ora, per applicare questo alla tua domanda in un senso più ampio, hai (già) alcune opzioni. Tutte le risposte sopra funzionano (almeno secondo i miei coreutils). Ma potresti (o è abbastanza probabile che tu incorra) in problemi con le soluzioni di cui sopra quando vuoi creare sottodirectory (directory annidate) con permessi 777 tutto in una volta. In particolare, se eseguo quanto segue in mahome con una umask di 022:

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

Otterrò permanenti 755per entrambi yodirectorye yostuff, con solo 777permanenti per mastuffinyostuff. Quindi sembra che umasksia tutto ciò che è stato schiaffeggiato yodirectorye yostuff... per aggirare questo possiamo usare una subshell:

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

e questo è tutto. 777 permanenti per yostuff, mastuffinyostuff e yodirectory.


7

puoi usare il seguente comando per creare una directory e allo stesso tempo dare i permessi

mkdir -m777 path/foldername 

1
non c'è spazio tra -m e 777
Omer Gafar

1

Non farlo: mkdir -m 777 -p a/b/c poiché questo imposterà i permessi solo 777sull'ultima directory, c; aeb verranno creati con l'autorizzazione predefinita dalla tua umask.

Invece di creare nuove directory con il permesso 777, esegui mkdir -pin una subshell in cui sovrascrivi la umask:

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

Nota che questo non cambierà i permessi se uno qualsiasi di a, bec esiste già.


Sì, se passi una umask a 4 cifre, la prima cifra deve essere sempre zero (anche se puoi ometterla). Potrebbe essere per simmetria con chmod, dove la prima cifra ottale imposta i bit setuid, setgid e sticky, ma in tal caso è piuttosto inutile poiché umask non ti consente di limitarli.
John Mellor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.