Python shutil.move:奇数软链接
我编写的一个脚本旨在将单个日目录从一个旧位置移动到一个新位置,其结构如下:Python shutil.move:奇数软链接,python,linux,Python,Linux,我编写的一个脚本旨在将单个日目录从一个旧位置移动到一个新位置,其结构如下: /old/YYYY/MM/DD /新的/年/月/日 对于另一项任务(与数据移动无关),我在新位置创建了一个软链接,如下所示(这是我犯的第一个错误): 我的脚本essential使用了此函数调用: for d in os.listdir("/old/2011/09"): shutil.move(os.path.join("/old/2011/09/", d), os.path.join("/new/2011/09
/old/YYYY/MM/DD
/新的/年/月/日
对于另一项任务(与数据移动无关),我在新位置创建了一个软链接,如下所示(这是我犯的第一个错误):
我的脚本essential使用了此函数调用:
for d in os.listdir("/old/2011/09"):
shutil.move(os.path.join("/old/2011/09/", d), os.path.join("/new/2011/09", d))
在运行我的脚本2011/09之后,这两个版本都是空的。我在处理未归档数据时遇到过这种情况……这是个大问题我的问题是为什么shutil.move()没有告诉我一个错误,我正在移动的日期目录已经存在?由于软链接,09内的每一天都应该是同一个目录
/new/2011/09/01 == /old/2011/09/01
在调用shutil.copy2之前,shutil.move调用没有检查src和dst吗?来自文档:“目标目录必须不存在。”或者,这只是在它使用rename时?如果说这有什么不同的话,那么新老地点都是阴郁的
感谢您提供的任何清晰信息
编辑/更新:我向python列表提交了一个问题,询问为什么存在这种行为,并询问是否应该更改()。他们建议我提交一份bug报告。在进行提交bug的测试时,我发现在Python2.7中已经解决了这个问题。您可以在move函数声明中看到源代码中的差异:和
这仍然可以移动/重命名,但不会神奇地删除整个目录。它归结为以下两行: 其中
src='old'
和realdst='new/old'
。copytree
命令将old
复制到子目录new/old
。这很好,尽管这可能不是你想要的
rmtree
删除old
目录。这是一个问题,因为new
现在是一个悬空的符号链接。如果目标已经存在,但不是目录,它可能会被覆盖,具体取决于os.rename()语义。
您似乎必须自己检查文件是否存在。符号链接是月份,而不是日期。因此,真正的dst将变成/new/2011/09/01/01/,实际上是/old/2011/09/01/01/。因此,如果shutil.move使用realpath()而不是abspath()(在_destinsc中),我就不会丢失数据……或者我就不会傻到验证我在做我认为我在做的事情……或者我可以在创建完整路径时在脚本中使用realpath+1作为源代码的链接。
/new/2011/09/01 == /old/2011/09/01
copytree(src, real_dst, symlinks=True)
rmtree(src)