如果文件不存在,如何使追加到文件失败?

如果文件不存在,如何使追加到文件失败?

例如

echo Something >> SomeFile

我希望这个附加仅在已经存在的情况下才起作用SomeFile

现在我正在使用以下内容:

if [ -e SomeFile ]; then 
    echo Something >> SomeFile
fi; 

但这里应该有一个竞争条件。期间SomeFile可能存在 if 条件求值。上下文切换发生在 if 条件和追加之间。执行一些其他应用程序会删除SomeFile.在这种情况下,追加将创建SomeFile.

我需要一个同时适用于 bsd sed 和 gnu sed 的解决方案。


在 python 中执行此操作非常简单操作系统打开O_APPEND

$ rm SomeFile
$ python -c "import os; print(os.open(\"SomeFile\",os.O_APPEND))"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 'SomeFile'
$ touch SomeFile
$ python -c "import os; print(os.open(\"SomeFile\",os.O_APPEND))"
3

答案1

我认为这应该可以实现你想要的:

sed -i '' -e '$a\
Something\
' SomeFile

我使用 mac osx/bsd sed 执行此操作,因此您可以删除该-i ''部分。如果不存在,这将失败SomeFile,但需要注意的是,如果文件存在且为 0 字节,它也会失败,希望这对您来说不是一个大问题。

相关内容