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


107

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

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

指令

mkdir path/foldername
chmod 777 path/foldername 

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


1
mkdir temp; chmod 777 temp是一行。您可以将'temp'设置为变量并将其另存为bash命令。这是您要做什么?
styfle 2011年

1
嗨@ white-rose,请查看最新答案,它应该是被接受的答案。奖金,它将mkdir,chmod和chown组合在一个子弹中!
Costin Gușă 2014年

Answers:


205

根据mkdir的手册页...

mkdir -m 777 dirname

1
您能告诉我有关-m选项的信息吗?
poorani

@Whiterose -m选项适用于模式。将新创建目录的权限位设置为Mode变量指定的值。Mode变量采用chmod命令的Mode参数的相同符号或数字形式的值。
TMKasun 2014年

14
mkdir -p -m已损坏,因为该模式仅应用于您键入的路径中的最后一个目录。例如,mkdir -p -m 707一/二/三。即使所有三个目录都是新创建的,也只有最后一个目录具有所请求的权限,而其他目录则为默认权限。install -d -m以相同的方式损坏。
显示名称

除了-p上面已经提到的@DisplayName 问题外,还有另一个问题。-m仅当实际创建目录时,此选项才适用。如果已经存在,其模式将不会更改。根据您的上下文,这可能是好是坏。
亚当·巴杜拉

1
mkdir -m777目录
HugoDeiró18年

19
install -d -m 0777 /your/dir

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


1
另外,您还可以添加-g和/或-o,并且可以一次性添加mkdir,chmod和chown!
Costin Gușă 2014年

4
坏了 安装-d -m 070一/二/三。即使路径中的所有三个目录都是新创建的,也只有最后一个目录会设置请求的权限。mkdir -p -m以相同的方式被破坏。
显示名称

@DisplayName:尽管如此,它仍为设置了正确的权限three,而默认权限足以作为其路径。
马库斯·马赫伯格

16

目录已经存在时:

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

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

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

这只会将777权限授予最终子目录。我该怎么做,并给所有父目录授予权限777?
维·约翰逊

1
我没有这一个答案,但我相信这个答案就在这里:stackoverflow.com/questions/3740152/...
佩德罗·特鲁希略

请注意,此命令是为了解决此问题“如何在单个命令中创建目录并授予权限”。我相信您的问题的解决方案将是:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo

10

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

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

7

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

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

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

./scriptname path/foldername

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


谢谢delan ..我也在shell脚本中写了该命令。.但是我想在单个命令中做。
poorani

7

只是为了扩展和改善上述答案:

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

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

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

我认为这些陈述含糊不清。但是从根本上说,它可以使目录具有“ chmod数字符号”(八进制)指定的权限,也可以“以其他方式”使用a /您的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)
 # 

现在,仅添加一些关于这些八进制权限的信息。创建目录时,“您的系统”将使用默认目录权限(适用于目录(其值应为777))并拍打yo(u)掩码,从而有效地隐藏了其中的一些权限。我的umask是022-现在,如果我们从777中“减去” 022(从技术上讲,这是过分简化,但并不总是正确的-我们实际上是在关闭烫发或遮罩))...我们得到755(如所述) )。

我们可以在3位数的八进制前面省略“ 0”(因此它们不必为4位数),因为在我们的情况下,我们不需要(或更不用提)任何粘性位,setuid或setgids (顺便说一句,您可能想研究一下这些内容,因为您要使用777,它们可能很有用)。因此,换句话说,0777暗含(或等效于)777(但777不一定等效于0777,因为777仅指定权限,而不指定setuid,setgids等)。

现在,将其广泛地应用于您的问题-您(已经)有一些选择。以上所有答案均有效(至少根据我的coreutils)。但你可能(或相当可能)碰到上述问题的解决,当你想创建一下子目录(嵌套目录)与777个权限。具体来说,如果我在uhome中使用umask 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

我会得到烫发755两个yodirectoryyostuff,只777烫发了mastuffinyostuff。因此,看来,umask是所有的耳光yodirectoryyostuff......来解决这个问题,我们可以使用一个子shell:

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

就是这样。yostuff,mastuffinyostuff和yodirectory的777个烫发。



1

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

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

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

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


是的,如果您传递一个4位数的umask,则前导数字必须始终为零(尽管您可以忽略它)。可能是为了与chmod对称,其中第一个八进制数字设置setuid,setgid和sticky位,但是如果这样,那将毫无意义,因为umask不允许您限制这些位。
John Mellor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.