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

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

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

命令

mkdir path/foldername
chmod 777 path/foldername

我不喜欢在两个命令中创建和授予权限。我可以在单个命令中这样做吗?

318307 次浏览

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

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

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

./scriptname path/foldername

然而,Alex 的回答要好得多,因为它生成一个进程而不是三个。

根据 Mkdir的手册。

mkdir -m 777 dirname
install -d -m 0777 /your/dir

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

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

首先,我将查看 GNU Coreutils 8.26的 mkdir 手册页面——它提供了关于选项’-m’和’-p’的信息(也可以分别作为—— MODE = MODE 和—— father 给出) :

... set [ s ] file mode (如 chmod) ,而不是 a = rwx-umask

... 没有错误,如果存在,根据需要制作父目录

在我看来,这些陈述含糊不清。但是基本上,它说你可以用“ chmod 数字符号”(八进制)指定的权限创建目录,或者你可以用“另一种方式”使用/your 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)
#

现在,添加一点点关于这些八进制权限的内容。当你创建一个目录时,“你的系统”使用你的默认目录 perms’[它适用于 新的目录(它的值应该是777)] ,并打开 yo (u)掩码,有效地隐藏了一些 perms’。我的 umask 是022——现在如果我们从777中“减去”022(从技术上说减去是一种过度简化,并不总是正确的——我们实际上正在关闭烫发或者 面具ing 它们) ... 我们得到755,如前所述(或者“陈述”)。

我们可以省略3位八进制数前面的“0”(所以它们不必是4位数) ,因为在我们的例子中,我们不想(或者说没有提到)任何粘性位、 setuids 或 setgids (你可能想看看这些,顺便说一下,它们可能会有用,因为你要去777)。换句话说,0777意味着(或等价于)777(但是777不一定等价于0777——因为777只指定权限,而不是 setuids、 setgids 等等)

现在,从更广泛的意义上把这个问题应用到你的问题上——你(已经)有了一些选择。以上所有的答案都是有效的(至少根据我的理论)。但是,当您希望同时创建具有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

我将为 yodirectoryyostuff烫发 755,只有 777烫发 mastuffinyostuff。所以看起来 umaskyodirectoryyostuff的全部... ... 为了避免这个问题,我们可以使用一个子 shell:

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

就这些了,有777个烫发器,给你的东西,马斯蒂芬的东西,还有你的目录。

在这种情况下,最好使用 install命令。

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

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

mkdir -m777 path/foldername

当目录已经存在时:

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

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

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

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

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

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

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