Jak zmienić uprawnienia do plików w katalogu za pomocą jednego polecenia?
Jak mogę zmienić uprawnienia do wszystkich plików w katalogu w jednym poleceniu w systemie Unix?
Jak mogę zmienić uprawnienia do wszystkich plików w katalogu w jednym poleceniu w systemie Unix?
Aby zmienić uprawnienia do pliku lub wpisu w katalogu w sposób nierekursywny, użyj polecenia chmod
(zobacz man chmod aby przeczytać więcej o jego specyficznych opcjach):
chmod +x dir # Set a directory to be listable
chmod +x file # Set a file to be executable
Aby zmienić właściciela pliku/katalogu rekursywnie (wpływając na wszystkie pliki potomne):
chown -R username dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group
Aby zmienić bity uprawnień wszystkich plików w katalogu, rekursywnie:
find dir -type f -exec chmod 644 {} ';' # make all files rw-r-r-
Aby zmienić bity uprawnień wszystkich katalogów:
find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x
Byłoby miło, gdybyś mógł po prostu zrobić tak:
chmod -R 755 dir
Jednak wiąże się to z problemami. Traktuje pliki i katalogi tak samo. Powyższa komenda czyni katalogi listowalnymi i możliwymi do odczytania przez wszystkich użytkowników, ale czyni też wszystkie pliki wykonywalnymi, czego zazwyczaj nie chcemy robić.
Jeśli zmienimy to na 644
, otrzymamy kolejny problem:
$ 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
...
Problem polega na tym, że 644
usuwa bit listy katalogów, a ten efekt uboczny uniemożliwia dalsze poruszanie się po drzewie plików. Możesz obejść ten problem używając sudo
, ale nadal kończysz z katalogami, które są całkowicie bezużyteczne dla użytkowników nie będących rootami.
Chodzi o to, że chmod -R
działa dobrze w niektórych przypadkach (np. chmod -R g-r
), ale nie w przypadkach, w których chcesz mieszać z bitem -x
, ponieważ działa on na plikach i katalogach w sposób niedyskryminujący.
chmod
ma flagę -R
, która oznacza rekurencyjną zmianę uprawnień na plikach i katalogach.
Możesz użyć dużej litery ‘X’, aby zrobić właściwą rzecz dla katalogów: ‘X’ = “wykonaj/wyszukaj tylko jeśli plik jest katalogiem lub ma już uprawnienia execute dla jakiegoś użytkownika”
Tak więc, np: chmod -R ug=rwX,o-rwx .
Uczyniłoby całe drzewo dostępnym dla właściciela i grupy każdego pliku, a niedostępnym dla nikogo innego. Wszystkie już wykonane pliki byłyby nadal wykonywalne po tym, a wszystkie katalogi miałyby ‘x’ dla użytkownika i grupy, a nie dla innych.
chmod -R <file permission> *
Ze strony man dla chmod
:
-R, --recursive
change files and directories recursively
Użyj chmod
z przełącznikiem -R
dla wielu kierunków, które mają drzewo podkatalogów mające miliony plików wewnątrz i chcesz zmienić uprawnienia do plików tych plików razem za jednym zamachem.
Uprawnienia plików mogą być np. 777, 755, 644 itd.