如何用单个命令创建目录并赋予权限

148

如何在Linux中一条命令中创建目录并赋予权限?

我需要创建许多带有完全权限777的文件夹。

命令

mkdir path/foldername
chmod 777 path/foldername 

我不喜欢用两个命令来创建并赋予权限。 我能用一个命令完成吗?


2
mkdir temp; chmod 777 temp 是一行命令。你可以将“temp”作为一个变量,并将其保存为bash命令。这是你想要做的吗? - styfle
2
嗨 @white-rose,请查看最新的答案,它应该是被采纳的答案。而且奖励的是,它将mkdir、chmod和chown组合成一个单独的步骤! - Costin Gușă
8个回答

286

根据mkdir的手册...

mkdir -m 777 dirname

2
请问一下,“-m”选项是什么意思? - whiterose
33
“mkdir -p -m”命令存在问题,因为权限只会应用在你输入路径中最后一个目录上。例如,“mkdir -p -m 707 one/two/three”,即使三个目录都是新创建的,只有最后一个目录会具有请求的权限设置,其他目录则采用默认设置。同样,“install -d -m”也存在相同的问题。 - Display Name
2
mkdir -m777 directory - Hugo Deiró
3
@Crossfit_and_Beer 上述语句是有效的(至少对于我在Debian 8和9上是这样)。重点在于-p / --parents选项。 进行测试:mkdir -p -m777 /tmp/foo/bar/baz,您会发现创建的目录将根据当前umask设置其权限,除了最后一个目录将获得所需的模式。 - Tylla
2
@Crossfit_and_Beer 的区别在于,正如我强调的那样,是--parent开关。您应该创建一个目录链,如下所示: `$ umask 022; mkdir -p -m777 /tmp/foo/bar/baz; ls -lR /tmp/drwxr-xr-x 3 tylla tylla 4096 dec 26 23:39 foodrwxr-xr-x 3 tylla tylla 4096 dec 26 23:39 bardrwxrwxrwx 2 tylla tylla 4096 dec 26 23:39 baz` 其中,/tmp之前是空的。如果您像创建两个单独的目录一样进行操作,您将不会注意到差异。 - Tylla
显示剩余4条评论

28

当目录已经存在时:

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

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

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

3
这将仅为最终子目录授予权限777。我该如何做到并为所有父目录也赋予权限777呢? - Levi
4
我没有对此的答案,但我相信这里有答案:https://dev59.com/Nm865IYBdhLWcg3wlvqq - Pedro Trujillo
请注意,此命令是为了解决“如何在单个命令中创建目录并授予权限”的问题。我相信你的问题的解决方案将类似于:find /your/dirs -type d -exec chmod 755 {} \; - Pedro Trujillo

25
install -d -m 0777 /your/dir

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


2
奖励,您还可以添加-g和/或-o,并且可以一次性拥有mkdir,chmod和chown! - Costin Gușă
8
它坏了。安装 -d -m 070 one/two/three。即使路径中的三个目录都是新创建的,只有最后一个目录会具有所请求的权限设置。mkdir -p -m以相同的方式破损。 - Display Name
@DisplayName: 这将为“three”设置正确的权限,而默认权限对其路径来说已经足够。 - Markus W Mahlberg
@MarkusWMahlberg 如果只对一个路径组件设置正确的权限,最终结果与未设置权限的情况相同,那么这样做有什么意义呢?我是否需要对整个层次结构运行 chmod -R 呢? - Hi-Angel
最小权限原则。 - Markus W Mahlberg

15

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

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

3
你能否辩论一下为什么这样做更好? - wearego
4
@wearego 好吧,我猜其中一个原因是它允许设置所有权。 - Raid

9

为了扩展和完善上面的一些答案:

首先,我会查阅GNU Coreutils 8.26的mkdir手册,它给出了有关选项“-m”和“-p”的信息(也可以分别给出为--mode=MODE和--parents):

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

...如果存在,则不报错,根据需要创建父目录

在我看来,这些陈述含糊不清。但基本上,它意味着您可以使用“chmod数字表示法”(八进制)指定权限来创建目录,或者您可以采用另一种方式并使用a/您的umask。

顺便说一下:我之所以说“另一种方式”,是因为umask值实际上就是它听起来的样子——一个掩码,隐藏/删除权限,而不像chmod的数字八进制表示法那样“授予”它们。

您可以执行shell内置命令umask,以查看您的3位umask是多少;对于我来说,它是022。这意味着当我在给定文件夹(比如mahome)中执行mkdir yodirectory时,并且执行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)
 # 

现在,再补充一点关于八进制权限的内容。当你创建一个目录时,“你的系统”会采用默认的目录权限(适用于新目录,其值应为777)并添加上你的掩码,从而隐藏其中一些权限。我的掩码是022——现在如果我们从777中“减去”022(技术上减法过于简化,不总是正确的——我们实际上是关闭权限或者掩盖它们),就像之前所述的那样,我们得到755。
我们可以省略3位八进制数字前面的‘0’(因此它们不必是4位数),因为在我们的情况下,我们不想(或者说没有提到)设置任何粘滞位、setuids或setgids(你可能想了解一下这些,顺便说一句,它们可能很有用,因为你要使用777)。因此,换句话说,0777意味着(或等同于)777(但777不一定等同于0777——因为777只指定了权限,而没有设置setuids、setgids等)。
现在,更广义地将其应用于你的问题——你已经有了几个选项。以上所有答案都可以(至少根据我的coreutils)。但是,当你想要一次性创建所有子目录(嵌套目录)的777权限时,你可能会遇到以上解决方案的问题。具体来说,如果我在mahome中使用掩码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

我将为yodirectoryyostuff设置权限755,而仅为mastuffinyostuff设置权限777。所以似乎只有yodirectoryyostuff上被施加了umask...为了规避这个问题,我们可以使用子shell: ( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff ) 这就是全部内容。对于yostuff、mastuffinyostuff和yodirectory,权限为777。

我从未看过这么长的东西,试图解释可以用三行概括的内容。 - Akmal

8
您可以编写一个简单的shell脚本,例如:
#!/bin/bash
mkdir "$1"
chmod 777 "$1"

一旦保存并启用可执行标志,您可以运行它来代替mkdir和chmod:

./scriptname path/foldername

然而,alex的回答更好,因为它只生成一个进程而不是三个。我不知道-m选项。


谢谢Delan。我也在shell脚本中编写了那个命令。但是我想用单个命令完成。 - whiterose

7
你可以使用以下命令同时创建目录并设置权限。
mkdir -m777 path/foldername 

4
-m和777之间没有空格。 - Omer Gafar

6
不要这样做: mkdir -m 777 -p a/b/c,因为这只会将权限777设置在最后一个目录"c"上,a和b将使用您的umask的默认权限创建。
相反,为了以权限777创建任何新目录,请在一个子shell中运行mkdir -p并覆盖umask:
(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

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

2
是的,如果您传递一个4位数的umask,则前导数字始终必须为零(尽管您可以省略它)。这可能是为了与chmod对称,其中第一个八进制数字设置setuid、setgid和sticky位,但如果是这样的话,它就没有什么意义,因为umask不允许您限制这些位。 - John Mellor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接