Come cambiare i permessi dei file per una directory con un solo comando
Come posso cambiare tutti i permessi dei file di una directory con un solo comando in Unix?
Come posso cambiare tutti i permessi dei file di una directory con un solo comando in Unix?
Per cambiare i permessi su un file o una directory in modo non ricorsivo, usate il comando chmod
(vedete 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 cambiare il proprietario di un file/directory in modo ricorsivo (influenzando tutti i discendenti):
chown -R username dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group
Per cambiare i bit dei permessi di tutti i file in una directory, ricorsivamente:
find dir -type f -exec chmod 644 {} ';' # make all files rw-r-r-
Per cambiare i bit dei permessi di tutte le directory:
find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x
Sarebbe bello se si potesse fare così:
chmod -R 755 dir
Tuttavia, questo ha dei problemi. Tratta file e 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 vuole 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 644
toglie il bit della lista delle directory, e questo effetto collaterale impedisce un ulteriore attraversamento dell'albero dei file. Si potrebbe aggirare questo problema usando sudo
, ma si finisce comunque per avere delle directory che sono completamente inutili per gli utenti non root.
Il punto è che chmod -R
funziona bene in alcuni casi (ad esempio chmod -R g-r
), ma non nei casi in cui si vuole pasticciare con il bit -x
, poiché opera su file e directory indiscriminatamente.
chmod
ha un flag -R
che significa cambiare i permessi su file e directory in modo ricorsivo.
Si può usare la ‘X’ maiuscola per fare la cosa giusta per le cartelle: ‘X’ = “esegui/ricerca solo se il file è una directory o ha già il permesso di esecuzione per qualche utente”
Quindi, ad esempio: chmod -R ug=rwX,o-rwx .
renderebbe un intero albero accessibile al proprietario e al gruppo di ogni file, e non accessibile a nessun altro. Qualsiasi file già eseguibile sarebbe ancora eseguibile dopo, e tutte le directory avrebbero la ‘x’ per l'utente e il gruppo e non per gli altri.
chmod -R <file permission> *
Dalla pagina man di chmod
:
-R, --recursive
change files and directories recursively
Usa chmod
con l'interruttore -R
per direzioni multiple che hanno un albero di sottodirectory con milioni di file all'interno e vuoi cambiare i permessi dei file insieme in un colpo solo.
Il permesso dei file può essere per esempio 777, 755, 644 ecc.