Як створити каталог і дати дозвіл в одній команді


108

Як створити каталог і дати дозвіл в одній команді в Linux?

Я повинен створити багато папок з повним дозволом 777.

Команди

mkdir path/foldername
chmod 777 path/foldername 

Мені не подобається створювати та давати дозвіл у двох командах. Чи можу я це зробити в одній команді?


1
mkdir temp; chmod 777 temp- це один рядок. Ви можете зробити 'temp' змінною і зберегти її як команду bash. Це те, що ви хочете зробити?
стайф

1
привіт @ біла троянда, будь ласка, подивіться останню відповідь, це має бути прийнята відповідь. бонус, він поєднує mkdir, chmod AND chown в єдиній кулі!
Costin Gușă

Відповіді:


205

Відповідно до сторінки чоловіка mkdir ...

mkdir -m 777 dirname

1
Чи можете ви pls сказати мені про -m варіант?
poorani

@Whiterose -m варіант призначений для Mode. Встановлює біти дозволу для новостворених каталогів значенням, визначеним змінною Mode. Змінна Mode приймає ті самі значення, що і параметр Mode для команди chmod, або в символьній, або в числовій формі.
TMKasun

14
mkdir -p -m порушено, оскільки режим застосовується лише до останнього каталогу у введеному вами шляху. Наприклад, mkdir -p -m 707 один / два / три. Навіть якщо всі три каталоги створені заново, лише останній матиме запитані дозволи, а інші - за замовчуванням. install -d -m порушується так само.
Відображати ім’я

Крім проблеми навколо -pцього @DisplayName, про яку вже говорилося вище, є ще одна. Застосування -mзастосовуватиметься лише в тому випадку, якщо каталог фактично створений. Якщо він вже існує, його режим не буде змінено. Залежно від вашого контексту це може бути добре чи погано.
Адам Бадура

1
каталог mkdir -m777
Hugo Deiró

19
install -d -m 0777 /your/dir

повинен дати вам те, що ви хочете. Пам’ятайте, що кожен користувач має право писати додавання та видалення файлів у цей каталог.


1
бонус, ви також можете додати -g та / або -o, і ви можете мати mkdir, chmod та chown в одному кадрі!
Костін Гуша

4
Це зламано. встановити -d -m 070 один / два / три. Навіть якщо всі три каталоги на шляху створені заново, лише для останнього буде встановлено запитувані дозволи. mkdir -p -m порушується таким же чином.
Відображати ім’я

@DisplayName: який, тим не менш, встановлює правильні дозволи, для дозволів за threeзамовчуванням достатньо для шляху до нього.
Markus W Mahlberg

17

Коли каталог вже існує:

mkdir -m 777 /path/to/your/dir

Коли каталог не існує і ви хочете створити батьківські каталоги:

mkdir -m 777 -p /parent/dirs/to/create/your/dir

Це дасть дозвіл 777 лише на остаточний підкаталог. Як я можу це зробити і надати дозвіл 777 також усім батьківським каталогам?
Леві Йогансен

2
У мене немає відповіді на це, але я вважаю, що відповідь на це є тут: stackoverflow.com/questions/3740152/…
Педро Трухільо

Зауважте, що ця команда повинна вирішити цю проблему "Як створити каталог і дати дозвіл в одній команді". Я вірю, що рішення вашого питання буде чимось на зразок:find /your/dirs -type d -exec chmod 755 {} \;
Педро Трухільо

10

ІМО, краще використовувати installкоманду в таких ситуаціях. Я намагався зробити systemd-journaldнаполегливим через перезавантаження.

install -d  -g systemd-journal -m 2755 -v /var/log/journal

7

Ви можете написати простий скрипт оболонки, наприклад:

#!/bin/bash
mkdir "$1"
chmod 777 "$1"

Після збереження та включення виконуваного прапора ви можете запустити його замість mkdir та chmod:

./scriptname path/foldername

Однак відповідь Алекса набагато краща, оскільки породжує один процес замість трьох. Я не знав про -mваріант.


Спасибі Делан .. Я також написав цю команду в скрипті оболонки .. Але я хочу зробити в одній команді.
poorani

7

Просто для розширення та вдосконалення деяких вищезазначених відповідей:

