Как создать каталог и дать разрешение в одной команде - PullRequest
84 голосов
/ 26 апреля 2011

Как создать каталог и дать разрешение одной командой в Linux?

Мне нужно создать много папок с полным разрешением 777.

Команда

mkdir path/foldername
chmod 777 path/foldername 

Я не люблю создавать и давать разрешения в двух командах. Могу ли я сделать это одной командой?

Ответы [ 7 ]

174 голосов
/ 26 апреля 2011

Согласно справочной странице mkdir ...

mkdir -m 777 dirname
18 голосов
/ 23 апреля 2014
install -d -m 0777 /your/dir

должен дать вам то, что вы хотите. Помните, что каждый пользователь имеет право писать, добавлять и удалять файлы в этом каталоге.

9 голосов
/ 06 апреля 2017

IMO, лучше использовать команду install в таких ситуациях. Я пытался сделать systemd-journald постоянным при перезагрузках.

install -d  -g systemd-journal -m 2755 -v /var/log/journal
7 голосов
/ 23 января 2019

Когда каталог уже существует:

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

Если каталог не существует и вы хотите создать родительские каталоги:

mkdir -m 777 -p /parent/dirs/to/create/your/dir
6 голосов
/ 16 мая 2018

вы можете использовать следующую команду для создания каталога и одновременного предоставления прав доступа

mkdir -m777 path/foldername 
6 голосов
/ 26 апреля 2011

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

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

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

./scriptname path/foldername

Однако ответ Алекса намного лучше, потому что он порождает один процесс вместо трех.Я не знал о опции -m.

4 голосов
/ 27 февраля 2017

Просто чтобы расширить и улучшить некоторые из приведенных выше ответов:

Сначала я проверю справочную страницу mkdir для GNU Coreutils 8.26 - она ​​дает нам эту информацию о параметрах '-m' и '-p' (также может быть задана как --mode = MODE и - родители соответственно):

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

... без ошибок, если есть, создайте родительские каталоги по мере необходимости

Утверждения, на мой взгляд, расплывчаты и неясны. Но в основном это говорит о том, что вы можете создать каталог с разрешениями, указанными в «chmod numeric notation» (восьмеричные), или вы можете пойти «другим путем» и использовать / your umask.

Примечание: я говорю "по-другому", так как значение umask на самом деле именно так, как оно звучит - маска 1014 *, скрывающая / удаляющая разрешения, а не "предоставляющая" их, как в числовом восьмеричном chmod нотации.

Вы можете выполнить встроенную в оболочку команду umask, чтобы узнать, каков ваш 3-значный umask; для меня это 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 (технически вычитание является чрезмерным упрощением и не всегда корректным - мы фактически отключаем перми или mask их) ... мы получаем 755 как заявлено (или «утверждено») ранее.

Мы можем опустить '0' перед 3-значными восьмеричными числами (поэтому они не должны быть 4-значными), поскольку в нашем случае мы не хотели (или, скорее, не упомянули) никаких залипаний, setuids или setgids (вы можете посмотреть на них, кстати, они могут быть полезны, так как вы едете 777). Другими словами, 0777 подразумевает (или эквивалентен) 777 (но 777 не обязательно эквивалентен 0777 - поскольку 777 определяет только разрешения, а не setuids, setgids и т. Д.)

Теперь, чтобы применить это к вашему вопросу в более широком смысле - у вас (уже) есть несколько вариантов. Все ответы выше работают (по крайней мере, согласно моим coreutils). Но вы можете (или весьма вероятно) столкнетесь с проблемами с вышеуказанными решениями, когда захотите создать sub каталогов (вложенных каталогов) с разрешениями 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 разрешений на yostuff, mastuffinyostuff и yodirectory.

...