Як я можу змінити дозволи для папки та всіх її підпапок та файлів за один крок у Linux? [зачинено]


1805

Я хотів би змінити дозволи для папки та всіх її підпапок і файлів за один крок (команда) в Linux.

Я вже спробував команду нижче, але вона працює лише для згаданої папки:

chmod 775 /opt/lampp/htdocs

Чи є спосіб , щоб встановити chmod 755для /opt/lampp/htdocsі весь його вміст , включаючи вкладені папки та файли?

Крім того, у майбутньому, якщо я створюю нову папку чи файл всередині htdocs, як можна автоматично встановити дозволи для цього 755?

Я також подивився це посилання:

http://stackoverflow.com/questions/3740187/how-to-set-default-chmod-in-linux-terminal


4
Ви мали намір написати chmod 75 /opt/lampp/htdocsчи це насправді повинно бути chmod 755 /opt/lampp/htdocs?
HelloGoodbye

232
Веселий факт, що четверте запитання щодо Linux щодо "закрито як поза темою". Хто, крім програміста, піклується про chmod? Як це поза темою? Чому теги "дозволи", "папка" та "cmod" є навіть тегами, якщо вони поза темою?
Артур Дент

8
@ArthurDent, оскільки це питання (при цьому є абсолютно валідним і корисним) більше підходить для системно орієнтованих сайтів SE, таких як SuperUser або ServerFault. Це прямо не пов’язано з програмуванням.
таймермер

26
@timelmer Звичайно, але я запитую ще раз: чому "дозволи", "папки" та "cmod" теги? Коли cmod коли-небудь використовуватиметься "експрес" для програмування?
Артур Дент

9
Якщо ви хочете отримати справді вибагливий, Bash - це насправді мова сценаріїв, але тоді це також і php, який так, здається, не проти.
таймеллер

Відповіді:


2955

Інші відповіді правильні, оскільки chmod -R 755вони встановлять ці дозволи для всіх файлів і папок у дереві. Але чому б на землі ви цього хотіли ? Це може мати сенс для каталогів, але навіщо встановлювати біт виконання на всі файли?

Я підозрюю, що ви дійсно хочете зробити це встановити каталоги на 755 і залишити файли в спокої або встановити їх на 644. Для цього ви можете використовувати findкоманду. Наприклад:

Щоб змінити всі каталоги на 755 ( drwxr-xr-x):

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Щоб змінити всі файли на 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;

231
Комусь хочеться пояснити, що {} \;означає кінцева лінія?
Нільзор

307
@Nilzor chmod 644 {} \;вказує команду, яка буде виконуватися findдля кожного файлу. {}замінюється шлях до файлу, а крапка з комою позначає кінець команди (уникнув, інакше вона буде інтерпретована оболонкою замість find).
tobbez

25
", але навіщо встановлювати біт виконання на всі файли" Чому ні? Я новачок у Ubuntu / Linux ...
FlavorScape

12
@FlavorScape Womble встановлює біт виконання виключно на каталоги, повернені методом find. Дозвіл на виконання в каталозі дозволяє користувачеві класу перелічити вміст цього каталогу та вписати його. Взагалі кажучи, ви хочете, щоб і r, і x у каталозі були доступними для вас, навіть незважаючи на те, що можуть бути випадкові крайові випадки, коли ви встановите лише те чи інше. Дивіться цей посібник для отримання додаткової інформації: nixsrv.com/llthw/ex23
Олександр Курілін

25
За винятком сонника, кожну відповідь нехтують вирішенням аспекту його питання щодо встановлення дозволів на файли / папки, створені в майбутньому .
JGarrido

780

Перевірте параметр -R

chmod -R <permissionsettings> <dirname>

Надалі ви можете заощадити багато часу, спочатку перевіривши головну сторінку:

man <command name>

Отже, у цьому випадку:

man chmod

147
що це man?
Адам,

36
це позначає сторінку вручну і являє собою команду linux, яка показує чоловічу сторінку для команди (більшість команд Linux має чоловічу сторінку). спробуйте man ls або man man.
Стів Робільярд

