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

Posted

技术标签:

【中文标题】如何在单个命令中创建目录并授予权限【英文标题】:How to create a directory and give permission in single command 【发布时间】:2011-08-12 18:44:30 【问题描述】:

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

我必须创建大量具有完全权限777 的文件夹。

命令

mkdir path/foldername
chmod 777 path/foldername 

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

【问题讨论】:

mkdir temp; chmod 777 temp 是一行。您可以将“temp”设为变量并将其保存为 bash 命令。这是你想要做的吗? 嗨@white-rose,请查看最新答案,它应该是公认的答案。奖励,它将 mkdir、chmod 和 chown 组合在一个项目符号中! 【参考方案1】:

根据mkdir的手册页...

mkdir -m 777 dirname

【讨论】:

你能告诉我关于 -m 选项的信息吗? mkdir -p -m 已损坏,因为该模式仅适用于您键入的路径中的最后一个目录。例如,mkdir -p -m 707 一/二/三。即使所有三个目录都是新创建的,也只有最后一个具有请求的权限,其他目录默认。 install -d -m 以同样的方式被破坏。 mkdir -m777 目录 @Crossfit_and_Beer 上面的声明是有效的(至少对我来说在 Debian 8 和 9 上)。重点是 -p/--parents 选项。进行测试:mkdir -p -m777 /tmp/foo/bar/baz,您会看到创建的目录将根据当前的 umask 设置其权限,除了最后一个将获得所需模式的目录。 @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 foo drwxr-xr-x 3 tylla tylla 4096 dec 26 23:39 bar drwxrwxrwx 2 tylla tylla 4096 dec 26 23:39 baz 其中 /tmp 以前为空。如果您像以前那样创建两个单独的目录,则不会注意到差异。【参考方案2】:
install -d -m 0777 /your/dir

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

【讨论】:

红利,您还可以添加 -g 和/或 -o 并且您可以一次性拥有 mkdir、chmod 和 chown! 它坏了。安装 -d -m 070 一/二/三。即使路径中的所有三个目录都是新创建的,也只有最后一个具有请求的权限集。 mkdir -p -m 以同样的方式被破坏。 @DisplayName: 仍然为three 设置了正确的权限,默认权限就足够了。 @MarkusWMahlberg 对一个路径组件拥有正确权限有什么意义,如果最终结果与没有设置它们一样:我将不得不运行chmod -R 整个层次结构?【参考方案3】:

当目录已经存在时:

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

当目录不存在而你想创建父目录时:

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

【讨论】:

这只会将权限 777 授予最终子目录。我怎样才能做到这一点,并为所有父目录授予 777 权限? 我没有答案,但我相信答案在这里:***.com/questions/3740152/… 注意这个命令是为了解决“如何在单个命令中创建目录并赋予权限”这个问题。我相信您的问题的解决方案类似于:find /your/dirs -type d -exec chmod 755 \;【参考方案4】:

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

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

【讨论】:

你能说说为什么它更好吗? @wearego 好吧,我想它也允许设置所有权..【参考方案5】:

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

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

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

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

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

旁注:我说“另一种方式”,因为 umask 值实际上正是它听起来的样子 - mask,隐藏/删除权限而不是像 chmod 的数字那样“授予”它们八进制表示法。

您可以执行shell-builtin 命令umask 来查看您的3 位umask 是什么;对我来说,它是022。这意味着当我在给定文件夹(比如 mahome)中执行 mkdir yodirectorystat 时,我会得到一些类似这样的输出:

               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' [适用于 new 目录(它的值应该是 777)] 并在 yo(u)mask 上拍打,有效地隐藏了其中的一些烫发'。我的 umask 是 022——现在如果我们从 777 中“减去”022(从技术上讲,减去是一种过度简化,并不总是正确的——我们实际上是关闭烫发或 屏蔽它们)......我们得到 755如前所述(或“陈述”)。

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

现在,从更广泛的意义上将此应用于您的问题 - 您(已经)有几个选择。以上所有答案都有效(至少根据我的coreutils)。但是当您想要一次创建具有 777 权限的 sub 目录(嵌套目录)时,您可能(或很可能)遇到上述解决方案的问题。具体来说,如果我在 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

我将为yodirectoryyostuff 获得755 的烫发,而mastuffinyostuff 的只有777 的烫发。所以看来umaskyodirectoryyostuff 的全部内容...为了解决这个问题,我们可以使用子shell:

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

就是这样。 yostuff、mastuffinyostuff 和 yodirectory 的 777 次烫发。

【讨论】:

【参考方案6】:

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

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

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

./scriptname path/foldername

但是,alex's answer 要好得多,因为它生成一个进程而不是三个。我不知道-m 选项。

【讨论】:

谢谢delan..我也在shell脚本中写了那个命令..但我想用单个命令来做。【参考方案7】:

您可以使用以下命令同时创建目录并授予权限

mkdir -m777 path/foldername 

【讨论】:

-m 和 777 之间没有空格【参考方案8】:

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

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

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

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

【讨论】:

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

以上是关于如何在单个命令中创建目录并授予权限的主要内容,如果未能解决你的问题,请参考以下文章

我们如何授予用户在 phpmyadmin(cPanel) 中创建数据库的权限?

如何将现有用户的权限授予我在 Oracle 中创建的用户?谢谢

如何使用 JDA 在 Discord 中创建文本通道:Java Discord Api

在单个命令行中创建文件以及嵌套目录

为用户授予在 postgresql 中创建的任何新表的权限

授予权限以在 oracle sql 过程中创建表