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

poo*_*ani 92 linux chmod mkdir

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

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

命令

mkdir path/foldername
chmod 777 path/foldername 
Run Code Online (Sandbox Code Playgroud)

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

ale*_*lex 188

mkdir的手册页...

mkdir -m 777 dirname
Run Code Online (Sandbox Code Playgroud)

  • mkdir -p -m已损坏,因为该模式仅应用于您键入的路径中的最后一个目录.例如,mkdir -p -m 707一/二/三.即使新创建了所有三个目录,也只有最后一个目录具有所请求的权限,而其他目录都是默认权限.安装-d -m以同样的方式被破坏. (10认同)
  • @Crossfit_and_Beer 上述声明是有效的(至少对 Debian 8 和 9 上的我来说)。重点是 -p/--parents 选项。进行测试:`mkdir -p -m777 /tmp/foo/bar/baz`,您将看到创建的目录将根据当前的 umask 设置权限,除了最后一个目录将获得所需的模式。 (3认同)
  • 你能告诉我有关 -m 选项的信息吗? (2认同)
  • mkdir -m777 目录 (2认同)
  • @Crossfit_and_Beer 的区别是 - 正如我强调的 - --parent 开关。您应该创建一个目录链,如下所示:`$ umask 022; mkdir -p -m777 /tmp/foo/bar/baz; ls -lR /tmp/ drwxr-xr-x 3 tylla tylla 4096 12 月 26 日 23:39 foo drwxr-xr-x 3 tylla tylla 4096 dec 26 23:39 bar drwxrwxrwx 2 tylla tylla 4096 12 月 26 日 23:39 baz` 其中 / tmp 之前是空的。如果您像以前一样创建两个单独的目录,您将不会注意到其中的差异。 (2认同)

Mar*_*erg 18

install -d -m 0777 /your/dir
Run Code Online (Sandbox Code Playgroud)

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

  • 它坏了.安装-d -m 070一/二/三.即使路径中的所有三个目录都是新创建的,只有最后一个目录将设置所请求的权限.mkdir -p -m以相同的方式被破坏. (4认同)
  • 另外,您还可以添加 -g 和/或 -o,并且您可以一次性使用 mkdir、chmod 和 chown! (2认同)

Ped*_*llo 11

目录已经存在时:

mkdir -m 777 /path/to/your/dir
Run Code Online (Sandbox Code Playgroud)

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

mkdir -m 777 -p /parent/dirs/to/create/your/dir
Run Code Online (Sandbox Code Playgroud)

  • 这只会授予最终子目录 777 权限。我怎样才能做到这一点并向所有父目录授予 777 权限? (3认同)
  • 我没有答案,但我相信答案就在这里:/sf/ask/261810671/ -其子文件夹和文件 (2认同)

小智 10

IMO,install在这种情况下使用命令会更好.我试图systemd-journald在重新启动时保持持久性.

install -d  -g systemd-journal -m 2755 -v /var/log/journal
Run Code Online (Sandbox Code Playgroud)

  • @wearego 好吧,我想它也允许设置所有权.. (4认同)
  • 你能争论为什么它更好吗? (3认同)

Del*_*ani 6

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

#!/bin/bash
mkdir "$1"
chmod 777 "$1"
Run Code Online (Sandbox Code Playgroud)

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

./scriptname path/foldername
Run Code Online (Sandbox Code Playgroud)

然而,亚历克斯的答案要好得多,因为它产生了一个过程而不是三个过程.我不知道这个-m选项.


Ome*_*far 6

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

mkdir -m777 path/foldername 
Run Code Online (Sandbox Code Playgroud)

  • -m 和 777 之间没有空格 (4认同)

Joh*_*lor 6

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

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

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)
Run Code Online (Sandbox Code Playgroud)

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

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

Yen*_*ang 5

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

首先,我将检查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)
 # 
Run Code Online (Sandbox Code Playgroud)

现在,仅添加一些关于这些八进制权限的信息。创建目录时,“您的系统”将使用默认目录权限(适用于目录(其值应为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
Run Code Online (Sandbox Code Playgroud)

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

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

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