8
Це не спрацювало для мене в Терміналі в Mac OS X. Там я зробив "chmod -R <набір даних> <ім'я> *", і він працював.
Ейнар Ólafsson

127
Я думаю, що на сьогоднішній день фактично швидше розміщувати тут або використовувати Google, ніж використовувати man. Зокрема, для того, щоб, grepякби ви не знайомі, manце може зайняти багато часу, щоб знайти приклади в документі, але Google або SO надають приклади протягом декількох секунд.
ely

17
Для запису, ті, хто не знайомий з Linux, можуть бути не знайомі людині. Я знаю лише про його існування, але для спроби з'ясувати, як його використовувати, знадобиться сама по собі пригода Google. Можливо, варте підприємство, але ви повинні усвідомити, що я знайшов ЦЕ ДУЖЕ пост через Google, і він відповів на ТОЧНЕ запитання, яке я задавав. Ресурси, мій друже. Ресурси неоцінені. І ви можете подумати, що це було безглуздо і що він повинен був просто перевірити людину, але це допомогло мені та СТОРІН інших (навіть тисячі). Тому, будь ласка, врахуйте це.
Soundfx4

391

Якщо ви хочете встановити дозволи для всіх файлів a+rі всіх каталогів для цього a+x, і робити це рекурсивно через повне дерево підкаталогів, використовуйте:

chmod -R a+rX *

X(Тобто капітал X, багато x!) Ігнорується для файлів (якщо вони не є виконуваними для кого - то вже є ) , але використовується для каталогів.


27
Чудова відповідь. Просто зауважте, що * не відповідатиме прихованим файлам (імена, що починаються з крапки). Тоді це може мати більше сенсу використовувати. (для поточного каталогу).
Аарон Адамс

21
Це правильна відповідь. У моєму випадку я хотів встановити всі каталоги на 775, а всі файли на 664 . @ Відмінна відповідь Піта привела мене до chmodдокументів, де я зрозумів, що можу використовувати chmod -R g+wX .. Браво!
чадо

8
Це не буде видалено xз файлів, якщо вони вже є.
Бенуа Дюффес

5
Якщо це не зовсім зрозуміло, великий регістр X означає "зробити всі каталоги виконуваними" (але не файли).
Метт Браун

4
@BenoitDuffez, якщо ваша мета - також видалити виконуваний біт з файлів, ви можете комбінувати директиви, наприклад "a-x + rX", щоб видалити "x" з усього, а потім встановити "r" на все і "x" лише на каталоги .
монахини

144

Ви можете використовувати -Rз chmodрекурсивного обходу всіх файлів і вкладених папок.

Можливо, вам знадобиться sudo, оскільки це залежить від встановлення поточного користувача LAMP або іншого:

sudo chmod -R 755 /opt/lampp/htdocs

17
Якось, sudo chmod 755 -R /directoryне працювало, але так і sudo chmod -R 755 /directoryробилося. Дивно. Я, до речі, використовую Mac OS x.
lomse

8
Це правильно в моєму досвіді. Прапор повинен з'являтися безпосередньо після chmod, а не десь у рядку.
orionrush

1
Вище написана команда неправильна. Правильна рекурсивна команда: sudo chmod -R 755 / opt / lampp / htdocs Примітка: -R має бути до 755
Sandip Patel - SM

Це рішення добре працює для Redhat. Дякую!
Лаванда

sudo chmod 755 -R
Відмінно

79

Правильна рекурсивна команда:

sudo chmod -R 755 /opt/lampp/htdocs

-R: зміна кожної підпапки, включаючи поточну


1
привіт ти впевнений, що в поточній папці ти одна, незважаючи на шлях?
shareef

ВИКОРИСТАННЯ ОСХ: sudo chmod 777 журнали / -R ВІДПОВІДЬ: chmod: -R: Немає такого файлу чи каталогу
ПОТРІБНО

76

Щоб встановити всі папки (рекурсивно), використовуйте -R