По-перше, я перевірю сторінку mkdir man для GNU Coreutils 8.26 - вона дає нам цю інформацію про параметри '-m' та '-p' (також може бути вказана як --mode = MODE та --parents відповідно ):

... встановити режим файлу [s] (як у chmod), а не a = rwx - umask

... немає помилок, якщо вони існують, робіть батьківські каталоги за потребою

Твердження на мій погляд нечіткі та незрозумілі. Але в основному це говорить про те, що ви можете зробити каталог з дозволами, визначеними "chmod numeric notation" (восьмеринцями), або ви можете піти "іншим шляхом" і використовувати / ваш umask.

Побічна примітка: Я кажу "в інший спосіб", оскільки значення umask - це саме те, що воно звучить - маска , приховування / видалення дозволів, а не "надання" їх, як у числових восьмеричних позначеннях chmod.

Ви можете виконати команду-вбудовану оболонку, umaskщоб побачити, що ваш 3-значний умаск; для мене це 022. Це означає, що коли я виконую mkdir yodirectoryв заданій папці (скажімо, mahome) і в statній, я отримаю деякий вихід, схожий на це:

               755                   richard:richard         /mahome/yodirectory
 #          permissions                 user:group      what I just made (yodirectory),
 # (owner,group,others--in that order)                 where I made it (i.e. in mahome)
 # 

Тепер, щоб додати лише трохи детальніше про ці вісімкові дозволи. Коли ви створюєте каталог, "ваша система" приймає за замовчуванням каталог perms '[що застосовується для нових каталогів (його значення повинно бути 777)] і ляпає по yo (u) масці, ефективно приховуючи деякі з них. Мій Umask 022 - тепер , якщо ми «відняти» 022 з 777 (технічно вирахування є oversimplication і не завжди правильно - ми фактично відключивши завивка або маскувати їх ING) ... ми отримуємо 755 , як зазначено (або «statted» ) раніше.

Ми можемо опустити "0" перед трицифровими восьмериками (тому вони не повинні бути 4-значними), оскільки в нашому випадку ми не хотіли (а точніше не згадували) жодних липких лічильників, налаштувань чи сетгідів (ви, можливо, захочете заглянути до них, btw, вони можуть бути корисними, оскільки ви їдете 777). Іншими словами, 0777 означає (або еквівалентно) 777 (але 777 не обов'язково еквівалентно 0777 - оскільки 777 вказує лише дозволи, а не настройки, setgids тощо)

Тепер, щоб застосувати це до свого питання в більш широкому розумінні - у вас є (вже) кілька варіантів. Усі відповіді вище (хоча б за моїми основними принципами) працюють. Але ви можете (або з великою ймовірністю виникнути) проблеми з вищезазначеними рішеннями, коли хочете створити підкаталоги (вкладені каталоги) з 777 дозволами одночасно. Зокрема, якщо я роблю наступне в mahome з umask 022:

mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff

Я отримаю хімічну таємницю 755для обох yodirectoryі yostuff, тільки 777для хімічних речовин за mastuffinyostuff. Таким чином, виявляється, що umaskвсе, що ляпає, yodirectoryі yostuff... щоб обійти це, ми можемо використовувати нижню частину корпусу:

( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )

і це все. 777 хімічних речовин для йоду, мастуфініости і йодиректорії.


7

Ви можете використовувати наступну команду для створення каталогу та надання дозволів одночасно

mkdir -m777 path/foldername 

1
між -м і 777 немає місця
Омер Гафар

1

Не робіть: mkdir -m 777 -p a/b/c оскільки це встановить дозвіл лише 777на останню директорію, c; a і b будуть створені з дозволу за умовчанням з вашого umask.

Замість того, щоб створювати будь-які нові каталоги з дозволом 777, запустіть mkdir -pу нижній частині, де ви перекриєте umask:

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

Зауважте, що це не змінить дозволи, якщо якісь з a, b і c вже існують.


Так, якщо ви передаєте 4-значний умаск, провідна цифра завжди повинна бути нульовою (хоча ви можете її опустити). Це може бути для симетрії з chmod, де перша восьмерична цифра задає встановлені, жорсткі та клейкі біти, але якщо так, то безглуздо, оскільки umask не дозволяє вам обмежувати їх.
Джон Меллор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.