我写的一个脚本是为了将单独的日期目录从一个旧位置移动到一个新位置,其结构如下:
/old/YYYY/MM/DD
/new/YYYY/MM/DD
对于另一项任务(与数据移动无关),我在新位置创建了一个软链接(soft link),如下所示(这是我犯的第一个错误):
/new/2011/09 -> /old/2011/09
我的脚本基本使用了这个函数调用:
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() 没有给我一个错误,提示我移动的 day 目录已经存在?由于软链接(soft link),09 中的每一天都应该是相同的目录。 p>
/new/2011/09/01 == /old/2011/09/01
在调用 shutil.copy2 之前,shutil.move 调用不会检查 src 和 dst 吗? 来自文档:“目标目录必须不存在。”还是仅当它使用重命名时?并且如果它有所不同,旧的和新的位置都是 glusterfs。
感谢您提供的任何清晰信息。
编辑/更新:我向 python-list 提交了一个问题,询问为什么存在这种行为并询问是否应该更改它 (list archive)。他们建议我提交错误报告。在进行提交错误的测试时,我发现这已在 Python 2.7 中修复。您可以在移动函数声明中看到源代码中的差异:Python 2.6和 Python 2.7 .
这仍然会进行移动/重命名,但不会神奇地删除整个目录。
最佳答案
归结为 shutil.move 中的这两行:
copytree(src, real_dst, symlinks=True)
rmtree(src)
其中 src='old'
和 real_dst='new/old'
。 copytree
命令将old
复制到子目录new/old
。一切顺利,尽管它可能不是您想要的。
rmtree
删除旧
目录。这是个问题,因为 new
现在是悬空符号链接(symbolic link)。
关于 python shutil.move : odd softlinking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854608/