chmod 755 /folder -R

І використовуйте umask, щоб встановити за замовчуванням нові папки / файли cd / папка umask 755


24
НЕ встановлюйте свій umask755! Ви не зможете перераховувати, читати чи використовувати будь-які створені вами файли чи каталоги!
сонник

14
Ви мали на увазі umask 022?
Xkeeper

4
це встановлює всі 755, включаючи файли.!
Патрік Мутвірі

@sleepynate Про що ти говориш? 755 означає, що власник може читати, писати та виконувати, а всі інші користувачі можуть читати та виконувати, але не записувати на об’єкт
svin83

2
@ NicHartley @ svin83 umask - це біти, які будуть замасковані з дозволів, тому це фактично обернено chmod. λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
сонник

51

chmod 755 -R /opt/lampp/htdocsбуде рекурсивно встановлювати дозволи. Немає можливості автоматично встановлювати дозволи для файлів лише в цьому каталозі, створеному після встановлення дозволів, але ви можете змінити дозволи для файлів за замовчуванням для системи за допомогою налаштування umask 022.


9
Відповідь сонника - ТІЛЬКИ правильна. Плакат задав два питання: 1) Як я можу виправити дозволи на файли та папки, і 2) як змінити параметри за замовчуванням (тобто "майбутні" файли). Як казав Нейт, перше - з "chmod", а друге - з "umask". Я також додам, що немає способу змінити umask лише на 1 каталозі ... umask - це "все або нічого" для користувача. Однак ніщо не заважає вам створити нового користувача, який ділиться з вами групами, так що ви можете просто «судо -у деякому користувачеві [створити файл]". Це трохи поміркує, але це непоганий спосіб вирішення.
Скотт Прив

Я вважаю, що ти маєш рацію, але не може inheritбути вирішенням багатьох випадків чи це буде працювати виключно з NTFS-3G?
Себастьян Шліхт

без дозволу папки можуть бути створені в майбутньому, можливо, не вдасться скопіювати папку, скажімо, myforlderз інших місць (наприклад, ПК) у цей цільовий каталог (на сервері), оскільки вона спробує створити нову папку в цільовий каталог з ім'ям, на myfolder яке ви не маєте дозволу на це. Як я маю root, я просто використовую chown -R username:usergroup /directory.
Гол Джейсона

27

Ви можете розглянути цю відповідь, надану nik on superuser, і використовувати "one chmod" для всіх таких файлів / папок:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

9
Попередження, легко натрапити на обмеження командного рядка.
Лотар

1
У мене є ця помилка: -bash: / bin / chmod: Аргумент занадто довгий
Олег Абражаєв

Краще скористатися -execваріантом find, щоб подолати Argument list too longпомилку.
miravalls


20

Використання:

sudo chmod 755 -R /whatever/your/directory/is

Однак будьте обережні з цим. Це може дійсно нашкодити вам, якщо ви зміните дозволи на неправильні файли / папки.


20

Ось ще один спосіб встановити каталоги на 775, а файли на 664.

find /opt/lampp/htdocs \
\( -type f -exec chmod ug+rw,o+r {} \; \) , \
\( -type d -exec chmod ug+rwxs,o+rx {} \; \)

Це може виглядати довго, але це досить круто з трьох причин:

  1. Сканує файлову систему лише один раз, а не двічі.
  2. Забезпечує кращий контроль над тим, як обробляються файли та як обробляються каталоги . Це корисно при роботі зі спеціальними режимами, такими як клейкий біт , який ви, мабуть, хочете застосувати до каталогів, але не до файлів.
  3. Використовує техніку прямо зі manсторінок (див. Нижче).

Зауважте, що я не підтвердив різницю продуктивності (якщо така є) між цим рішенням та простою використанням двох команд пошуку (як у рішенні Пітера Мортенсена). Однак побачити подібний приклад у посібнику є обнадійливим.

Приклад зі man findсторінки:

find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)

Traverse the filesystem just once, listing setuid files and  direc‐
tories into /root/suid.txt and large files into /root/big.txt.

