假设我有两个硬链接文件:
-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手册页中有记录:
如果oldpath和newpath是引用相同硬链接的现有硬链接文件,则
rename()
不执行任何操作,并返回成功状态。
这也在POSIX:
中指定如果旧参数和新参数解析到相同的现有文件,
rename()
将成功返回并且不执行其他操作。