如何在 Linux 中创建目录并在单个命令中授予权限?
我必须创建很多具有完全权限的文件夹777
。
命令
mkdir path/foldername
chmod 777 path/foldername
我不喜欢在两个命令中创建和授予权限。我可以在单个命令中执行此操作吗?
根据mkdir的手册页...
mkdir -m 777 dirname
当目录已经存在时:
mkdir -m 777 /path/to/your/dir
当目录不存在并且您要创建父目录时:
mkdir -m 777 -p /parent/dirs/to/create/your/dir
install -d -m 0777 /your/dir
应该给你你想要的。请注意,每个用户都有权在该目录中写入添加和删除文件。
IMO,最好install
在这种情况下使用该命令。我试图systemd-journald
在重新启动后保持持久性。
install -d -g systemd-journal -m 2755 -v /var/log/journal
只是为了扩展和改进上述一些答案:
首先,我将查看 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
我将获得 和 的烫发755
,yodirectory
只有yostuff
. 的777
烫发mastuffinyostuff
。所以看起来这umask
就是所有的东西,yodirectory
并且yostuff
......为了解决这个问题,我们可以使用一个子shell:
( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )
就是这样。yostuff、mastufinyostuff 和 yodirectory 的 777 个烫发。
您可以编写一个简单的 shell 脚本,例如:
#!/bin/bash
mkdir "$1"
chmod 777 "$1"
保存并启用可执行标志后,您可以运行它而不是 mkdir 和 chmod:
./scriptname path/foldername
但是,亚历克斯的答案要好得多,因为它产生了一个进程而不是三个。我不知道这个-m
选项。
you can use following command to create directory and give permissions at the same time
mkdir -m777 path/foldername
不要这样做: 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 中的任何一个已经存在,这不会更改权限。