Як змінити дозволи файлів для каталогу в одній команді


11

Як я можу змінити всі дозволи файлів каталогу в одній команді в Unix?


Ви маєте на увазі, що хочете змінити дозволи для всіх файлів у каталозі? Ви хочете, щоб це також увійшло до вкладених каталогів? Ви хочете змінити дозволи дозволу самого каталогу або лише файлів всередині? І нарешті, ви спробували спочатку пошукати цей сайт, перш ніж розміщувати своє запитання?
Ефір

Відповіді:


21

Щоб змінити дозволи на запис файлу чи каталогу нерекурсивно, скористайтеся 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в каталоги? Питання лише передбачає, що він хоче змінити дозволи, а не на те, що зокрема.
Різ Мур

@Reese Moore: Ти маєш рацію. Запитувач навіть нічого не сказав про рекурсивну зміну дозволів.
Джої Адамс

1
Зазвичай ви хочете використовувати для цього елементи символів + і -; тобто,chmod -R go=u,go-w /dir
dannysauer

6

chmodмає -Rпрапор, що означає рекурсивно змінювати дозволи на файли та каталоги.

Ви можете скористатися великою літерою "X", щоб зробити правильну справу для папок: 'X' = "виконувати / шукати лише в тому випадку, якщо файл є каталогом або вже має дозвіл на виконання для якогось користувача"

Так, наприклад: chmod -R ug = rwX, o-rwx.

Зробило б ціле дерево доступним для власника та групи кожного файлу, і не було б доступним для інших. Будь-які вже виконувані файли все-таки будуть виконуватись після цього, і всі каталоги матимуть "x" для користувача та групи, а не для інших.


Спробуйте chmod -R 444 somedirкаталог з файлами в ньому. Ви отримуєте Permission deniedчерез те, що прапор -x знімається з каталогів, і вам потрібно продовжувати читати каталог.
Джої Адамс

1
Корисним доповненням до цього є синтаксис X = Y. Наприклад, ви можете встановити групові дозволи на дозвіл користувача, використовуючи chmod -R g = u dir для встановлення групи та еквівалента користувача. Це працює навколо таких речей, як dir, які потребують виконання, тоді як "звичайні" файли цього не роблять.
Пол Рубель

3
chmod -R <file permission> *

З чоловічої сторінки chmod:

-R, --recursive
              change files and directories recursively

Використовуйте chmodз -Rперемикачем для декількох напрямків, у яких є дерево підкаталогів, яке містить мільйони файлів всередині, і ви хочете одночасно змінити дозволи файлів цих файлів разом.

Дозвіл на файл може бути, наприклад, 777, 755, 644 тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.