Як я можу змінити всі дозволи файлів каталогу в одній команді в Unix?
Як я можу змінити всі дозволи файлів каталогу в одній команді в Unix?
Відповіді:
Щоб змінити дозволи на запис файлу чи каталогу нерекурсивно, скористайтеся chmod
командою (див. Man chmod, щоб прочитати більше про його конкретні параметри):
chmod +x dir # Set a directory to be listable
chmod +x file # Set a file to be executable
Щоб змінити власника файлу / каталогу рекурсивно (що стосується всіх нащадків):
chown -R username dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group
Щоб змінити біти дозволів усіх файлів у каталозі, рекурсивно:
find dir -type f -exec chmod 644 {} ';' # make all files rw-r-r-
Щоб змінити біти дозволів усіх каталогів:
find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x
Було б добре, якби ви могли просто так:
chmod -R 755 dir
Однак це має проблеми. Він обробляє файли та каталоги однаково. Вищевказана команда робить каталоги доступними для списку і читаними всіма користувачами, але вона також робить усі файли виконуваними, що зазвичай не потрібно робити.
Якщо ми змінимо його 644
, ми отримаємо ще одну проблему:
$ 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
...
Проблема полягає в тому, що 644
виймає біт списку каталогів, і цей побічний ефект запобігає подальшому обходу дерева файлів. Ви можете вирішити цю проблему, використовуючи sudo
, але ви все ще залишаєтесь каталогіми, які абсолютно непридатні для користувачів, які не користуються коренем.
Справа в тому, що chmod -R
в деяких випадках працює просто чудово (наприклад chmod -R g-r
), але не у випадках, коли ви хочете зіпсуватись із -x
бітом, оскільки він працює на файли та каталоги без розбору.
644
або взагалі налаштовується -x
в каталоги? Питання лише передбачає, що він хоче змінити дозволи, а не на те, що зокрема.
chmod -R go=u,go-w /dir
chmod
має -R
прапор, що означає рекурсивно змінювати дозволи на файли та каталоги.
Ви можете скористатися великою літерою "X", щоб зробити правильну справу для папок: 'X' = "виконувати / шукати лише в тому випадку, якщо файл є каталогом або вже має дозвіл на виконання для якогось користувача"
Так, наприклад: chmod -R ug = rwX, o-rwx.
Зробило б ціле дерево доступним для власника та групи кожного файлу, і не було б доступним для інших. Будь-які вже виконувані файли все-таки будуть виконуватись після цього, і всі каталоги матимуть "x" для користувача та групи, а не для інших.
chmod -R 444 somedir
каталог з файлами в ньому. Ви отримуєте Permission denied
через те, що прапор -x знімається з каталогів, і вам потрібно продовжувати читати каталог.
chmod -R <file permission> *
З чоловічої сторінки chmod
:
-R, --recursive
change files and directories recursively
Використовуйте chmod
з -R
перемикачем для декількох напрямків, у яких є дерево підкаталогів, яке містить мільйони файлів всередині, і ви хочете одночасно змінити дозволи файлів цих файлів разом.
Дозвіл на файл може бути, наприклад, 777, 755, 644 тощо.