Come modificare le autorizzazioni dei file per una directory in un comando


11

Come posso modificare tutte le autorizzazioni di file di una directory in un comando in Unix?


Vuoi dire che vuoi cambiare le autorizzazioni per tutti i file nella directory? Vuoi che vada anche nelle directory nidificate? Vuoi cambiare i permessi della directory stessa o solo dei file all'interno? Infine, hai provato a cercare questo sito prima di pubblicare la tua domanda?
Ether

Risposte:


21

Per modificare i permessi su una voce di file o directory in modo non ricorsivo, usa il chmodcomando (vedi man chmod per saperne di più sulle sue opzioni specifiche):

chmod +x dir  # Set a directory to be listable
chmod +x file # Set a file to be executable

Per modificare in modo ricorsivo il proprietario di un file / directory (che interessa tutti i discendenti):

chown -R username           dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group

Per modificare i bit di autorizzazione di tutti i file in una directory, ricorsivamente:

find dir -type f -exec chmod 644 {} ';' # make all files       rw-r-r-

Per modificare i bit di autorizzazione di tutte le directory:

find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x

Sarebbe bello se potessi semplicemente fare questo:

chmod -R 755 dir

Tuttavia, questo ha problemi. Tratta i file e le directory allo stesso modo. Il comando precedente rende le directory elencabili e leggibili da tutti gli utenti, ma rende anche tutti i file eseguibili, che di solito è ciò che non si desidera fare.

Se lo cambiamo in 644, otteniamo un altro problema:

$ chmod -R 644 x2
chmod: cannot access `x2/authors.html': Permission denied
chmod: cannot access `x2/day_of_week.plot': Permission denied
chmod: cannot access `x2/day_of_week.dat': Permission denied
chmod: cannot access `x2/commits_by_year.png': Permission denied
chmod: cannot access `x2/index.html': Permission denied
chmod: cannot access `x2/commits_by_year.plot': Permission denied
chmod: cannot access `x2/commits_by_year_month.plot': Permission denied
chmod: cannot access `x2/files_by_date.png': Permission denied
chmod: cannot access `x2/files.html': Permission denied
...

Il problema è che 644elimina il bit dell'elenco delle directory e questo effetto collaterale impedisce ulteriori attraversamenti dell'albero dei file. È possibile aggirare questo problema utilizzando sudo, ma si finisce con directory completamente inutili per gli utenti non root.

Il punto è che chmod -Rfunziona bene in alcuni casi (ad esempio chmod -R g-r), ma non nei casi in cui si desidera pasticciare con il -xbit, poiché opera su file e directory indiscriminatamente.


Perché stai supponendo che voglia impostare 644o che stia inserendo -xle directory? La domanda stabilisce solo che vuole cambiare i permessi, non a cosa in particolare.
Reese Moore,

@Reese Moore: hai ragione. Il richiedente non ha nemmeno detto nulla sulla modifica delle autorizzazioni in modo ricorsivo.
Joey Adams,

1
In genere si desidera utilizzare le cose in modalità simbolica + e - per questo; cioè,chmod -R go=u,go-w /dir
dannysauer,

6

chmodha un -Rflag che significa cambiare le autorizzazioni su file e directory in modo ricorsivo.

Puoi usare la 'X' maiuscola per fare la cosa giusta per le cartelle: 'X' = "esegui / cerca solo se il file è una directory o ha già i permessi di esecuzione per alcuni utenti"

Quindi, ad esempio: chmod -R ug = rwX, o-rwx.

Renderebbe un intero albero accessibile al proprietario e al gruppo di ciascun file e non accessibile a nessun altro. Qualsiasi file già eseguibile sarebbe comunque eseguibile in seguito, e tutte le directory avrebbero la 'x' per l'utente e il gruppo e non per gli altri.


Prova chmod -R 444 somediruna directory con i file al suo interno. Si ottiene Permission deniedperché il flag -x viene rimosso dalle directory ed è necessario per continuare a leggere la directory.
Joey Adams,

1
Un utile addendum a questo è la sintassi X = Y. Ad esempio, è possibile impostare le autorizzazioni di gruppo sull'autorizzazione dell'utente usando chmod -R g = u dir per impostare l'equivalente di gruppo e utente. Questo aggira cose come le directory che necessitano di eseguibili mentre i file "normali" no.
Paul Rubel,

3
chmod -R <file permission> *

Dalla pagina man di chmod:

-R, --recursive
              change files and directories recursively

Utilizzare chmodcon -Rswitch per più direzioni che ha l'albero delle sottodirectory con milioni di file all'interno e si desidera modificare le autorizzazioni dei file di questi file in una volta sola.

L'autorizzazione del file può essere ad es. 777, 755, 644 ecc.

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.