Come fare chmod 755 per tutte le directory ma nessun file (ricorsivamente)?
Inversamente, come fare il chmod solo dei file (ricorsivamente) ma nessuna directory?
Per dare ricorsivamente alle directory privilegi di lettura e di esecuzione:
find /path/to/base/dir -type d -exec chmod 755 {} +
Per dare ricorsivamente a files privilegi di lettura:
find /path/to/base/dir -type f -exec chmod 644 {} +
Oppure, se ci sono molti oggetti da elaborare
chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Oppure, per ridurre lo spawning di chmod
:
find /path/to/base/dir -type d -print0 | xargs -0 chmod 755
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
Una ragione comune per questo genere di cose è impostare le directory a 755 ma i file a 644. In questo caso c'è un modo un po' più veloce dell'esempio di nik find
:
chmod -R u+rwX,go+rX,go-w /path
Significato:
-R
= ricorsivamente;u+rwX
= Gli utenti possono leggere, scrivere ed eseguire;go+rX
= gruppo e altri possono leggere ed eseguire;go-w
= gruppo e altri possono scrivereLa cosa importante da notare qui è che la maiuscola X
agisce diversamente dalla minuscola x
. In manuale possiamo leggere:
Se il file è una directory o uno qualsiasi dei bit di esecuzione/ricerca è impostato nel modo originale (non modificato).
In altre parole, chmod u+X su un file non imposterà il bit di esecuzione; e g+X lo imposterà solo se è già impostato per l'utente.
Se vuoi assicurarti che i file siano impostati su 644 e ci sono file nel percorso che hanno il flag di esecuzione, dovrai prima rimuovere il flag di esecuzione. +X non rimuove il flag di esecuzione dai file che lo hanno già.
Esempio:
chmod -R ugo-x,u+rwX,go+rX,go-w path
Aggiornamento: questo sembra fallire perché il primo cambiamento (ugo-x) rende la directory ineseguibile, quindi tutti i file sotto di essa non vengono cambiati.