Ура


Тепер, як перетворити це в скрипт оболонки, щоб ми могли запустити папку openmod $?
СР

Люди, будь ласка, використовуйте xargs. Це економить тисячі викликів процесів.
seanahern

13

chmod -R 755 directory_nameпрацює, але як би ви зберегли нові файли до 755? Дозвіл файлу стає дозволом за замовчуванням.


Я це зробив, але не можу відкрити термінал звідти. Я не можу це виправити.
Кавінду Гаянта

9

Для Mac OS X 10.7 (Lion) це:

chmod -R 755 /directory

І так, як кажуть усі інші, будьте обережні, роблячи це.


9

Ви хочете переконатися, що відповідні файли та каталоги є chmod-ed / дозволи для них відповідні. Для всіх каталогів, які ви хочете

find /opt/lampp/htdocs -type d -exec chmod 711 {} \;

А для всіх зображень, JavaScript, CSS, HTML ... ну, ви не повинні їх виконувати. Тож використовуйте

chmod 644 img/* js/* html/*

Але для всього логічного коду (наприклад, PHP-коду) слід встановити дозволи таким чином, щоб користувач не міг бачити цей код:

chmod 600 file

6

Я думаю, що Адам запитував, як змінити значення umask для всіх процесів, на які пов'язують роботу /opt/lampp/htdocs каталозі.

Користувацька маска режиму створення файлів (umask) використовується для визначення дозволу на файл для новостворених файлів. З його допомогою можна керувати дозволом на нові файли за замовчуванням.

тому якщо ви будете використовувати якусь програму ftp для завантаження файлів, /opt/lampp/htdocsвам потрібно налаштувати свій ftp-сервер для використання потрібного umask.

Якщо файли / каталоги створюються, наприклад, php, вам потрібно змінити код php

<?php
umask(0022);
// other code
?>

якщо ви створите нові файли / папки з вашого bash сесії, ви можете встановити значення umask у вашому профілі оболонки ~ / .bashrc Або ви можете встановити umask в /etc/bashrc або /etc/profileфайл для всіх користувачів. додайте у файл наступне: umask 022

Sample umask Values and File Creation Permissions
If umask value set to   User permission     Group permission     Others permission
000                         all              all                   all
007                         all              all                   none
027                         all          read / execute            none

І щоб змінити дозволи для вже створених файлів, ви можете використовувати find. Сподіваюсь, це допомагає.


4

Існує дві відповіді на пошук файлів та застосування chmodдо них. По-перше, це findфайл і застосувати так, chmodяк він знайде (як це запропонував @WombleGoneBad).

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Друге рішення - генерувати список усіх файлів за допомогою findкоманди та подавати цей список chmodкоманді (як запропонував @lamgesh).

chmod 755 $(find /path/to/base/dir -type d)

Обидві ці версії працюють добре, поки кількість файлів, повернених файлом find командою, невелика. Друге рішення виглядає чудово для очей і легше читається, ніж перше. Якщо файлів велика кількість, друге рішення повертає помилку:Argument list too long.

Тож моя пропозиція така

  1. Використовуйте chmod -R 755 /opt/lampp/htdocs якщо ви хочете одночасно змінити дозволи на всі файли та каталоги.
  2. Використовуйте, find /opt/lampp/htdocs -type d -exec chmod 755 {} \;якщо кількість файлів, які ви використовуєте, дуже велика. The-type x опції пошук певного типу тільки файл, де d використовується для пошуку каталогу, F для файлу і л для посилання.
  3. Використовуйте chmod 755 $(find /path/to/base/dir -type d) інакше
  4. Краще використовувати перший у будь-якій ситуації

2

Це дуже просто.

У Терміналі перейдіть до файлового менеджера. Приклад: sudo nemo. Перейдіть /opt/та натисніть кнопку Властивості → Дозвіл . а потім Інше . Нарешті, змініть, щоб створити та видалити та додати файл до читання та запису та натисніть кнопку застосувати ... І працюйте.


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