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

108

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

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

Команды

mkdir path/foldername
chmod 777 path/foldername 

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

пурани
источник
1
mkdir temp; chmod 777 tempэто одна строка. Вы можете сделать 'temp' переменной и сохранить ее как команду bash. Это то, что ты хочешь сделать?
Styfle
1
привет @ white-rose, пожалуйста, посмотрите последний ответ, это должен быть принятый ответ. бонус, он сочетает в себе mkdir, chmod И chown в одной пуле!
Costin Gușă

Ответы:

205

Согласно странице руководства mkdir ...

mkdir -m 777 dirname
Алекс
источник
1
Не могли бы вы рассказать мне о опции -m?
poorani
Параметр @Whiterose -m предназначен для режима. Устанавливает биты разрешений для вновь созданных каталогов на значение, указанное в переменной Mode. Переменная Mode принимает те же значения, что и параметр Mode для команды chmod, в символьной или числовой форме.
TMKasun 09
15
mkdir -p -m не работает, так как режим применяется только к последнему каталогу в введенном вами пути. Например, mkdir -p -m 707 one / two / three. Даже если все три каталога созданы заново, только последний будет иметь запрошенные разрешения, а остальные - по умолчанию. install -d -m ломается точно так же.
Отображаемое имя
Помимо проблемы -p, связанной с уже упомянутым @DisplayName, есть еще одна проблема . -mБудет применяться только если каталог на самом деле создается. Если он уже существует, его режим не будет изменен. В зависимости от вашего контекста это может быть хорошо или плохо.
Адам Бадура
1
mkdir -m777 directory
Хьюго Дейро
19
install -d -m 0777 /your/dir

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

Маркус В. Мальберг
источник
1
бонус, вы также можете добавить -g и / или -o, и вы можете получить mkdir, chmod и chown за один раз!
Costin Gușă
4
Оно сломано. установить -d -m 070 один / два / три. Даже если все три каталога в пути созданы заново, только последний будет иметь запрошенные разрешения. mkdir -p -m ломается таким же образом.
Отображаемое имя
@DisplayName: который, тем не менее, устанавливает правильные разрешения для three, с разрешениями по умолчанию, достаточными для пути к нему.
Маркус Мальберг
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

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

Делан Азабани
источник
Спасибо, delan .. Я также написал эту команду в сценарии оболочки .. Но я хочу сделать в одной команде.
poorani
7

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

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

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

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

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

Боковое примечание: я говорю «наоборот», поскольку значение umask на самом деле именно то, на что похоже - маска , скрывающая / удаляющая разрешения, а не «предоставляющая» их, как в числовой восьмеричной записи chmod.

Вы можете выполнить команду shell-builtin, 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), эффективно скрывая некоторые из этих perms. Моя umask равна 022 - теперь, если мы «вычтем» 022 из 777 (технически вычитание является чрезмерным упрощением и не всегда правильно - мы фактически отключаем химические завивки или маскируем их) ... мы получаем 755, как указано (или «указано» ) ранее.

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

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

YenForYang
источник
7

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

mkdir -m777 path/foldername 
Омер Гафар
источник
1
между -m и 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-значную маску umask, первая цифра всегда должна быть равна нулю (хотя вы можете ее опустить). Это может быть для симметрии с chmod, где первая восьмеричная цифра устанавливает setuid, setgid и липкие биты, но в таком случае это бессмысленно, поскольку umask не позволяет вам их ограничивать.
Джон Меллор,