繁体   English   中英

如果文件不存在,如何执行某些命令?

[英]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
if [ ! -e "$path" ]
then
    touch -- "$path"
fi

一个更简单的版本就是简单地touch -- "$path" - 它创建文件(如果它不存在),只是更新访问和修改时间(如果它存在)。 双短划线-- )确保您可以创建文件,即使它以短划线开头,并且$path周围的引号也是必需的。

不要这样做,它不仅受竞争条件的限制,而且[ -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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM