我想要一个 Bash 单行程序,如果文件不存在,则自动创建文件。这本质上意味着“如果文件不存在,则创建它”,但要确保在执行 if 和创建文件之间的短暂时间内,没有其他人设法创建该文件。
答案1
窃取答案来自各种评论和链接到[SO]。似乎有一个POSIX 兼容方法这并不涉及mkdir
我在下面的原始答案中提到的
set -o noclobber # or set -C
{ > file ; } &> /dev/null
此重定向至文件如果文件已存在则返回 0 或失败并返回非零。
原始答案
您必须使用mkdir
- 这是原子的,要么创建目录并且您可以继续,要么不创建目录以便您采取适当的操作。
当然,mkdir
不会创建文件,但是一旦您知道您对该目录具有独占访问权限,那么您就可以在其中创建您想要的文件。
至于一行代码 - 我将把它留给你。我个人会把它写成几行,因为这样更易于维护。
答案2
试试这个。它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
答案3
它是文件还是目录?如果是文件,您可以使用简单的命令 touch - 如果文件存在,它只会修改上次访问时间。如果文件不存在,则创建。
答案4
如果你不关心文件名,你可以将此任务委托给实用程序,例如 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)