[英]How to execute certain commands if a file does NOT exist?
我想检查文件是否存在,如果不存在,则创建它。
考虑使用以下C代码,但使用shell脚本。
if(!exist) {
command;
command;
}
else {
command;
command;
}
检查文件是否存在是一项非常常见的任务。 要搜索相关问题,请使用搜索栏(右上角)。 我用术语“bash脚本文件存在”得到了很多结果
在任何情况下,您都需要test
内置或其语义等价物[ ]
:
[ ! -e your_file ] && >your_file
要么
test ! -e your_file && >your_file
这将首先test
your_file
不存在( !
)(- -e
)并创建它(如果是这种情况)。
有关可以运行的不同测试的更多信息(除了-e
),您可以键入:
help -m test | less
你可以用这个:
if [ ! -e "$file" ]; then touch file else ... fi
不要这样做,它不仅受竞争条件的限制,而且[ -e /path/file ]
检查你是否可以对文件执行stat(2)
,因此它会因不同的原因返回false,不仅如此因为文件不能存在。
一个示例是不存在的文件的符号链接或您没有搜索权限的目录中的文件。
更好的方法是在这里使用open(2)
系统调用的正确标志,即O_CREAT|O_EXCL
。 这样,如果文件不存在, open()
失败,而您不必先检查数百万个CPU时钟周期。
使用类似Bourne的shell:
if (set -C && : > "$file") 2> /dev/null; then
print '%s\n' "$file has been created
else
print '%s\n' "It hasn't, possibly because it was already there"
fi
( set -C
是为了启用O_EXCL
标志)。
另外,为什么要创建一个空文件? 您可能希望在该文件中存储某些内容。 然后,就这样做:
set -C
{
echo blah
other-commands that-generate-the-content
} > "$file"
然后,只有在file
不存在的情况下才会执行该命令组(并且可以创建它)。
如果要测试文件是否存在,请至少写入:
[ -e "$file" ] || [ -L "$file" ]
要么
ls -d -- "$file" > /dev/null 2>&1
如果你关心它可能是一个符号链接。 如果文件确实存在但您无权对其进行验证,那么仍将返回false。
现在,如果您想要有关测试文件存在的更长且历史性的答案:
最初, test
命令(在它首次出现的Unix v7中) 没有-e
(也不是-h
/ -L
选项或-a
一元)选项。
测试文件存在的方法是使用ls
。 ls
(带-d
)列出文件并报告错误(并返回错误的退出状态),如果由于某种原因无法查找文件。 Unix最初没有符号链接,但是当它们被引入时, ls
被修改为对文件而不是stat(2)
执行lstat(2)
stat(2)
。 也就是说,在symlink ls
情况下, ls
返回有关符号链接文件本身的信息,而不是符号链接指向的路径上的文件。
test
(aka [
)测试文件“存在”的选项最初是在Korn shell test
内置中引入的。 那是-a
,而不是-e
。 -a
是可访问的 (我相信),这是一个比现有更准确的术语。
我不知道何时或什么介绍-e
,可能是POSIX。 POSIX 表示 -e
被选中-a
以避免与-a
二元运算符(for 和 )混淆。
在任何情况下, -a
和-e
都在文件上尝试stat(2)
,而不是lstat(2)
。 那是:
[ -e "$file" ]
相当于:
ls -Ld -- "$file" > /dev/null 2>&1
因此,严格地说,如果在测试完成时,可以在解析符号链接后查找路径,并且如果stat(2)
失败,则忽略失败的原因,它返回true。
如果文件不存在( ENOENT
),则stat
可能会失败,即文件不存在或存在但是对于不存在的文件的符号链接,但也有很多其他原因。 查看stat(2)
的可能错误代码可以提供一些想法:
EACCESS
:在解析路径期间(可以是任何路径组件和任何符号链接的路径),您没有一个目录组件的搜索权限(请注意,您可能仍然可以通过另一个路径访问该文件) 。 ELOOP
:无法解决这条路径,因为太多的符号链接已经解决了。 ENOTDIR
。 例如在/etc/passwd/foo
或它的符号链接上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.