132

如何在 Linux 中创建目录并在单个命令中授予权限?

我必须创建很多具有完全权限的文件夹777

命令

mkdir path/foldername
chmod 777 path/foldername 

我不喜欢在两个命令中创建和授予权限。我可以在单个命令中执行此操作吗?

4

8 回答 8

253

根据mkdir的手册页...

mkdir -m 777 dirname
于 2011-04-26T05:33:42.213 回答
22

当目录已经存在时:

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

当目录不存在并且您要创建父目录时:

mkdir -m 777 -p /parent/dirs/to/create/your/dir
于 2019-01-22T22:54:53.463 回答
21
install -d -m 0777 /your/dir

应该给你你想要的。请注意,每个用户都有权在该目录中写入添加和删除文件。

于 2014-04-23T13:15:56.360 回答
10

IMO,最好install在这种情况下使用该命令。我试图systemd-journald在重新启动后保持持久性。

install -d  -g systemd-journal -m 2755 -v /var/log/journal
于 2017-04-06T09:01:46.730 回答
8

只是为了扩展和改进上述一些答案:

首先,我将查看 GNU Coreutils 8.26 的 mkdir 手册页——它为我们提供了有关选项 '-m' 和 '-p' 的信息(也可以分别以 --mode=MODE 和 --parents 的形式给出):

...设置[s] 文件模式(如在 chmod 中),而不是 a=rwx - umask

...如果存在则没有错误,根据需要创建父目录

在我看来,这些陈述含糊不清。但基本上,它说您可以使用“chmod numeric notation”(八进制)指定的权限创建目录,或者您可以“另辟蹊径”并使用/您的umask。

旁注:我说“另一种方式”,因为 umask 值实际上正是它听起来的样子——一个mask,隐藏/删除权限,而不是像 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——现在如果我们从 777 中“减去”022(从技术上讲,减去是一种过度简化,并不总是正确的——我们实际上是在关闭烫发或屏蔽它们)......我们得到 755,如所述(或“statted”) ) 早些时候。

我们可以省略 3 位八进制前面的“0”(因此它们不必是 4 位),因为在我们的例子中,我们不想要(或者更确切地说没有提到)任何粘性位、setuid 或setgids(你可能想看看那些,顺便说一句,它们可能很有用,因为你要去 777)。所以换句话说,0777 暗示(或等同于)777(但 777 不一定等同于 0777——因为 777 只指定权限,而不是 setuids、setgids 等)

现在,从更广泛的意义上将此应用于您的问题——您(已经)有几个选择。以上所有答案都有效(至少根据我的coreutils)。但是当您想要一次创建具有 777 权限的子目录(嵌套目录)时,您可能(或很可能)遇到上述解决方案的问题。具体来说,如果我在 mahome 中使用 022 的 umask 执行以下操作:

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

我将获得 和 的烫发755yodirectory只有yostuff. 的777烫发mastuffinyostuff。所以看起来这umask就是所有的东西,yodirectory并且yostuff......为了解决这个问题,我们可以使用一个子shell:

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

就是这样。yostuff、mastufinyostuff 和 yodirectory 的 777 个烫发。

于 2017-02-27T07:05:24.250 回答
7

您可以编写一个简单的 shell 脚本,例如:

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

保存并启用可执行标志后,您可以运行它而不是 mkdir 和 chmod:

./scriptname path/foldername

但是,亚历克斯的答案要好得多,因为它产生了一个进程而不是三个。我不知道这个-m选项。

于 2011-04-26T05:33:08.100 回答
7

you can use following command to create directory and give permissions at the same time

mkdir -m777 path/foldername 
于 2018-05-16T13:17:17.367 回答
4

不要这样做: mkdir -m 777 -p a/b/c因为这只会777在最后一个目录 c 上设置权限;a 和 b 将使用您的 umask 的默认权限创建。

要创建任何具有权限的新目录,请在覆盖 umask 的子shell 中777运行:mkdir -p

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

请注意,如果 a、b 和 c 中的任何一个已经存在,这不会更改权限。

于 2020-06-02T17:56:52.757 回答