沉默的操作系统.重命名失败



假设我有两个硬链接文件:

-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 bar
-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 foo

然后,在python中运行:

>>> import os
>>> os.rename('foo', 'bar')

我没有得到错误。但是,再次列出目录,我仍然看到foo .

-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 bar
-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 foo

看起来这是发生的,因为文件确实是同一个文件(inode)。然而,我仍然希望foo被删除或出现错误。

有谁知道为什么这是无声失败?我的问题是关于实现本身,而不是如何解决问题(我使用os.path.samefile)。我用的是rhel 6.4

谢谢!

Python的os.rename函数只是执行rename系统调用。如果源文件和目标文件是同一个文件,则系统调用不会静默地执行任何操作。如果我运行C程序,我会得到与Python脚本相同的结果:

#include <stdio.h>
int main() {
    int result = rename("foo", "bar");
    printf("result = %dn", result);
}

打印result = 0并留下两个文件。

此行为在Linux手册页中有记录:

如果oldpathnewpath是引用相同硬链接的现有硬链接文件,则rename()不执行任何操作,并返回成功状态。

这也在POSIX:

中指定

如果参数和参数解析到相同的现有文件,rename()将成功返回并且不执行其他操作。

最新更新