Ako rekurzívne chmodovať všetky adresáre okrem súborov?

Ako chmod 755 všetky adresáre, ale žiadny súbor (rekurzívne) ?

A naopak, ako chmodovať len súbory (rekurzívne), ale žiadny adresár ?

Riešenie

Rekurzívne udelenie oprávnení adresárom na čítanie&spustenie:

find /path/to/base/dir -type d -exec chmod 755 {} +

Rekurzívne udelenie oprávnení na čítanie súborov:

find /path/to/base/dir -type f -exec chmod 644 {} +

Alebo, ak je potrebné spracovať veľa objektov:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

Alebo na zníženie množenia 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
Komentáre (5)

Častým dôvodom takéhoto postupu je nastavenie adresárov na 755, ale súborov na 644. V tomto prípade existuje o niečo rýchlejší spôsob ako nikov príklad find:

chmod -R u+rwX,go+rX,go-w /path

Význam:

  • -R = rekurzívne;
  • u+rwX = Používatelia môžu čítať, zapisovať a vykonávať;
  • go+rX = skupina a ostatní môžu čítať a vykonávať;
  • go-w = skupina a ostatní nemôžu zapisovať

Dôležité je poznamenať, že veľké písmená X sa správajú inak ako malé písmená x. V manuáli môžeme čítať:

Bity execute/search, ak je súbor adresárom alebo je niektorý z bitov execute/search nastavený v pôvodnom (nemodifikovanom) režime.

Inými slovami, chmod u+X na súbore nenastaví bit execute; a g+X ho nastaví len vtedy, ak už je'nastavený pre používateľa.

Komentáre (7)

Ak sa chcete uistiť, že súbory sú nastavené na 644 a v ceste sú súbory s príznakom execute, musíte najprv odstrániť príznak execute. Príznak +X neodstráni príznak execute zo súborov, ktoré ho už majú.

Príklad:

chmod -R ugo-x,u+rwX,go+rX,go-w path

Aktualizácia: zdá sa, že to zlyháva, pretože prvá zmena (ugo-x) spôsobí, že adresár je nevykonateľný, takže všetky súbory pod ním sa nezmenia.

Komentáre (2)