Hromadná změna práv souborů v Linuxu

3 Linux, Tipy & triky

Hromadná změna práv, nebo vlastníka i skupiny u souborů a složek v Linuxu není problém. Pokud ale potřebujeme pouze soubory v dané složce a všech podsložkách, už nepostačí jediný příkaz.

Hromadná změna práv souborů v Linuxu

Potřeboval jsem na VPSce provést hromadnou změnu práv. Problém nastal, když jsem u souboru musel nastavit jiná práva než u složek.

// Takto nastavíme práva 775 pro všechny objekty
// bez ohledu na jejich typ
chmod -R 755 /cesta/

Příkaz find

Možností jak vyřešit tento problém je hned několik, všechny však využívají příkaz find k nalezení a filtrování objektů v daném adresáři, ale také všech pod adresářích.

Nejlepší řešení

Následující řešení bylo doporučené pro případy, kdy se bude změna týkat velkého množství složek či souborů. 

// Řešení pro složky - type d
find ./cesta -type d -print0 | xargs -0 chmod 755

// Řešení pro soubory - type f
find ./cesta -type f -print0 | xargs -0 chmod 644

Příkaz find najde všechny objekty dle zvoleného typu. Přepínač -print0 zaručí, že oddělovač jednotlivých názvů nebude mezera, ale nulový znak. Tento způsob zajistí, že nám soubory s mezerou v názvu nezpůsobí problémy, protože mezera se bere jako oddělovač dalšího parametru.

Dále xargs přečte standardní vstup a vykoná zmíněný příkaz, v našem případě chmod s jednotlivými parametry. Přepínač -0 určuje, že parametry jsou odděleny nulovým znakem, ne mezerou.

Další možná řešení

Řešení je možné pomocí přepínače -exec v příkazu find. Tento způsob při mých experimentech s mezerami fungoval, ale nikde jsem nenašel, jestli bude fungovat ve všech případech.

// Pro složky
find ./cesta -type d -exec chmod 755 {} +

Řešení, které bylo také doporučeno pro velké množství souborů, ale s mezerami v názvech si neporadí vůbec. Použitelné pokud jste si jistí, že žádné mezery v názvech nebudou.

chmod 755 $(find ./cesta -type d)

K tomuto článku již není možné přidávat další komentáře

Komentáře

zkus priste obdobu xargs. Trochu vice pismenek, ale s mezerama pak neni problem. find / -type d | while read LINE; do chmod 666 "$LINE"; done

Určitě také funkční, ale pro každý soubor se spustí chmod znova. Výše uvedené příklady se tomuto snaží zabránit a spustit chmod 1x pro více souborů najednou.

Pro všechny složky i soubory stačí přidat přepínač R, takže lze jednoduše:

find ./cesta -type d -print0 | xargs -0 chmod -R 755
find ./cesta -type f -print0 | xargs -0 chmod -R 644