如果文件不存在,Bash单行可以自动创建文件


9

我想要一个Bash单行代码,如果不存在,它会自动创建一个文件。这实际上意味着“如果文件不存在,请创建它”,但要确保没有其他人可以在执行if和创建文件之间的狭小空间内创建文件。


抱歉,我在“原子上”读为“自动”。我删除了答案。
亚伦·科普利

Answers:


6

从各种评论和[SO]链接中窃取答案。似乎有一个不符合POSIX的方法mkdir正如我在下面的原始答案中提到的那样

set -o noclobber # or set -C
{ > file ; } &> /dev/null

重定向到文件返回0或失败,如果文件已经存在,则返回非零。


原始答案

您将不得不使用mkdir-这是原子的,或者目录已经创建并且可以继续,或者目录没有创建,所以您需要采取适当的措施。

当然,mkdir不创建文件,但是一旦您知道您对该目录具有独占访问权,就可以在其中创建所需的文件。

至于一支班轮-我会留给你。就个人而言,我会用几行内容编写它,因为这样可以更容易维护。


但是来自stackoverflow.com/q/13828544/1207760的 noclobber 更是OP想要的。
Law

总的来说,Noclobber是一个很好的答案。但是,它不适用于ksh88。
jrw32982在2013年

1
@JohnWiersba,但问题是关于bash。
womble

@womble是的,但是答案中提到了POSIX,有人可能认为POSIX适用于其他shell。Ksh88仍然是某些服务器上的标准外壳。
jrw32982在2013年

0

是文件还是目录?如果是文件,则可以使用简单的命令触摸-如果文件存在,则只需修改上次访问时间。如果文件不存在,则创建。


0

试试这个。在ln提供了检查并设置功能。

touch lock.$$.tmp
if ln lock.$$.tmp lock.dat 2>/dev/null
then
    echo "File is mine"
else
    echo "Test and set failed"
fi
rm -f lock.$$.tmp

0

如果您不关心文件名,则可以将此任务委托给实用程序,例如mktemp

Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied.  Files are created u+rw, and directories u+rwx, minus umask
restrictions.

调用:

filename=$(mktemp)
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.