可以在命令行上设置权限来创建文件吗?


37

创建目录时,mkdir -m <mode> <dir>可以创建一个(或多个)具有给定模式/权限集的目录。

在命令行上是否有用于创建文件的等效项?

类似于:

open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);

在这里使用touch后跟是chmod我唯一的选择吗?


编辑:尝试使用teppic的建议后install,我进行了遍历strace以查看它与原子的接近程度。答案不是非常:

$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600)                         = 0
close(4)                                = 0
...
chmod("newfile", 0777)                  = 0
...

尽管如此,它仍然是单个shell命令,而我以前是不知道的。

Answers:


47

您可以将install命令(GNU coreutils的一部分)与虚拟文件一起使用,例如

install -b -m 755 /dev/null newfile

如果该-b选项newfile已经存在,将对其进行备份。您也可以使用此命令来设置所有者。


4
+1向我介绍install
quornian

这是一个有用的小命令。顾名思义,它实际上是为安装从源代码编译的软件而设计的,从而省去了始终使用chmod,chown等的麻烦。
teppic 2012年

如果只用了stdin!好的,/ proc / self / fd / 0可以满足我的目的。
proski

请注意,模式755是使用创建的文件的默认权限install,因此-m 755不需要。
库萨兰达

@Kusalananda这显然只是如何设置模式的例子,因为这是问题,而不是如何设置755
teppic

22

touch如果文件不存在,则始终创建该文件,始终跟随符号链接,并始终使该文件不可执行。您可以通过umask决定读写位。

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file

O_NOFOLLOW传统的Shell工具无法“安全”地创建原子文件(尤其是使用)。您可以sysopen在perl中使用。如果您拥有受BSD启发的mktemp实用程序,它将使用O_NOFOLLOW; 原子地创建一个文件。chmod如果默认模式600不是正确的模式,则必须随后致电。


我当时正在写一个更详细的解释,但是维基百科的文章涵盖了所有内容。
jordanm 2012年

如果只有touch创建可执行文件的选项,那真的就是我想要的。然后umask可以用来定制细节。遗憾的是,无法使用umasktouch创建可执行文件。
quornian 2012年

@quornian无论如何,您都无法原子创建非空文件。原子地创建一个空的可执行文件有什么意义?使用touch后跟chmod +x
吉尔(Gilles)“所以,别再邪恶了”

4
您可以使用... ln或mv原子地创建非空的可执行文件。您始终可以在使用umask 077创建的目录中创建具有正确内容和权限的文件,然后将其移动或移入ln。
斯特凡Chazelas

-1

我的主目录/home/anthony/touchmod.sh中有一个bash脚本,其中包括:

#!/bin/bash

touch "$2"
chmod "$1" "$2"

因此,如果我需要readme.txt使用644权限进行创建,则可以输入:

~/touchmod.sh 644 readme.txt

3
您可能不理解该问题。这正是发问者试图避免的事情。
ceving
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.