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